2011-09-21 91 views
5

請問,有沒有辦法如何獲取已在Java中進行垃圾收集的對象(它們的變量或至少是類名)的歷史記錄?如何查看哪些對象在Java中被垃圾收集?

只需添加這些PARAMS(甲骨文JVM)

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

不以字節爲單位提供別的記憶。這對我來說幫助非常有限。感謝所有迴應。

注意:添加finilize()方法的解決方法對我來說並不是一個不幸的選擇(我沒有權限訪問它)。

回答

3

免責聲明:我公司開發了我在這個答案中推薦的工具。

JProfiler中,您可以轉到內存部分的「記錄對象」視圖,並將活動模式切換爲垃圾收集對象(視圖 - >更改活動模式 - >垃圾收集對象)。然後你會看到一個已經被GCed過的對象的統計信息。

enter image description here

+1

謝謝。 JProfiler看起來很棒但是450€太貴了 –

+0

有沒有什麼辦法以編程的方式列出這些類?我正在瀏覽java.lang.Management包,但它只能返回計數。 – meexplorer

+0

你的意思是在JProfiler或JDK MBean中? –

3

您可以使用Objectfinalize方法。當對象即將被GCed時,這個方法被調用。從這裏,你可以記錄你所需要的信息。

0

您是否在尋找內存泄漏?

如果您實施finalize()方法(每Object中都有),它將在對象被垃圾收集之前調用 - 並且您可以在其中運行任何代碼。

如果您正在尋找一個系統化的解決方案(或者您無法訪問想要監視的類),我不知道任何允許這樣做的JVM選項。然而你可以日誌類被加載和卸載(GCed),但這不是你要求的。

-2

有一個在JDK中運行時觀察JVM的一個很好的內置工具。這是jvisualvm。有一個很好的參考與截屏:http://visualvm.java.net/description.html

這裏就是其中之一: enter image description here

希望有所幫助。

+1

jprofiler是一個功能非常強大且常用的工具,但它僅對開源和免費標準許可證單實例花費真實資金 - 500美元。這可能是一些項目的問題。 – BrownFurSeal

+1

我知道並使用VisualVM,但不支持查看垃圾收集對象。 –

+0

這是一個有用的工具,但它不能回答這個特殊的需求。 –