質問
プロファイリングの書き込みヒーププロファイリングの典型的なタスクも実装します。具体的には、追跡したいと思います。どのスレッドがデータを割り当てましたか? jvmtiを使用して、イベントにフックするだけで十分だと思いました VMオブジェクト割り当て と オブジェクトフリー. 。悲しいことに、私は最初のイベントがコールが行われたためにトリガーされていないことを読みました new
.
私が持っていた最後のアイデアは、イベントをチェックすることでした MethodExit その名前がある場合 <init>
したがって、この呼び出しをオブジェクト割り当てとして宣言します。ただし、このイベントではオブジェクトを取得できないため、呼び出すことができません GetObjectSize
.
ヒープを単に繰り返すだけで、どのオブジェクトがどのスレッドによって割り当てられたかに関する情報はありません。誰かがこれを実装する方法を考えていますか?
解決
あなたが呼ぶことができない理由はありますか? GetObjectSize
から MethodEntry
コンストラクターのイベント?
メソッドが返される前にコードを実行することに興味がある場合は、 MethodEntry
イベント、およびメソッドの名前が付けられている場合 <init>
, 、電話することができます NotifyFramePop
を聞くために FramePop
現在のフレームのイベント。このイベントはに似ています MethodExit
イベントですが、メソッドが戻る前に発生するので、 this
物体。
他のヒント
Hotspot VM(templatetable_x86_64.cpp)の_new実装を一目見たことは、_newがJVMTIのフックを提供していないことを示しているようです(ゆっくりとしたケースでもありません)。あなたのトリックが機能しない場合、私は他の可能性を見ません - しかし、私は決してJVMTIの専門家ではありません。
私はあなた自身のホットスポットVMを小さなパッチでコンパイルすることはあなたにとって特に役に立たないと思いますか?
これ Heaptrackerデモ ヒープ内のすべてのオブジェクトを追跡する方法を説明します。なぜなら vmobjectallocイベント 反射が発生した場合にのみ送信されますが、デモはByteCodeInstrumentを使用して新しいオブジェクト割り当てを追跡します。
GetCurrentThread関数を使用して、オブジェクトが属しているスレッドを知ることができます。