問題タブ [jvmti]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - JVMTIのMethodEntry/MethodExit内のjobjectを取得します
メソッドエントリまたはメソッド終了イベントがトリガーされたときに現在のジョブジェクトを取得することは可能ですか?特定のメソッドで入力されたジョブジェクトにタグを付けたいと思います。現在、クラスを定義するメソッドのみを取得できますが、オブジェクトは取得できません。
JVMTI APIには、類似したものは何も見つかりません。
ヒープ内のクラスを定義するメソッドのすべてのインスタンスを反復処理することはできますが、これでは、メソッドが正確に呼び出されたオブジェクトに関する情報は得られません。
java - JVMTIでロックイベントを追跡する方法
JVMTIは、イベントを提供しContendedMonitorEnter
、ContendedMonitorEntered
の使用に関連するイベントを検出しますsynchronized
。synchronized
ReentrantLock以外の何物でもありません。
ここで、ロック構造に関連するイベントも追跡したいと思いますReentrantLock
。lock()
そのunlock()
イベントのメソッドの開始/終了にフックすることができます。ただし、これらのイベントフックは、呼び出されたオブジェクトに関する情報を提供しません。したがって、異なるものを区別できずReentrantLock
、したがって、現在ロックされているロックに関する情報をログに記録できません。
これを追跡する他の方法はありますか?
java - JVMのlsof対応物?
lsof
はUnixの優れたツールであり、現在開いているすべてのファイルハンドルを表示します。
実行中のJVM内で開いているすべてのファイルを(JVMTIまたは同様のインターフェイスを介して)表示する同様のツールを知っている人はいますか?
この特定のケースでは、どのクラスがハンドルを開いているかを知るだけで十分です。メソッド/ラインまたはGCルートへのチェーン全体でさえ素晴らしいでしょうが、ハンドラー所有者クラスはすでに良いスタートです。
ヒープダンプを作成し、プロファイラーで開いてこれを見つけることができることはわかっていますが、これは、特に大きなヒープの場合、面倒な作業です。
java - Java プログラムで読み取りと書き込みをキャッチするにはどうすればよいですか?
Java プログラムによるすべての読み取りと書き込みをキャプチャできるツールを作成しようとしています。また、どのオブジェクトのどのフィールドがアクセス/変更されているかを知りたいです。
私は現在見ました: -
1) java.lang.instrument 私はそれで多くを行うことができませんでした. 実行中のプログラムにアクセスし、さまざまなオブジェクト/フィールドおよび関連するものに監視を作成できるエージェントを作成する方法を理解できませんでした。そのあたりの意見や情報があればよろしくお願いします。
2) jvmti jvmti を見て、jvmti ツールを作成しようとしましたが、オブジェクトを取得するには、JVMTI_EVENT_OBJECT_ALLOC が潜在的な機能である必要があることがわかりました。しかし、私はそうではないと考えました。さらに、このイベントは新しいコマンドに対して呼び出されないことを読みました。したがって、現時点では、これも当てはまらないようです。
それで、上記の方法またはあなたが知っているかもしれない他のテクニック/ツールを使用して、私がやりたいことを行う方法を知っているかどうか知りたいですか?
注: アプリケーションのソース コードにアクセスできません。私が持っているのはクラスファイルだけです。
java - JVMTI - コールバックからメソッド パラメータの値を取得する方法
JVMTI エージェントのおかげで、Java アプリからのすべてのメソッド エントリを記録しています。今のところ、各メソッドの名前を取得できますが、メソッドが受け取ったパラメーターの値を取得できるようにしたいと考えています。
この問題は、以前のトピックで既に説明されています ( MethodEntry コールバックでパラメーター値を取得する方法を参照してください)。探しているものに完全に適合するため、GetLocalObject 関数を使用する必要があることはわかっていますが、その方法がわかりません (トピックに示されている例は壊れています)。
これを行う方法を見つけるのを手伝ってくれる人はいますか? ありがとう。
java - JVMTI 呼び出されたクラス/ファイルの名前を取得
jvmti のドキュメント全体を読み込もうとしましたが、問題の解決策が見つかりませんでした。
プログラムを呼び出すためにコマンドラインで使用されるクラス/ファイルの名前を取得したい:
大文字で < calledJavaProgram > の名前を取得したい。
GetSourceFileName(jclass klass,...) は、パラメーターリストに設定されている「klass」の名前のみを取得しますが、プログラムを開始して以来、これもわかりません...そうですか?
この名前を取得する (他の) 方法はありますか?
あなたの助けのためのThx Markus G.
.net - .NET に相当する JVMTI
JVMTI が Java アプリケーションに対して持っているのと同じ機能を .NET アプリケーションを監視するために持っている Microsoft API を探しています。たとえば、すべてのメソッド呼び出しとそれにかかった時間を確認できるようにしたいと考えています (JVMTI を使用する Java アプリケーションでそれを行うことができます)。ご協力ありがとうございました。
bytecode-manipulation - バイト コード インストルメンテーション - ネイティブまたは Java エージェントを実装しますか?
バイト コード インストルメンテーションを使用してプロファイラーを実現したい場合、 JVMTIを使用してネイティブ エージェントを作成する必要がありますか、それともパッケージを使用してJava エージェントを作成する必要がありますか?java.lang.instrument
ASMのようなライブラリを使用したい場合 (本格的なプロファイラーを作成する場合は必須のようです)、Java エージェントを使用する必要があります。ネイティブ エージェントは Java エージェントができることすべてを実行できると思っていたので、これは私を混乱させます。しかし、私には、Java エージェントを作成する方が簡単に思えます。
代替手段はありますか?とにかくJavaエージェントとネイティブエージェントを組み合わせて使用する必要がありますか?
java - JVMTI エージェントがクラッシュする
私は JVMTI エージェントとして消しゴムのデータ競合検出アルゴリズムの実装に取り組んでいます。サンプル入力を実行してコードをテストしようとすると、JVM がクラッシュし、次のようなダンプが表示されます (同じエラーの他のスタック トレースも表示される場合があります)。
FATAL ERROR in native method: Using JNIEnv in the wrong thread
at Proxy.monitor_enter_(Native Method)
at Proxy.monitor_enter(Proxy.java:30)
at ex1.LifeThreads.setNeighborThreadChange(LifeThreads.java:36)
at ex1.LifeThreads.neighbor(LifeThreads.java:425)
at ex1.LifeThreads.standardItr(LifeThreads.java:321)
at ex1.LifeThreads.run(LifeThreads.java:462)
(この種の事後分析トレースは、Sun JVM の -Xcheck:jni オプションで取得できます)
コードでは、さまざまな JDK サンプル (ネイティブ メソッドを持つプロキシ Java クラスを介した heapViewer、heapTracker など) に示されているのと同じ種類の計測を行います。各命令Proxy.monitor_enter_
の後にネイティブ メソッドが呼び出されます。monitorenter
これは、monitor_enter_ のコードです。
は、scoped_lock
基本的には JVMTI Raw Monitor の開始/終了用のスコープ ロックで
あり、呼び出されたときにクラスのインスタンス(それ自体は単にグローバル参照をラップするだけ) が格納される、thread_t
一部をラップする単なる構造体です。std::vector
lock
jobject
global_ref
thread->lock( lock(global_ref))
JVMTI 環境。以下に示すように、エージェントシングルトンでグローバルにキャッシュされますが、スレッドローカルであるJNI envは、使用する前に毎回再ロードされます(それほど効率的ではありませんが、今のところ気にしません)。
java - JVMTI Agent_OnLoad ハンドラがシステム プロパティを作成できない
JVM ツール インターフェイスを使用しています。SetSystemProperty() 呼び出しを使用して Agent_OnLoad イベントで SystemProperty を作成しようとしています。プロパティが存在する場合、新しい値が正しく設定されます。ただし、プロパティが存在しない場合、SetSystemProperty はプロパティを書き込めないことを示すエラー コードを返します (エラー 98)。
クラスがロードされる前に、JVM の初期段階でシステム プロパティを作成する別の方法はありますか?
2012 年 5 月 24 日更新: エージェントとして、さまざまなプログラムに負荷をかけられています。プログラムにこのプロパティを設定するように要求することはできません (私の使用例では実用的ではありません)。エージェント コード自体からプロパティを設定する方法を探しています。いろいろ試した結果、無理だという結論に達しました。