簡體   English   中英

使用JVMTI測量Java的執行時間

[英]Measure execution time of Java with JVMTI

對於我使用JVMTI實現的探查器,我想開始衡量所有Java方法的執行時間。 JVMTI提供以下事件:

  • MethodEntry
  • MethodExit

因此,這很容易實現,但是我在API中遇到了此注釋

啟用方法進入或退出事件將顯着降低許多平台上的性能,因此建議不要將其用於對性能有嚴格要求的應用程序(如性能分析)。 在這些情況下,應使用字節碼檢測。

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

我不了解Sun JVM,但是當您請求MethodEntry / Exit事件時,IBM JVM進入了我們所謂的FullSpeedDebug模式。...FSD大大降低了執行速度。

就像您說的那樣,您可以像我的探查器一樣使用BCI,但是除非您有選擇地選擇使用哪種方法,否則還會看到速度變慢。 例如,我的探查器在每個條目和所有對象創建的方法以及其他一些區域的所有可能的出口上插入if(profiling)callProfilerHook(),...這些額外的檢查可能會使執行速度降低50%以上。 ..

至於如何BCI ...好吧,我寫了我自己的C庫來做...在技術上並不難(僅刪除StackMapTable就可以了,但是我可能要花點時間。)或者,您也可以使用ASM等。

最終... callBackHook將增加開銷,並且在小型方法上使報告的CPU /時鍾時間變得毫無意義,除非您執行一些復雜的開銷計算...即使執行此操作,您的回調代碼也會影響處理器L1緩存和Java的形狀代碼的效率降低,因為它的空間較小。

當我以一種有趣的方式可視化執行時,我的探查器基本上會忽略報告的時間...我希望了解所有代碼的流程,實際上在大多數情況下,正在運行什么代碼(大多數Java項目都不知道在其應用中運行的數百萬行第三方代碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM