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

时间:2011-07-08 15:25:02

标签: java garbage-collection

垃圾回收日志中的“完整GC(系统)”条目是什么意思?有些类叫做System.gc()?

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

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

系统:

  

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

否-系统:

  

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选项

我们与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 个答案:

答案 0 :(得分: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 :(得分:1)

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

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