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

use*_*465 23 java garbage-collection

垃圾收集日志中的"Full GC(System)"条目是什么意思?那个类叫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

提前致谢,

Pet*_*rey 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)";
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个自定义版本的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
Run Code Online (Sandbox Code Playgroud)