2011-06-03 69 views
1

使用由JVMTI提供的MethodEntryMethodExit事件掛鉤如何測量在Java中執行的方法的時間?使用JVMTI執行測量方法

簡單的說就是:time2 - time1但是我看到的問題,如何區分不同的方法?有一個methodID,但遞歸調用呢?打開方法後何時關閉?

我應該比較堆棧跟蹤嗎?什麼是有意義的數據結構來追蹤進入的方法?喜歡的東西Map<StackTrace,Time>?

回答

5

您將需要一個堆棧每個線程,並與每MethodEnter你推堆棧上的時間戳和MethodExit你彈出的時間戳和計算差值爲當前時間。

雖然您應該記住,閱讀時間戳或tickcounts以及周圍的邏輯是相對耗時的。如果你在某種分析器中使用類似的東西,你會得到一些結果,使小的快速方法看起來非常昂貴。即一個ByteBuffer.get()可能執行的速度至少比您的測量代碼快10倍。加上JVMTI處於活動狀態時由於JIT編譯有限導致的失真,這些方法在收集的數據中可能會比在正常情況下更容易出現100倍。獲得方法的執行時間份額的有用數據的唯一方法是使用採樣。

+0

謝謝,這是一個非常有用的答案。使用這種測量時間的方法對我來說是衆所周知的,這完全沒問題。我可能會放棄顯示時間,但只顯示與所有其他執行相比的總體百分比。 – 2011-06-03 16:38:23