首页 文章

java垃圾收集日志条目“Full GC(System)”是否意味着一些名为System.gc()的类?

提问于
浏览
23

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

我的垃圾收集日志有两个不同的“完整gc”条目类型?一个用'System'这个词,另一个没有 . 有什么不同?

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

System:

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

No-System:

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

GC Options

我们与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

提前致谢,

2 回答

  • 16

    从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将要求此类确保GC在最后N秒内执行 . 如果没有GC则会触发完整的GC .

    如果减少次要GC的数量,这只会显示问题 . 讽刺的是,这意味着你可以获得更多的完整GC . ;)

    我不使用RMI(可能除了JConsole)所以我把它设置为一周 . (认为默认是一小时)

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

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

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

相关问题