在Java 6中,我们过去使用以下GC配置来防止Perm Gen OutOfMemoryException
在我们的应用程序进行多次重新部署之后:
-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
我们正在转向Java 7,并希望使用新的G1 GC,从我所阅读的内容中,将类从Java内存中的PermGen移动到本机内存。
是否有一些标志可以卸载未使用的类?
答案 0 :(得分:8)
G1在Full GC期间执行类卸载,因此您无需指定任何参数来启用此功能。
您可以使用-XX:+TraceClassUnloading
参数自行查看。
另外,请查看HotSpot GC邮件列表中的此电子邮件主题:Bug in G1GC it performs Full GC when code cache is full resulting in overkill。他们讨论了G1中的类卸载问题。总之,如果您看到类卸载问题,则可以使用-noclassgc
,但通常G1中的类卸载没有问题。
答案 1 :(得分:0)
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也进行类卸载(使用CMSClassUnloadingEnabled开关),因此,如果仍然出现内存不足错误,将无济于事。