問題タブ [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 - Javaでの並行プログラムの動作をプロファイリングするための機能
現在、スレッド化された実行を理解するために、プログラム実行の同時動作をプロファイリングすることを約束するプロファイラーがいくつかあります。
私は、並行性のプロファイリングのみに集中しているJavaプロファイラーに役立つコレクション機能です。
これまでに収集したもの:
潜在的なデッドロックを検出するための待機グラフの作成
アクセスリソース(データ構造など)の時間測定
すべてのスレッドの状態を表示する(生きている、中断されている、死んでいる)
どのスレッドが共有リソースにアクセスするためにどのスレッドを呼び出したか(待機、ブロックなど)
どんなアイデアがありますか?個人的には、Javaで並行性を処理するときに、いくつかの悪いプログラミング習慣を明らかにすることを目指しています。
qt - Qt/qmake で JVMTI エージェントをビルドする
最初の JVMTI エージェントの実装に成功し、ビルドが g++ コンパイラで完了したら、ビルド プロセスを Qt プロジェクトに統合したいと考えています。
ただし、ビルド プロセスの構成に関するいくつかの問題に直面しています。
g++ コンパイラで実行するパラメータは次のようになります。
これは非常にうまく機能します。今qmakeに:
qmake で使用される C++ コンパイラにさらにパラメータを追加するパラメータ CXXFLAGS は認識していますが、このパラメータ化されたコンパイラ呼び出しを qmake に変換するにはどうすればよいですか?
java - JVMTI エージェント上の GUI
Oracle が提供する JVMTI API を使用してプロファイラーを開発する予定です。視覚化のために、エージェント コードの上に GUI (Qt フレームワーク) を実装したいと思います。私の最初の jvmti エージェントはすでにコンパイルおよび実行されており、エージェントを Qt プロジェクトに統合し始めました。
現在、エージェントと GUI を結合する方法の問題に直面しています。エージェント内で GUI を起動する必要がありますか? たとえば、Agent_OnLoad 関数では?
長期的には、GUI からプロファイリングを開始することになりますが、それを実現する方法は想像できません。
java - Java クラスの再初期化
私たちは、Java クラス ファイルを計測するために使用される JVMTI Java エージェントに取り組んでいます。その一部は (明らかに) ネイティブの C++ コードですが、大部分は Java コードであり、ネットワーク経由で読み込まれ、ネイティブ エージェント コードから呼び出されます。コード カバレッジ ツールを使用して、ソース コードの計測を行う Java 部分のテスト カバレッジを収集します。
エージェントが起動すると、いくつかのクラスが初期化されます。具体的には、Thread を開始する java.lang.ref.Reference です。当社のエージェントは、コード カバレッジ ツールによってインストルメント化されたカスタム Java コードを使用して Thread start メソッドをインスツルメントします。カバレッジ ツールは、静的初期化子を持ついくつかの静的内部クラスを Java エージェント コードに配置するため、これは java.lang.ref.Reference が初期化される結果として実行されます。
問題は、この時点 (java.lang.ref.Reference が初期化されるとき) に、JVM のいくつかの基本機能がまだ整っていないことです。具体的には、コード カバレッジ ツールの初期化子は System.getProperty(String name) にアクセスしようとしていますが、System.props はまだ null であるため、呼び出しの結果は NullPointerException になります。これにより、コード カバレッジ ツールの静的な内部クラスが初期化されないままになり、クラスが初期化エラー状態になり、結果は NoClassDefFoundError になります。このクラスへのフォローアップ アクセスのたびに、NoClassDefFoundError が発生します。
私の意図は、この初期初期化エラーを無視し、VM_Start まで待ってから、問題のクラスの ClassState を「リンク済み」にリセットすることです。このようにして、クラスへのフォローアップアクセスでJVMがクラスを再度初期化しようとすることを願っています。
JVMTIエージェントからこれを行うことができるかどうか、誰かが考えを持っていますか?これを行う方法を教えてください。
c++ - g++を使用した共有ライブラリの未定義のシンボル
JVMTIを使用して、Javaアプリケーションのプロファイルを作成するエージェントを開発しています。したがって、共有ライブラリlibagent.soがコンパイルされます。さらに、Qtフレームワークを使用します。
今のところ、 agent.cppとagentserver.cppの2つのソースファイルのみで構成されています。
ただし、共有ライブラリlibagent.soを使用してJavaアプリケーションを起動すると、次のエラーが発生します。未定義のシンボル:_ZTV11AgentServer(./libagent.so)
lddを実行すると、同じ依存関係の問題が発生します。
私の現在のコンパイルコマンドは次のとおりです。
ここで、$(CXXFLAGS)は-m64 -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)です。
ここで、$(DEFINES)は-DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED
ここで、$(INCPATH)は-I / home / konrad / qtsdk-2010.05 / qt / mkspecs / linux-g ++-64 -I ../ src -I / home / konrad / qtsdk-2010.05 / qt / include / QtCore -I /home/konrad/qtsdk-2010.05/qt/include/QtNetwork -I / home / konrad / qtsdk-2010.05 / qt / include / QtGui -I / home / konrad / qtsdk-2010.05 / qt / include -I / usr / lib / jvm / java-6-openjdk / include -I / usr / lib / jvm / java-6-openjdk / include /linux-I。-私。-I ../src-I。
私はこの問題の調査に時間をかけましたが、このエラーを解決したものはありませんでした。
これは、agentserver.cppのヘッダーコードです:agentserver.h
java - JavaまたはJVMTIを使用して現在のJVMを識別します
現在実行されているJVMを特定したいと思います。JVMTIドキュメントに記載されている関数を使用した最良のケースですが、何も見つかりません。
私が意味したのは、次のようなものですVirtualMachine.list()
。
ただし、現在実行されているJVMではなく、すべてのJVMが表示されます。
java - JVMTIを使用したJVMのプロファイリング、さまざまなJVMを区別する方法は?
私はJVMTIを使用してプロファイラーを作成しています。
C ++では、収集した情報をソケットに書き込む単純なエージェントを作成しました。Java Swingを使用して、ソケットからこれらのデータを読み取って視覚化する単純なGUIを構築しました。
しかし、私はいくつかのユーザビリティの問題に直面しています。リクエストに応じてJavaアプリケーションのプロファイリングを開始する機能を提供したいと思います。実行中のJVMにエージェントを注入する可能性を提供するAttachAPIがあります。
ただし、新しいJavaプログラムを起動してエージェントを注入するのは、もう少し複雑です。1つの方法は、コマンドラインを呼び出して、GUIプロファイラーからJavaプログラムを起動することです。
どういうわけかハッキーなので、私はこのアイデアが嫌いですが、他の方法はわかりませんね。
要約すると、JVMのプロファイリングを開始するには2つの方法が必要です。
- Javaアプリケーションを最初から開始し、直接プロファイリングを開始します
- 実行中のJVMに接続し、エージェントを注入してプロファイリングを開始します
さらに、検査するさまざまなJVMを区別する必要がありますが、それを行うにはどうすればよいですか?異なるJVMに一意の識別子はありません。Attach APIを使用すると、さまざまなJVMを名前とIDで一覧表示できますが、最初のケースではどうすればよいでしょうか。エージェントに引数を挿入することは可能ですか?
java - クラスThreadInfoは、JVMTIから到達可能な情報よりも多くの情報を提供しますか?
これは紛らわしいです。ThreadInfoクラスは、多くの情報、特にスレッドの統計を提供します。しかし、 JVMTIでそのような関数を見つけることができません。これは標準ですか?自分でデータを収集する必要がありますか?ThreadInfoオブジェクトを自分で繰り返す必要がありますか?
java - JVMTI APIで利用できない同期統計?
クラスjava.lang.ThreadInfoは、Javaでの同期に関する統計を提供するいくつかの非常に便利なメソッドを提供します。例えば:
getBlockedTime() スレッド競合の監視が有効になっているため、このThreadInfoに関連付けられたスレッドがモニターへの入力またはモニターへの再入力をブロックしたおおよその累積経過時間(ミリ秒単位)を返します。[...]
getWaitedCount() このThreadInfoに関連付けられたスレッドが通知を待機した合計回数を返します。[...]
JVMTIAPIからこれらの情報にアクセスするための関数が見つかりません。私はそれを見落としていますか、それともこれらの情報を自分で収集する必要がありますか?
同期統計以外に、スレッドIDを取得することさえできないようです。これは、を使用して取得できます。Thread.currentThread().getId();
java - JVMTI エージェントがスレッドの終了状態を返さない
JVMTI エージェントを実装して、特定のイベント (ThreadStart、ThreadEnd、VMInit、VMDeath など) でスレッドの状態を読み取りました。
理由があるかもしれません.ThreadEndは、スレッドが終了していることを示す単なるシグナルです. 私は言うすべてのスレッドを読みましGetAllThreads
た:
すべてのライブ スレッドを取得します。スレッドは Java プログラミング言語のスレッドです。つまり、VM に接続されているスレッドです。java.lang.Thread.isAlive() が true を返す場合、つまり、スレッドが開始され、まだ終了していない場合、スレッドはライブです。スレッドの範囲は、JVM TI 環境のコンテキストによって決まります。これは通常、VM に接続されたすべてのスレッドです。これには、JVM TI エージェント スレッドが含まれることに注意してください (RunAgentThread を参照)。
つまり、VMDeath イベントでこれを呼び出しても、終了したスレッドはフェッチされません。しかし、状態を終了して新しいものにするために私はやるべきですか?
私の推測:
- イベント ThreadEnd で、手動で終了した状態を返します
- オブジェクトの割り当て時に、それがスレッドの場合、手動で新しい状態を返します
PS: JVMTI API で提案されているように、スレッドの状態を読み取っています。