【问题标题】:Does java garbage collection log entry "Full GC (System)" mean some class called System.gc()?java 垃圾收集日志条目“Full GC (System)”是否意味着某个名为 System.gc() 的类?
【发布时间】:2011-10-01 09:14:36
【问题描述】:

垃圾收集日志中的“Full GC (System)”条目是什么意思?那个叫 System.gc() 的类?

我的垃圾收集日志有两种不同的“完整 gc”条目类型?一个带有“系统”一词,另一个没有。有什么区别?

(更新:我搜索了这个词并没有找到明确的答案,只有几个问题。所以我想我会发布它。

系统:

164638.058:[Full GC (系统) [PSYoungGen:22789K->0K(992448K)] [PSOldGen: 1645508K->1666990K(2097152K)] 1668298K->1666990K(3089600K) [PSPermGen: 164914K->164914K(166720K)], 5.7499132 秒] [时间:用户=5.69 系统=0.06, 真实=5.75 秒]

无系统:

166687.013: [完整 GC [PSYoungGen: 126501K->0K(922048K)] [PSOldGen: 2063794K->1598637K(2097152K)] 2190295K->1598637K(3019200K) [PSPermGen: 165840K->164249K(166016K)], 6.8204928 秒] [时间:用户=6.80 系统=0.02, 真实=6.81 秒]

GC 选项

我们与 gc 相关的 java 内存选项有: -Xloggc:../server/pe/log/jvm_gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

我们不使用'-XX:+DisableExplicitGC',所以可能某些错误的类确实调用了 System.gc()

fwiw,我们完整的 jvm 选项:

-Xms3072m -Xmx3072m -XX:+HeapDumpOnOutOfMemoryError -XX:-UseGCOverheadLimit -Xloggc:../server/pe/log/jvm_gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MaxPermSize=256m -XX :+UseCompressedOops

提前致谢,

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    从 OpenJDK 的源代码我会说它是

    const bool is_system_gc = gc_cause == GCCause::_java_lang_system_gc;
    
    // This is useful for debugging but don't change the output the
    // the customer sees.
    const char* gc_cause_str = "Full GC";
    if (is_system_gc && PrintGCDetails) {
      gc_cause_str = "Full GC (System)";
    }
    

    我创建了一个自定义版本的 Runtime 类,以便在调用 Runtime.getRuntime().gc() 时将线程名称和堆栈跟踪记录到一个文件中。 (System.gc() 调用它)我发现它在追踪和删除此类调用者方面很有用。

    发生这种情况的一个地方是 sun.misc.GC 类。 RMI 将要求此类确保在最后 N 秒内执行了 GC。如果没有 GC,则会触发 full GC。

    这仅在您减少次要 GC 的数量时才会显示为问题。具有讽刺意味的是,这可能意味着您获得更多完整的 GC。 ;)

    我不使用 RMI(也许 JConsole 除外)所以我将它设置为一周。 (认为​​默认是一个小时)

    -Dsun.rmi.dgc.server.gcInterval=604800000
    -Dsun.rmi.dgc.client.gcInterval=604800000
    

    【讨论】:

    • _java_lang_system_gc 看起来很接近 java.lang.System.gc()。 ""简单明了"。
    • 如果不阅读所有代码,我会说这是一个安全的选择。我已经在我的回答中添加了如何检测触发此完整 GC 的原因以及可能是什么原因以及如何解决它。
    【解决方案2】:

    我在我的 mac 上测试显式 GC,它在使用 jdk 1.6 时确实显示“Full GC (System)”,但在 jdk 1.7 上显示“Full GC”

    所以在调整 GC 日志时不要依赖“系统”标签,除非您确切了解运行环境和 jdk 版本号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多