2011-05-11 51 views
1

對於我使用JVMTI執行的分析器,我想開始測量所有Java方法的執行時間。該JVMTI提供的事件:使用JVMTI測量Java的執行時間

啓用方法:

  • MethodEntry
  • MethodExit

因此,這將是很容易實現,但是我碰到這個note API中來進入或退出事件將顯着降低許多平臺的性能,因此不建議用於性能關鍵用途(例如性能分析)。在這些情況下應該使用字節碼檢測。

但是我的分析代理工作無頭,這意味着收集的數據被序列化並通過套接字發送到顯示結果的服務器應用程序。我應該如何使用字節碼檢測來實現這一點。我有點困惑如何從這裏繼續。有人能向我解釋,如果我必須改變策略,或者我該如何解決這個問題?

+0

聽起來你想創建你自己的分析器。我建議你看看現有的配置文件如何工作,如VisualVM和YourKit工作,看看他們是否不做你已經需要的。 – 2011-05-11 10:47:55

+0

他們這樣做,我只是想自己做。但VisualVM可能是一個暗示,看看他們是怎麼做的,但我的教育猜測是他們使用Java代理而不是本地代理。 – 2011-05-11 10:57:23

+0

VisualVM使用可以獲取源代碼的Java代理。 YourKit使用您無法獲取源代碼的本地代理。記錄數據並不像獲得正確的數據可視化那麼難。我會看看YourKit如何實現其可視化。 – 2011-05-11 10:58:42

回答

1

我不知道Sun JVM,但當您請求MethodEntry/Exit事件時,IBM JVM會進入我們所說的FullSpeedDebug模式.... FSD會降低執行速度。

正如你所說,你可以使用BCI作爲我的分析器,但除非你有選擇性地測試你使用哪種方法,否則你也會看到一個減速。例如,我的分析器會在每個條目上插入if(profiling)callProfilerHook(),並在所有對象創建的方法中以及其他一些區域中插入所有可能的退出....這些額外的檢查可能會使執行速度減慢超過50%。 ..

至於如何BCI ......以及我寫了我自己的C庫來做到這一點...這在技術上不難(提示只是刪除StackMapTable),但我可能會帶你一段時間..或者,你可以使用ASM等。人。

最後......你調用BackHook會增加開銷,並且小方法會使報告的CPU /時鐘時間毫無意義,除非你執行一些複雜的開銷計算......即使你這樣做,你的回調代碼也會影響處理器L1的形狀緩存和Java代碼變得效率較低,因爲它有更少的空間..

我的分析器基本上忽略了報告的時間,因爲我以有趣的方式可視化執行...我期待了解所有的流程代碼,事實上在大多數情況下代碼運行的是什麼(大多數Java項目不知道在他們的應用程序中運行第三方代碼的數百萬)

+0

嘿,那裏,再次感謝您在這裏的另一個問題在stackoverflow給我的建議,它真的讓我的項目滾動。我真的很喜歡你的論證,我認爲這是我將要談到的一點。因爲我想測量花費的最多時間,而不是確切需要多長時間。所以你可以說,MethodEntry和MethodExit仍然可用?順便說一下,我的項目現在可以在以下網址找到:https://github.com/platzhirsch/Profiling-Concurrency – 2011-05-11 11:40:27

+0

Boost和protobuf ...優秀的選擇....稍後將構建它 – 2011-05-11 19:30:35