2009-09-05 30 views
3

我想獲得對Java堆中所有對象的引用,即使我沒有立即引用我活動線程中的這些對象。我不需要非引用的對象(那些用於垃圾收集的「排隊」),但是想要獲得仍在使用中的任何東西。如何在沒有參考的情況下訪問Java堆對象?

目標是序列化並存儲所有對象以實現窮人的執行狀態持久性。我意識到,當涉及到不同類型的瞬變狀態時,兔子洞會變得很深,但只是持久對象加載的類定義對我來說會很有用。

有沒有辦法訪問堆以實現此目的?我是否忽視了更直接的方法?

+0

你在尋找獲得堆轉儲嗎?或者你想訪問永久代? – 2009-09-05 21:07:45

+0

我主要感興趣的是從堆中訪問對象(以編程方式!)。 PermGen會給我類型定義,這也是我感興趣的,但我試圖讓我的問題保持專注。 :-) – Greg 2009-09-05 21:16:55

回答

3

我想看看到了instrument包。儀器你感興趣的類,所以ctor註冊創建的實例。如果你不想使用java.lang.instrument,或者如果通過你可以控制的東西(一個IoC容器或工廠)創建對象,那麼你可以通過AspectJ來做到這一點,那麼你可以做一些不太神奇的東西。

+0

我喜歡這種方法,因爲它給我一個很好的鉤子來處理這些對象。謝謝。 – Greg 2009-09-06 03:38:03

0

我建議你拿heap dump然後用the Eclipse Memory Analyser檢查它。

可用視圖允許您深入查看實例級別的視圖對象屬性。您甚至可以使用OQL查詢對象 - 以及用於對象的類似SQL的查詢語言。

下面的截圖中的左側面板演示了檢查字段值。

screenshot http://img181.imageshack.us/img181/4013/dominatortreegrouped.png

+0

我假設他想通過代碼完成此操作。 – MattC 2009-09-05 21:08:00

+0

不過,這很酷。我必須檢查一下。 – MattC 2009-09-05 21:08:33

+1

同意MattC - 這是非常酷的東西,我想查看一下,但我主要關心如何通過代碼在同一個JVM中執行此操作。 – Greg 2009-09-05 21:18:00

1

如果您想以編程方式進行堆轉儲,則在java。*或javax。*命名空間中找不到合適的API。但是,Sun運行時帶有HotSpotDiagnosticMXBean,它使您能夠通過將堆的內容寫入磁盤中的指定文件來進行堆轉儲。

相關問題