2016-02-22 17 views
1

除了堆轉儲中的信息之外,我還需要通過JVMTI獲取有關設置爲對象的潛在標記的信息。理想情況下,這些值應該與其他實例信息一起直接存儲在堆轉儲中,但似乎不支持。或者任何人都知道的方式?堆轉儲或單獨映射文件中的JVMTI標記

或者我在考慮一個映射文件,該文件包含從堆轉儲映射到相應的對象id的映射文件(如果沒有記錯的話,是轉儲創建時對象的內存地址) 。如果虛擬機將被暫停,我可以採取轉儲創建,標記對象並在虛擬機繼續之前寫入該映射。雖然看起來不是最好的方法。任何其他想法?

任何想法如何/我在哪裏可以訪問除jvmtis getTag(object)方法以外的標記信息?

回答

0

您應該檢查在docs:

標籤是本地的(JVMTI)環境;也就是說,一個環境的標籤在另一個環境中不可見。

映射表將是你最好的選擇。

+0

感謝您的回答。絕對正確。希望有我監督過的事情。使用映射表的想法也可能有問題。整個操作(1.標記對象,2.創建堆轉儲,然後3.創建映射文件)將不會是原子的。從理論上講,這些物體可能會在我擔心的2到3之間的記憶中移動。你知道如何防止這種情況發生嗎?我絕對可以掛起所有的線程,但這不會阻止GC移動東西(儘管不會產生新的垃圾)。 –

+0

由於我不能在遍歷堆的時候在一個回調中完成所有這些操作(它確保在執行這些函數的過程中堆的狀態不會改變),我不確定映射文件的可靠性。 –

+0

你打算實現什麼目標?我想這是你是否要走正確道路的問題。如果是這樣,無論需要什麼「黑客」,都要遵循它的結論。否則可能會有其他選擇。 –