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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java G1垃圾收集器中的类卸载(G1GC)相关的知识,希望对你有一定的参考价值。

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

-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

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

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

答案

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中没有类卸载问题。

另一答案

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]

请注意,使用Metaspace替换Permgen是Java 8,并且CMS也会进行类卸载(使用交换机CMSClassUnloadingEnabled),因此如果仍然存在Out of Memory错误,则无效。

以上是关于Java G1垃圾收集器中的类卸载(G1GC)的主要内容,如果未能解决你的问题,请参考以下文章

搞懂G1垃圾收集器

GC垃圾回收 | 深入理解G1垃圾收集器和GC日志

jdk11新特性——支持G1上的并行完全垃圾收集

jdk11新特性——支持G1上的并行完全垃圾收集

Java Hotspot G1 GC的一些关键技术

GC垃圾回收(3)- 三色标记算法