【问题标题】:Class Unloading in Java's G1 Garbage Collector (G1GC)Java 的 G1 垃圾收集器 (G1GC) 中的类卸载
【发布时间】:2013-09-23 13:27:23
【问题描述】:

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

-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

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

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

【问题讨论】:

    标签: java garbage-collection g1gc


    【解决方案1】:

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

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

    另外,请查看 HotSpot GC 邮件列表中的此电子邮件线程:Bug in G1GC it performs Full GC when code cache is full resulting in overkill。他们非常广泛地讨论了 G1 中的类卸载。总之,如果您发现类卸载问题但通常在 G1 中类卸载没有问题,您可以使用-noclassgc

    【讨论】:

      【解决方案2】:

      G1 在 Remark 阶段执行类卸载,即 stop-the-world:

      [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 将 Permgen 替换为 Metaspace,并且 CMS 也执行类卸载(使用开关 CMSClassUnloadingEnabled),因此如果您仍然遇到内存不足错误,它将无济于事。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-24
        • 2018-12-30
        • 2011-03-18
        • 1970-01-01
        • 2016-05-27
        • 2019-02-08
        • 2014-02-19
        • 2018-11-24
        相关资源
        最近更新 更多