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