2011-06-16 47 views
3

編寫性能分析我也將執行堆性能分析的典型任務。具體我想跟蹤,哪個線程已經分配了多少數據?使用JVMTI我認爲這是足夠的鉤到事件VM對象分配對象免費。可悲的是,我讀到的第一個事件是由於撥打new而引發的。使用JVMTI跟蹤線程感知堆分配

我最後的想法是檢查事件MethodExit如果它的名字是<init>並且因此將此調用聲明爲對象分配。但是,在這個事件中,我無法獲得該對象,因此我無法調用GetObjectSize

只是遍歷堆,不知道哪個對象是由哪個線程分配的。有沒有人有一個想法如何實現這一點?

回答

2

是否有某些原因,您不能從MethodEntry事件中爲構造函數調用GetObjectSize

如果你有興趣在方法返回之前執行的代碼,那麼你就可以監聽MethodEntry事件,如果該方法被命名爲<init>,你可以調用NotifyFramePop來監聽FramePop事件當前幀。此事件與MethodExit事件類似,但在該方法返回之前發生,因此仍然可以獲取this對象。

2

快速瀏覽Hotspot虛擬機(templateTable_x86_64.cpp)的_new實現似乎表明,_new不提供JVMTI的任何掛鉤(即使在看起來很慢的情況下也是如此)。所以如果你的伎倆不起作用,我沒有看到任何其他的可能性 - 但我絕不是JVMTI的專家。

我假設用一個小補丁編譯自己的Hotspot虛擬機對你來說不是特別有用嗎?

+0

不,因爲我正在寫一個我自己的通用JVM分析器。儘管感謝您對此進行研究+1這只是證實了我的懷疑。 – 2011-06-16 02:00:57

2

heapTracker demo說明如何跟蹤堆中的所有對象。 由於僅在發生反射時才發送VMObjectAlloc Event,因此演示使用ByteCodeInstrument來跟蹤新的對象分配。


您可以使用getCurrentThread函數來知道對象屬於哪個線程。