2011-06-01 41 views
2

我在我们的gc-log中看到了明确的gc调用(见下文)。我可以用-XX:+ DisableExplicitGC删除调用,但我真的想知道哪个代码/库调用System.gc()在已编译库中查找System.gc()

有关如何追踪它的任何提示?

2011-05-30T12:21:48.230+0200: 1.672: [Full GC (System) 1.672: [CMS: 0K->2227K(2868864K), 0.0862299 secs] 62069K->2227K(3118080K), [CMS Perm : 12899K->12893K(409600K)], 0.0863197 secs] [Times: user=0.06 sys=0.03, real=0.09 secs]
+2

我刚刚开始在调试器的应用程序,把一个方法断点'的System.gc()'(和'Runtime.gc()'只是要确定)。 – 2011-06-01 07:46:57

+0

调试是一个非常好的和简单的建议。 – jakeri 2011-06-03 05:28:12

回答

2

我创建了一个System类的自定义版本,该类在调用System.gc()时将一个堆栈跟踪写入文件。这将允许你跟踪所有被调用的地方。

这将在包括JDK的系统中的任何地方找到调用。

您可以调用System.gc()的一个地方是在RMI模块中,以帮助查找丢弃的远程对象。您可以减少将如何常说的全GC与

-Dsun.rmi.dgc.server.gcInterval=86400000 
-Dsun.rmi.dgc.client.gcInterval=86400000 
0

使用分析器。现代分析器中的任何一个都可以帮助你找到它。

2

我会用FindBugs。这是一个神话般的工具,它有一个明确的垃圾收集调用的内置规则。

+0

findbugs的+1,即使调试模式在这里也足够了。 – Agemen 2011-06-01 09:53:44