小编典典

JVM 标志 CMSClassUnloadingEnabled 实际上是做什么的?

all

CMSClassUnloadingEnabled除了一些非常模糊的高级定义,例如“摆脱你的 PermGen
问题”,之外,我一辈子都找不到 Java VM 标志实际作用的定义。

我查看了 Sun 的/Oracle 的网站,甚至选项列表实际上并没有说明它的作用。

根据标志的名称,我猜测 CMS 垃圾收集器默认情况下不会卸载类,并且此标志将其打开 - 但我不能确定。


阅读 59

收藏
2022-07-28

共1个答案

小编典典

对于 Java 5-7:

标准的 Oracle/Sun VM
对世界的看法是:类是永恒的。所以一旦加载,即使没有人关心,它们也会留在内存中。这通常没有问题,因为您没有那么多纯粹的“设置”类(=
一次用于设置,然后不再使用)。因此,即使它们占用 1MB,谁在乎。

但最近,我们有了像 Groovy 这样的语言,它们在运行时定义类。每次运行脚本时,都会创建一个(或多个)新类,并且它们会永远保留在 PermGen
中。如果您正在运行服务器,则意味着您有内存泄漏。

如果您启用CMSClassUnloadingEnabledGC,也会清除 PermGen,并删除不再使用的类。

[编辑] 您还必须启用UseConcMarkSweepGC

2022-07-28