3

プロファイリングの作成 ヒープ プロファイリングの典型的なタスクも実装します。具体的には、どのスレッドがどのくらいのデータを割り当てたかを追跡したいと思います。JVMTI を使用して、イベントVM Object AllocationおよびObject Freeにフックするだけで十分だと思いました。悲しいことに、への呼び出しが原因で最初のイベントがトリガーされないことを読みましたnew

私が最後に考えたのは、イベントMethodExitの名前が<init>であるかどうかをチェックし、この呼び出しをオブジェクト割り当てとして宣言することでした。ただし、このイベント内ではオブジェクトを取得できないため、呼び出すことができませんGetObjectSize

ヒープを単純に反復するだけでは、どのオブジェクトがどのスレッドによって割り当てられたかに関する情報はありません。これを実装する方法を知っている人はいますか?

4

3 に答える 3

3

Hotspot VM の _new 実装 (templateTable_x86_64.cpp) をざっと見てみると、_new が JVMTI 用のフックを提供していないことがわかります (遅い場合でも)。したがって、あなたのトリックが機能しない場合、他に可能性はないと思いますが、私は決して JVMTI の専門家ではありません。

小さなパッチを適用して独自の Hotspot VM をコンパイルすることは、特に役に立たないと思いますか?

于 2011-06-16T01:52:05.773 に答える
3

このheapTracker デモは、ヒープ内のすべてのオブジェクトを追跡する方法を示しています。VMObjectAlloc イベントはリフレクションが発生したときにのみ送信されるため、デモでは ByteCodeInstrument を使用して新しいオブジェクトの割り当てを追跡します。


getCurrentThread 関数を使用して、オブジェクトがどのスレッドに属しているかを知ることができます。

于 2014-12-02T08:34:16.690 に答える
2

コンストラクターのイベントGetObjectSizeから呼び出せない理由はありますか?MethodEntry

メソッドが戻る前にコードを実行することに関心がある場合は、MethodEntryイベントをリッスンできます。メソッドの名前が の<init>場合は、呼び出して現在のフレームNotifyFramePopのイベントをリッスンできます。FramePopこのイベントはイベントに似てMethodExitいますが、メソッドが戻る前に発生するため、引き続きオブジェクトを取得できthisます。

于 2011-09-08T22:45:16.130 に答える