2013-04-11 53 views
2

我觀察到「完整的GC(系統)」消息每60分鐘寫入我的日誌。當我這樣做:如何將Runtime.gc()替換爲我自己的實現?

jstat -gccause {pid} 5s 

我看到這是來自顯式調用System.gc()。我試圖追查什麼代碼調用System.gc(),因爲我懷疑這是發生在我的一個依賴關係中,而不是我自己的代碼。

我知道我可以通過-XX:-DisableExplicitGC禁用顯式的GC調用,但我需要弄清楚調用來自哪裏。我已閱讀hereherethis guy能夠在調用gc()時更改Runtime類以記錄堆棧跟蹤。但我不清楚如何做到這一點。有人能指引我朝着正確的方向嗎?

+2

彼得闡述瞭如何做到這一點的http://stackoverflow.com/a/6870907/367273 – NPE 2013-04-11 20:12:31

回答

2

獲取Runtime.java的源代碼,並將代碼添加到GC()方法:

try { 
    throw new Exception("Who is the GC culprit?"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

後您編譯類中,更新與新的類文件rt.jar中。

0

也許獲取調用gc()的代碼的最簡單方法是將應用程序代碼放在IDE中(eclipse或idea ..)下載所有源代碼(如果使用maven管理您的lib,它可能很簡單)並找到引用System.gc()或Runtime.getRuntime.gc()。

0

您的應用程序是通過RMI訪問/訪問其他應用程序嗎?使用遠程方法調用,您將運行到RMI的分佈式垃圾收集(DGC),這基本上是這樣的:RMI定期對System.gc()進行調用。

對於客戶端,每隔${sun.rmi.dgc.client.gcInterval} ms觸發一次Full GC。 對於服務器,每隔${sun.rmi.dgc.server.gcInterval}毫秒觸發一次完整GC。

根據JDK的版本,這些時間間隔的默認值有所不同。它曾經是每分鐘一次(是啊......),但每30分鐘更換一次。如果您設置了這些環境變量,則可能有不同的值,例如,每小時一次如果您設置了-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000

來源:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#other_considerations

相關問題