2017-01-23 26 views
10

爲了各種目的,我正在運行一個類文件。爲此,我正在使用JVMTI代理。我的方法是調用RetransformClasses函數來調用ClassFileLoadHook。該策略適用於所有在檢測時間之後有進一步調用的方法,因爲實際檢測發生在後續函數調用中,但對於在程序中沒有進一步調用功能的任何方法(例如main函數)不起作用。如何使用沒有進一步調用的JVMTI代理重新執行正在執行的方法?

我想在執行過程中實時檢測一個方法。我想要一些程序,如儀表代碼的On-Stack Replacement(OSR)。在JVMTI或其他方法中是否有任何策略? PS:我願意編輯/修補OpenJDK源代碼,如果可以幫助的話。

+0

我沒有得到:鑑於這樣一種方法將永遠不會**的事實;有什麼意義呢?我的意思是:當這種方法稍後被調用時,不是用來給你「洞察力」的工具;像何時調用該方法? – GhostCat

+0

就**性能測試**而言,您是正確的。我正在使用我的代碼來並行化一個方法中長時間運行的循環。所以如果你在'main'中有一個乏味的循環,我想用它來產生一些線程並加入em(如果它是可並行化的)。這就是爲什麼我遇到了檢測單個調用函數的原因。 –

+0

你看過javaagent嗎? –

回答

2

經過一番進一步的思考,我相信你要求什麼可能可能(也許!)在技術上是可能的;但需要很多努力;但在概念上這不是一個好方法。

假設您的要求實際上要儀器任何種類的應用程序,以便通過做「封面並行化下的」以提高其性能在你扔的。

所以,而不是一個真正的解決方案,我主要是有顧慮的列表:

  • 首先,如果你連想修改已經觸發當前執行方法,你不僅在談論儀表。你真正想要做的是提供你自己的「JIT」機制 - 而JVM JIT也在那裏,並且正在做它的工作。
  • 所以,如果你真的認真對待這件事,並且希望確保即使是任何main()中的內容都可以從您的優化中受益 - 那麼我認爲,從概念上講,您可以更好地設計和實現您自己的JVM。
  • 然後,我想知道:你說要覆蓋main()已經運行「長時間循環」的方法。這聽起來像你打算通過丟棄你的儀器來修復壞設計。我認爲更理智的做法是:看看這樣的應用程序,並且改進他們的設計
  • 從某種意義上說:如果任意應用程序的「並行化」將是「那麼容易」 - 它將成爲JVM的一部分。而事實並非如此。並且JVM不會進行這種優化是有原因的:它可能是超級難以獲得正確和健壯的。

換句話說:我你有一個XY問題;而X問題是你正在處理的應用程序可以從「並行化」中受益。但這是「一般」很難做到的事情。

從這個意義上說,我寧願定義某種架構(可能包含特定的,明確定義的應用程序應該如何「啓動」的步驟;以便您的儀器可以成功完成其工作),並首先獲得該方法的經驗。意思是:告訴你的人不要把「長時間運行的循環」置於他們的main()(如上所述;這對我來說聽起來像是非常糟糕的設計!)。

+0

或多或少。我主要關心的是利用java代碼中的隱式並行機制,假設我沒有應用程序的java源代碼。就分析而言,我分析了並行性的字節碼,並且完美地工作。顯然,分析真的很難,但這不是我主要關心的問題。我只是關心重新定義我的課程。我已經在課堂上課期間裝備我的課程,並且獲得了我期望的成績。現在我想使用JIT分析器爲我篩選一些熱點並僅對其進行並行處理。 –

+0

使用熱點的原因也很明顯。公理是:「每個循環都不值得並行化,只有熱點纔是。」牢記這一點,我自然傾向於在代碼中執行熱點。還有運行時動態檢測。 –

+1

*我分析字節碼的並行性和完美的作品* ...是一個非常大膽的聲明;-) ...我想知道你發現了什麼數量的人在這方面的研究,迄今爲止忽略了。 – GhostCat

相關問題