CMSClassUnloadingEnabled除了一些非常模糊的高级定义,例如“摆脱你的 PermGen 问题”,之外,我一辈子都找不到 Java VM 标志实际作用的定义。
CMSClassUnloadingEnabled
我查看了 Sun 的/Oracle 的网站,甚至选项列表实际上并没有说明它的作用。
根据标志的名称,我猜测 CMS 垃圾收集器默认情况下不会卸载类,并且此标志将其打开 - 但我不能确定。
对于 Java 5-7:
标准的 Oracle/Sun VM 对世界的看法是:类是永恒的。所以一旦加载,即使没有人关心,它们也会留在内存中。这通常没有问题,因为您没有那么多纯粹的“设置”类(= 一次用于设置,然后不再使用)。因此,即使它们占用 1MB,谁在乎。
但最近,我们有了像 Groovy 这样的语言,它们在运行时定义类。每次运行脚本时,都会创建一个(或多个)新类,并且它们会永远保留在 PermGen 中。如果您正在运行服务器,则意味着您有内存泄漏。
如果您启用CMSClassUnloadingEnabledGC,也会清除 PermGen,并删除不再使用的类。
[编辑] 您还必须启用UseConcMarkSweepGC
UseConcMarkSweepGC