2011-06-01 40 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