Java 的 G1 垃圾收集器 (G1GC) 中的类卸载



在Java 6中,我们曾经使用以下GC配置来防止在多次重新部署应用程序后Perm Gen OutOfMemoryException

-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

我们正在迁移到Java 7,并希望使用新的G1 GC,根据我所读到的内容,它将类从Java内存中的PermGen移动到本机内存。

是否有一些标志可以启用卸载未使用的类?

G1 在完整 GC 期间执行类卸载,因此您无需指定任何参数即可启用此功能。

您可以使用 -XX:+TraceClassUnloading 参数亲自查看。

另外,请查看HotSpot GC邮件列表中的此电子邮件线程: G1GC中的错误 当代码缓存已满时,它会执行完整GC,从而导致矫枉过正。他们在 G1 中广泛地讨论了类卸载。总之,如果您看到类卸载问题,您可以使用 -noclassgc,但通常 G1 中的类卸载没有问题。

G1 在备注阶段执行类卸载,即停止世界:

[GC remark 2019-03-26T14:27:52.926+0000: 18.798: [Finalize Marking, 0.0004509 secs] 2019-03-26T14:27:52.926+0000: 18.799: [GC ref-proc, 0.0002791 secs] 2019-03-26T14:27:52.926+0000: 18.799: [Unloading, 0.0058844 secs], 0.0073053 secs]

请注意,是Java 8用Metaspace替换了Permgen,并且CMS也执行类卸载(使用开关CMSClassUnloadEnabled),因此如果您仍然遇到内存不足错误,它将无济于事。

最新更新