我想獲得對Java堆中所有對象的引用,即使我沒有立即引用我活動線程中的這些對象。我不需要非引用的對象(那些用於垃圾收集的「排隊」),但是想要獲得仍在使用中的任何東西。如何在沒有參考的情況下訪問Java堆對象?
目標是序列化並存儲所有對象以實現窮人的執行狀態持久性。我意識到,當涉及到不同類型的瞬變狀態時,兔子洞會變得很深,但只是持久對象加載的類定義對我來說會很有用。
有沒有辦法訪問堆以實現此目的?我是否忽視了更直接的方法?
我想獲得對Java堆中所有對象的引用,即使我沒有立即引用我活動線程中的這些對象。我不需要非引用的對象(那些用於垃圾收集的「排隊」),但是想要獲得仍在使用中的任何東西。如何在沒有參考的情況下訪問Java堆對象?
目標是序列化並存儲所有對象以實現窮人的執行狀態持久性。我意識到,當涉及到不同類型的瞬變狀態時,兔子洞會變得很深,但只是持久對象加載的類定義對我來說會很有用。
有沒有辦法訪問堆以實現此目的?我是否忽視了更直接的方法?
我想看看到了instrument包。儀器你感興趣的類,所以ctor註冊創建的實例。如果你不想使用java.lang.instrument,或者如果通過你可以控制的東西(一個IoC容器或工廠)創建對象,那麼你可以通過AspectJ來做到這一點,那麼你可以做一些不太神奇的東西。
我喜歡這種方法,因爲它給我一個很好的鉤子來處理這些對象。謝謝。 – Greg 2009-09-06 03:38:03
我建議你拿heap dump然後用the Eclipse Memory Analyser檢查它。
可用視圖允許您深入查看實例級別的視圖對象屬性。您甚至可以使用OQL
查詢對象 - 以及用於對象的類似SQL的查詢語言。
下面的截圖中的左側面板演示了檢查字段值。
screenshot http://img181.imageshack.us/img181/4013/dominatortreegrouped.png
如果您想以編程方式進行堆轉儲,則在java。*或javax。*命名空間中找不到合適的API。但是,Sun運行時帶有HotSpotDiagnosticMXBean,它使您能夠通過將堆的內容寫入磁盤中的指定文件來進行堆轉儲。
你在尋找獲得堆轉儲嗎?或者你想訪問永久代? – 2009-09-05 21:07:45
我主要感興趣的是從堆中訪問對象(以編程方式!)。 PermGen會給我類型定義,這也是我感興趣的,但我試圖讓我的問題保持專注。 :-) – Greg 2009-09-05 21:16:55