JVM Tool Interfaceとは
JVMTM Tool Interface (JVM TI)は、開発ツールや監視ツールで使用されるプログラミング・インタフェースです。 JavaTM仮想マシン(VM)で動作するアプリケーションの状態検査と実行制御の両方の機能を提供します。 JVM TIは、プロファイリング・ツール、デバッグ・ツール、監視ツール、スレッド分析ツール、カバレッジ分析ツールなど、VMの状態その他にアクセスする必要がある各種ツールのVMインタフェースとして機能します。 JVM TIは、JavaTM仮想マシンのすべての実装で使用できるとはかぎりません。 JVM TIは双方向のインタフェースです。 JVM TIのクライアント(以下エージェントと呼ぶ)は、興味のある事象についてイベント経由で通知を受け取ることができます。 JVM TIは、多数の関数を介して、アプリケーションのクエリーや制御を(イベントへの応答として、あるいはイベントから独立して)行えます。 個々のエージェントは同一のプロセスで実行され、検査対象のアプリケーションを実行する仮想マシンと直接通信します。 この通信には、ネイティブ・インタフェース(JVM TI)が使用されます。 ネイティブのインプロセス・インタフェースにより、ツール側への侵入は最小限に抑えながら、最大限の制御が可能になります。 通常、エージェントは比較的コンパクトです。 エージェントは、ターゲット・アプリケーションの通常の実行を妨げることなく、ツールの機能の大部分を実装する別のプロセスによって制御できます。アーキテクチャ
ツールへの書込みは、JVM TIを使って直接行われるか、高度インタフェースを使って間接的に行われます。 Java Platform Debugger Architectureには、JVM TIのほかに、より高いレベルのアウトプロセス・デバッガ・インタフェースも含まれています。 多くのツールには、JVM TIよりも高いレベルのインタフェースの方が適しています。 Java Platform Debugger Architectureの詳細については、Java Platform Debugger ArchitectureのWebサイトを参照してください。エージェントの作成
エージェントの作成には、C言語の呼出し規則とC/C++の定義をサポートする任意のネイティブ言語を使用できます。 JVM TIを使用するために必要な関数、イベント、データ型、定数の定義は、インクルード・ファイルjvmti.hで定義されます。 これらの定義を使用するには、J2SETMインクルード・ディレクトリをインクルード・パスに追加し、
#include <jvmti.h>
をソース・コードに追加してください。
エージェントの配備
エージェントはプラットフォーム固有の方法で配備されますが、通常はそのプラットフォームでダイナミック・ライブラリに相当するものになります。 たとえば、WindowsTMオペレーティング・システムの場合、エージェント・ライブラリは「ダイナミック・リンク・ライブラリ」(DLL)になります。 LinuxTMオペレーティング環境では、エージェント・ライブラリは共有オブジェクト(.soファイル)です。
VM起動時にエージェントを起動するには、コマンド行オプションを使ってエージェント・ライブラリの名前を指定します。 実装によっては、ライブ段階でエージェントを起動するメカニズムをサポートしている可能性があります。 その起動方法の詳細は、実装に固有となります。
静的リンク・エージェント(導入されたバージョン: 1.2.3)
ネイティブJVMTIエージェントは、VMと静的にリンクできます。 ライブラリ・イメージとVMイメージとの結合方法は、実装に依存します。 イメージがVMと結合されたエージェントLが静的リンクとして定義されるのは、そのエージェントがAgent_OnLoad_Lという名前の関数をエクスポートする場合のみです。 静的リンク・エージェントLからAgent_OnLoad_Lという名前の関数とAgent_OnLoadという名前の関数がエクスポートされた場合、Agent_OnLoad関数は無視されます。 エージェントLが静的リンクの場合、Agent_OnLoad関数で規定されたのと同じ引数と期待される戻り値を指定して、Agent_OnLoad_L関数が呼び出されます。 静的リンクのエージェントLは、同名のエージェントが動的にロードされるのを禁止します。 VMは、その実行中に動的エントリ・ポイントAgent_OnUnLoadが呼び出されていたのと同じポイントで、エージェントのAgent_OnUnload_L関数を呼び出します(そのような関数がエクスポートされていた場合)。 静的にロードされたエージェントはアンロードできません。 それでも、エージェントのシャットダウンに関する他のなんらかのタスクを行えるように、Agent_OnUnload_L関数が呼び出されます。 静的リンク・エージェントLからAgent_OnUnLoad_Lという名前の関数とAgent_OnUnLoadという名前の関数がエクスポートされた場合、Agent_OnUnLoad関数は無視されます。 エージェントLが静的リンクの場合、Agent_OnAttach関数で規定されたのと同じ引数と期待される戻り値を指定して、Agent_OnAttach_L関数が呼び出されます。 静的リンク・エージェントLからAgent_OnAttach_Lという名前の関数とAgent_OnAttachという名前の関数がエクスポートされた場合、Agent_OnAttach関数は無視されます。エージェントのコマンド行オプション
以下の「コマンド行オプション」という語は、JNI呼び出しAPIのJNI_CreateJavaVM関数において、JavaVMInitArgs引数で指定されるオプションを意味します。
エージェントを適切にロードして実行するには、VMの起動時に次の2つのうちいずれかのコマンド行オプションが必要です。 これらの引数は、エージェントを含むライブラリと、起動時に渡されるオプションの文字列を指定します。
-
-agentlib:<agent-lib-name>=<options> -
-agentlib:の後の名前は、ロードするライブラリの名前です。 ライブラリの検索(その完全名と場所の両方)は、プラットフォーム固有の方法で進行します。 通常、<agent-lib-name>はオペレーティング・システム固有のファイル名に展開されます。 <options>は、起動時にエージェントに渡されます。 たとえば、オプション-agentlib:foo=opt1,opt2が指定されている場合、VMは、WindowsTMの下のシステムPATHから共有ライブラリfoo.dll、またはLinuxTMの下のLD_LIBRARY_PATHからlibfoo.soをロードしようとします。 エージェントのライブラリが実行可能ファイルに静的にリンクされている場合、実際のロード・タスクは発生しません。 -
-agentpath:<path-to-agent>=<options> -
-agentpath:の後ろには、ライブラリをロードする絶対パスを指定します。 ライブラリ名の展開は行われません。 <options>は、起動時にエージェントに渡されます。 たとえば、オプション-agentpath:c:\myLibs\foo.dll=opt1,opt2が指定された場合、VMは、共有ライブラリc:\myLibs\foo.dllをロードしようとします。 エージェントのライブラリが実行可能ファイルに静的にリンクされている場合、実際のロード・タスクは発生しません。
Agent_OnLoadが呼び出されます。 エージェントのライブラリが実行可能ファイルに静的にリンクされている場合、システムはAgent_OnLoad_<agent-lib-name>エントリ・ポイント(<agent-lib-name>はエージェントのベース名)を呼び出そうとします。 上の例(-agentpath:c:\myLibs\foo.dll=opt1,opt2)の場合、システムはAgent_OnLoad_foo起動ルーチンを見つけて呼び出そうとします。
バイト・コード・インストゥルメンテーション(bytecode instrumentation)のために必要な場合、ツール内でJavaプログラミング言語コードを使用しやすくするため、-agentlib: または-agentpath:を指定してロードされたライブラリから、JNIネイティブ・メソッド実装が検索されます。
エージェント・ライブラリは、その他のすべてのライブラリが検索されたあと検索されます。非エージェント・メソッドのネイティブ・メソッド実装を上書きまたは遮断するエージェントは、NativeMethodBindイベントを使用できます。
これらのスイッチは上記の処理のみを行います。VMやJVM TIの状態を変更することはありません。 JVM TIやJVM TIの側面を有効にするためにコマンド行オプションを指定する必要はありません。これは、プログラム内で権限を使用して処理されます。
エージェントの起動
VMは、起動関数を呼び出すことで各エージェントを起動します。OnLoad段階でエージェントを起動する場合は、関数Agent_OnLoad(静的リンク・エージェントの場合はAgent_OnLoad_L)が呼び出されます。 ライブ段階でエージェントを起動する場合は、関数Agent_OnAttach(静的リンク・エージェントの場合はAgent_OnAttach_L)が呼び出されます。 起動関数の呼出しは、エージェントごとに1回だけ行われます。
エージェントの起動(OnLoad段階)
OnLoad段階でエージェントを起動する場合、そのエージェント・ライブラリは次のプロトタイプを持つ起動関数をエクスポートする必要があります。
「L」という名前の静的リンク・エージェントの場合:JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
VMは、この関数を呼び出すことでエージェントを起動します。 この呼出しはVM初期化の早い段階で行われるため、次のことが言えます。JNIEXPORT jint JNICALL Agent_OnLoad_L(JavaVM *vm, char *options, void *reserved)
- システム・プロパティは、VMの起動で使用される前に設定できる
- すべての権限を使用できる(ただし、VMを構成する権限はこのときしか使用できない。詳細は「権限関数」セクションを参照)
- バイト・コードが実行されていない
- クラスがロードされていない
- オブジェクトが作成されていない
Agent_OnLoadまたはAgent_OnLoad_<agent-lib-name>関数を、第2引数に<options>を指定して呼び出します。つまり、コマンド行オプションの例で言えば、Agent_OnLoadのchar *options引数に"opt1,opt2"が渡されます。 options引数は修正UTF-8文字列としてエンコードされます。 =<options>が指定されなかった場合は、長さゼロの文字列がoptionsに渡されます。 options文字列の存続期間は、Agent_OnLoadまたはAgent_OnLoad_<agent-lib-name>呼出しの間です。 この期間を超えて必要な場合は、文字列または文字列の一部をコピーする必要があります。 Agent_OnLoadが呼び出されてから復帰するまでの期間は、OnLoad段階と呼ばれます。 OnLoad 段階ではVMは初期化されていないため、Agent_OnLoadの内側で使用できる操作セットは限定されます(この時点で使用可能な機能については関数の説明を参照)。 エージェントが安全に実行できるのは、オプションの処理や、SetEventCallbacksでイベント・コールバックを設定する処理です。 エージェントはVM初期化イベントを受け取った後(つまり、VMInitコールバックが呼び出された後)、初期化を完了させることができます。
原理の説明: 早い段階での起動が必要なのは、エージェントが目的の権限(その多くはVMの初期化前に設定する必要がある)を設定できるようにするためです。 JVMDIでは-Xdebugコマンド行オプションによって、非常に粗粒度の権限制御機能が提供されていました。 JVMPI実装では、様々なテクニックを使用して単一の「JVMPIオン」スイッチが提供されます。 必要な権限とパフォーマンスへの影響のバランスを取るために必要な、細粒度の制御機能を提供できる適度なコマンド行オプションはありません。 また、早い段階での起動は、エージェントが実行環境を制御できるようにする(ファイル・システムやシステム・プロパティを変更して機能をインストールできるようにする)ためにも必要です。
Agent_OnLoadまたはAgent_OnLoad_<agent-lib-name>の戻り値は、エラーを示すために使用されます。 ゼロ以外の値はすべてエラーを示しており、エラーが発生するとVMは終了します。
エージェントの起動(ライブ段階)
VMによっては、そのVM内でライブ段階でエージェントを起動するメカニズムをサポートしている可能性があります。 そのサポート方法の詳細は、実装に固有となります。 たとえば、あるツールでは、何らかのプラットフォーム固有のメカニズムや実装固有のAPIを使用することで、実行中のVMに接続して特定のエージェントの起動を要求する可能性があります。 VMは、ライブ・フェーズで起動を試みる各エージェントの標準エラー・ストリームに警告を出力します。 エージェントが以前に (OnLoadフェーズまたはライブ・フェーズ)を起動していた場合は、同じエージェントを2回目以降に起動しようとしたときに警告が出力されるかどうかに固有の実装です。 警告は、実装固有のコマンド行オプションによって無効にできます。
実装に関するノート: HotSpot VMの場合、VMオプション-XX:+EnableDynamicAgentLoadingは、ライブ・フェーズでエージェントの動的ロードを許可するためにオプトインに使用されます。 このオプションは、ライブ・フェーズでエージェントを起動する際の標準エラーに対する警告を抑制します。
ライブ段階でエージェントを起動する場合、そのエージェント・ライブラリは次のプロトタイプを持つ起動関数をエクスポートする必要があります。
「L」という名前の静的リンク・エージェントの場合:JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char *options, void *reserved)
VMは、この関数を呼び出すことでエージェントを起動します。 これは、VMに接続されたスレッドのコンテキスト内で呼び出されます。 第1引数の<vm>は、Java VMです。 <options>引数はエージェントに提供される起動オプションです。<options>は修正UTF-8 文字列としてエンコードされます。 起動オプションが指定されなかった場合は、長さゼロの文字列がJNIEXPORT jint JNICALL Agent_OnAttach_L(JavaVM* vm, char *options, void *reserved)
optionsに渡されます。 options文字列の存続期間は、Agent_OnAttachまたはAgent_OnAttach_<agent-lib-name>呼出しの間です。 この期間を超えて必要な場合は、文字列または文字列の一部をコピーする必要があります。
ライブ段階では権限の一部が使用できない可能性があります。
Agent_OnAttachまたはAgent_OnAttach_<agent-lib-name>関数は、エージェントを初期化し、エラーが発生したかどうかを示す値をVMに返します。 ゼロ以外の値はすべて、エラーを表します。 エラーが発生してもVMは終了しません。 代わりにVMは、そのエラーを無視するか、そのエラーを標準エラーに出力したりシステム・ログに記録したりするなど、何らかの実装固有のアクションを実行します。
エージェントの停止
ライブラリは、オプションで、次のプロトタイプを持つ停止関数をエクスポートできます。「L」という名前の静的リンク・エージェントの場合:JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm)
この関数は、ライブラリのアンロードの直前にVMによって呼び出されます。 ライブラリは(実行可能ファイルに静的にリンクしない)のアンロードされ、一部のプラットフォーム固有のメカニズムによって(アンロード・メカニズムがこのドキュメントで指定されていません)がアンロードされるか、またはVMの終了によってライブラリが(作用)がアンロードされると、この関数が呼び出されます。 VMの終了には、正常な終了とVM障害(起動の失敗を含むが、制御されていない停止)が含まれます。 実装では、JNIEXPORT void JNICALL Agent_OnUnload_L(JavaVM *vm)
Agent_OnAttach/ Agent_OnAttach_Lファンクションがエラー(ゼロ以外の値が返されました)を報告した場合に、この関数をコールしないことを選択することもできます。 この関数とVM終了イベントの違いに注意してください。VM終了イベントが送信されるためには、VMが少なくとも初期化のポイントまで実行済であり、かつVMDeathのコールバックを設定し、このイベントを有効化した有効なJVM TI環境が存在している必要があります。 Agent_OnUnloadまたはAgent_OnUnload_<agent-lib-name>ではこれらの条件は一切不要です。また、その他の理由でライブラリがアンロードされる場合もこの関数が呼び出されます。 VM終了イベントが送信される場合、それは、この関数が呼び出される前に送信されます(VMの終了によってこの関数が呼び出されると仮定した場合)。 この関数を使えば、エージェントによって割り当てられたリソースをクリーンアップできます。
JAVA_TOOL_OPTIONS
埋め込みVMや単にスクリプト内の深い場所で起動されるVMなどでは、コマンド行のアクセスや変更が常に可能であるとはかぎらないため、JAVA_TOOL_OPTIONS変数が用意されています。これを使えば、そうした場合でもエージェントを起動できます。
環境変数などの名前付き文字列をサポートするプラットフォームでは、JAVA_TOOL_OPTIONS変数がサポートされている可能性があります。 この変数は、空白文字の境界で複数のオプションに分解されます。 空白文字には、空白、タブ、復帰、復帰改行、垂直タブ、用紙送りなどがあります。 一連の空白文字は単一の空白文字と同等とみなされます。 空白文字は、引用符で囲まれていないかぎり、オプションには含められません。 引用方法は次のとおりです。
- 一重引用符の組('')に囲まれた、一重引用符を除くすべての文字は引用として囲まれる。
- 一重引用符の組の内部にある二重引用符には、特殊な意味はない。
- 二重引用符の組("")に囲まれた、二重引用符を除くすべての文字は引用として囲まれる。
- 二重引用符の組の内部にある一重引用符には、特殊な意味はない。
- 変数内の任意の場所を引用符で囲むことができる。
- 引用符で囲まれた空白文字には、特殊な意味はない。その他の文字と同様にオプションに含めることができ、区切り文字として機能しない。
- 引用符の組自体はオプションに含まれない。
JNI_CreateJavaVM(JNI呼出しAPI内)は、JavaVMInitArgs引数に指定されたオプションの先頭に、これらのオプションを付加します。 セキュリティに問題がある場合、プラットフォームはこの機能を無効化することがあります。たとえばリファレンス実装は、UNIXシステムで実効ユーザーIDまたはグループIDが実際のIDと異なる場合に、この機能を無効化します。 この機能はツールの初期化(具体的にはネイティブまたはJavaプログラミング言語エージェントの起動など)をサポートするためのものです。 複数のツールがこの機能の使用を要求する可能性があるため、変数を上書きするのではなく、かわりに変数にオプションを追加すべきです。 変数が処理されるのは、JNI呼出しAPIのVM作成呼出し時であるため、ランチャによって処理されるオプション(VM選択オプションなど)は処理されません。
環境
JVM TI仕様では、複数JVM TIエージェントの同時使用がサポートされています。 各エージェントはそれぞれ独自のJVM TI環境を持ちます。 つまり、JVM TIの状態はエージェントごとに異なります。ある環境を変更しても、他の環境はその影響を受けません。 JVM TI環境の状態を次に示します。 エージェントのJVM TI状態はそれぞれ独立しているものの、エージェントはVMの共有状態を検査および変更するほか、実行先となるネイティブ環境も共有します。 このため、あるエージェントが他のエージェントの結果を混乱させたり、他のエージェントの失敗の原因となる可能性があります。 他のエージェントとの互換性のレベルを規定するのは、エージェント開発者の責任です。 JVM TI実装には、エージェント間の破壊的な相互作用を回避する機能はありません。 これらの問題が発生する可能性を減らす技法については、このドキュメントでは説明しません。 エージェントは、JNI呼び出しAPI関数 GetEnvにインタフェースIDとしてJVM TIのバージョン情報を渡すことによって、JVM TI環境を作成します。 JVM TI環境の作成と使用の詳細については、「JVM TI関数のアクセス」を参照してください。 通常、JVM TI環境は、Agent_OnLoadからGetEnvを呼び出すことによって作成されます。
バイト・コード・インストゥルメンテーション
このインタフェースには、プロファイリングをサポートするインタフェースに通常期待されるいくつかのイベントが含まれていません。 例として、完全な速度によるメソッドの開始および終了イベントがあります。 このインタフェースではかわりに、バイトコード・インストゥルメンテーション(ターゲット・プログラムを構成するJava仮想マシン・バイトコード命令を変更する機能)のサポートが提供されます。 これらの変更の目的は通常、メソッドのコードに「イベント」を追加すること(たとえば、メソッドの先頭にMyProfiler.methodEntered()呼出しを追加すること)です。 変更は単に追加されるため、アプリケーションの状態や動作が変更されることはありません。 挿入されるエージェント・コードは標準のバイトコードなので、VMをフル・スピードで実行できます(ターゲット・プログラムのみでなくインストゥルメンテーションも最適化される)。 インストゥルメンテーションにバイトコード実行からの切替えが含まれていなければ、高コストの状態遷移が不要となります。 その結果、イベントのパフォーマンスが高くなります。 さらにこのアプローチは、完全な制御機能をエージェントに提供します。コードの「関心のある」部分(エンド・ユーザーのコードなど)にインストゥルメンテーションを限定可能で、しかも条件付きにできます。 インストゥルメンテーションは、全体をJavaプログラミング言語コード内で実行することも、ネイティブ・エージェント内への呼出しを行うこともできます。 インストゥルメンテーションは、単純にカウンタを保持することも、イベントの統計サンプリングを行うこともできます。
インストゥルメンテーションの挿入は、次の3とおりのうちのいずれかの方法で行います。
-
静的インストゥルメンテーション: クラス・ファイルは、たとえばインストゥルメンテーションを追加する目的で変更された
*.classファイルを含む複製ディレクトリを作成するなどの方法で、VMにロードされる前に計測されます。 この方法はきわめて不自然であり、一般に、ロードされるクラス・ファイルの出所をエージェント側で知ることはできません。 -
ロード時のインストゥルメンテーション: クラス・ファイルがVMにロードされるとき、クラス・ファイルのrawバイトは、インストゥルメンテーション用としてエージェントに送信されます。 クラスのロードによって発生した
ClassFileLoadHookイベントが、この機能を提供します。 このメカニズムは効率がよく、1回かぎりのインストゥルメンテーションに完全にアクセスできます。 -
動的インストゥルメンテーション: すでにロード済であり、場合によっては実行されている可能性もあるクラスが、変更されます。 このオプション機能は、
RetransformClasses関数を呼び出すことでトリガーされるClassFileLoadHookイベントによって提供されます。 クラスは複数回変更できるほか、元の状態に戻すこともできます。 このメカニズムを使えば、実行中に変化するインストゥルメンテーションを実現できます。
ClassFileLoadHookイベントとRetransformClasses関数)、開発時には修正しながらデバッグを続けていく(RedefineClasses関数)ために用意されています。
依存関係が混乱しないように、特にコア・クラスを計測する場合は、注意が必要です。 たとえば、各オブジェクト割当ての通知を受けるアプローチでは、Objectでコンストラクタを計測します。 コンストラクタが最初は空であるとすると、このコンストラクタを次のように変更します。
public Object() {
MyProfiler.allocationTracker(this);
}
ただし、ClassFileLoadHookイベントを使用してこの変更を行った場合、その影響が次のように典型的なVMに及ぶ可能性があります。最初に作成されるオブジェクトがコンストラクタを呼び出し、その結果、MyProfilerのクラス・ロードが開始されます。次にオブジェクトが作成されますが、MyProfilerはまだロードされていないので無限再帰に陥り、スタック・オーバーフローが発生します。 これを改良するには、安全な時間になるまで追跡メソッドの呼出しを遅らせます。 たとえば、VMInitイベントのハンドラ内でtrackAllocationsを設定できます。
static boolean trackAllocations = false;
public Object() {
if (trackAllocations) {
MyProfiler.allocationTracker(this);
}
}
SetNativeMethodPrefixを使えば、ラッパー・メソッドによるネイティブ・メソッドの計測が可能となります。
バイトコード・モジュール内のコードのインスツルメンテーション
エージェントは、関数AddModuleReads、AddModuleExports、AddModuleOpens、AddModuleUsesおよびAddModuleProvidesを使用して、モジュールを更新し、モジュールが読み取るモジュールのセット、モジュールが他のモジュールにエクスポートまたはオープンするパッケージのセット、またはモジュールが使用して提供するサービスを拡張できます。
ブートストラップ・クラス・ローダーの検索パスにサポート・クラスをデプロイするエージェント、またはメイン・クラスをロードするクラス・ローダーの検索パスとして、Java仮想マシンは、ClassFileLoadHookイベントによって変換されたクラスのモジュールを、両方のクラス・ローダーの名前のないモジュールを読み取るように配置します。
修正UTF-8の文字列エンコーディング
JVM TIは、修正UTF-8を使って文字列をエンコードします。 これは、JNIが使用するのと同じエンコーディングです。 修正UTF-8と標準のUTF-8との違いは、補助文字とnull文字の表現方法にあります。 詳細については、JNI仕様の「変更後のUTF-8文字列」セクションを参照してください。仕様のコンテキスト
このインタフェースはJava仮想マシンで実行されるアプリケーションの状態にアクセスするため、用語はJavaプラットフォームに関するものであり、特に言及している場合を除いてネイティブ・プラット・フォームに関するものではありません。 たとえば:- 「スレッド」はJavaプログラミング言語のスレッドを意味する。
- 「スタック・フレーム」はJava仮想マシンのスタック・フレームを意味する。
- 「クラス」はJavaプログラミング言語のクラスを意味する。
- 「ヒープ」はJava仮想マシンのヒープを意味する。
- 「モニター」はJavaプログラミング言語のオブジェクト・モニターを意味する。
関数
関数のアクセス
ネイティブ・コードは、JVM TI関数を呼び出してJVM TI機能にアクセスします。 JVM TI関数には、Java Native Interface (JNI)関数のアクセス時と同様に、インタフェース・ポインタを使ってアクセスします。 JVM TIインタフェース・ポインタを環境ポインタと呼びます。 環境ポインタは、jvmtiEnv*型の環境へのポインタです。 環境には、JVM TI接続に関する情報があります。 環境内の最初の値は、関数テーブルへのポインタです。 関数テーブルは、JVM TI関数へのポインタの配列です。 どの関数ポインタも配列内の事前に定義されたオフセットにあります。
C言語から使用される場合: 関数へのアクセス時に二重間接指定が使用されます。つまり環境ポインタは、コンテキストを提供するとともに、各関数呼出しの最初のパラメータになります。たとえば:
jvmtiEnv *jvmti;
...
jvmtiError err = (*jvmti)->GetLoadedClasses(jvmti, &class_count, &classes);
C++言語から使用される場合: 各関数はjvmtiEnvのメンバー関数としてアクセスされ、環境ポインタが関数呼出しに渡されることはありません。たとえば:
jvmtiEnv *jvmti;
...
jvmtiError err = jvmti->GetLoadedClasses(&class_count, &classes);
特に指定しないかぎり、この仕様に含まれる例や宣言はすべて、C言語を使用しています。
JVM TI環境は、JNI呼び出しAPIのGetEnv関数を使って取得できます。
jvmtiEnv *jvmti;
...
(*jvm)->GetEnv(jvm, &jvmti, JVMTI_VERSION_1_0);
GetEnvを呼び出すたびに、新しいJVM TI接続、したがって新しいJVM TI環境が作成されます。 GetEnvのversion引数は、JVM TIのバージョンでなければいけません。 返された環境のバージョンが要求されたバージョンと異なることもありますが、返された環境は互換性があるはずです。 GetEnvからJNI_EVERSIONが返されるのは、互換性のあるバージョンが使用可能でない場合、JVM TIがサポートされていない場合、または現在のVM構成でJVM TIがサポートされていない場合です。 特定のコンテキストでJVM TI環境を作成するためのその他のインタフェースが追加される可能性があります。 各環境はそれぞれ独自の状態(必要なイベント、イベント処理関数、権限など)を持ちます。 環境を解放するにはDisposeEnvironmentを使用します。 したがって、スレッドごとに1つの環境が用意されるJNIと異なり、JVM TI環境は複数のスレッドにわたって動作し、動的に作成されます。
関数の戻り値
JVM TI関数は、常にjvmtiError関数の戻り値からエラー・コードを返します。 関数によっては、呼出し側の関数で指定されたポインタにより、これ以外の値を返すことも可能です。 JVM TIの関数の中にはメモリーを割り当てるものがありますが、この場合はプログラム内でそのメモリーを明示的に解放しなければなりません。 これについては、個々のJVM TI関数の説明に明記されています。 空のリスト、配列、シーケンスなどは、NULLとして返されます。
JVM TI関数がエラーに遭遇した場合は(戻り値がJVMTI_ERROR_NONE以外)、引数ポインタにより参照されるメモリー値は未定義です。しかし、メモリーおよびグローバル参照は何も割り当てられません。 無効な入力のためにエラーが発生した場合、アクションは一切発生しません。
JNIオブジェクト参照の管理
JVM TI関数は、JNI参照(jobjectとjclass)およびそれらの派生物(jthreadとjthreadGroup)を使用してオブジェクトを識別します。 JVM TI関数に渡す参照はグローバル参照、ローカル参照のどちらでもかまいませんが、強い参照でなければいけません。 JVM TI関数から返される参照はすべてローカル参照です。これらのローカル参照はJVM TI呼出し時に作成されます。 ローカル参照は、(「JNIドキュメント」を参照してください)を管理する必要があるリソースです。 スレッドがネイティブ・コードから復帰する際に、すべてのローカル参照が解放されます。 典型的なエージェント・スレッドを含む一部のスレッドは、決してネイティブ・コードから復帰しません。 各スレッドは、明示的な管理を一切行わずに16個のローカル参照を作成できることが保証されています。 限られた数のJVM TI呼出しを実行した後、ネイティブ・コードから復帰するようなスレッド(イベントを処理するスレッドなど)では、明示的な管理が不要であると判断される場合があります。 ただし、長時間実行されるエージェント・スレッドでは、明示的なローカル参照管理が必要になります(通常はJNI関数PushLocalFrameとPopLocalFrameを使用)。 逆に、ネイティブ・コードからの復帰後も参照を維持するには、それらをグローバル参照に変換する必要があります。 これらの規則はjmethodIDとjfieldIDには適用されません。これらはjobjectではないからです。
関数呼出しの必要条件
関数に、スレッドまたはVMを特定の状態(中断など)にするのはエージェントであると明示的に指定されていないかぎり、関数を実行するためにVMを一定の安全な状態にするのは、JVM TI実装になります。例外と関数
JVM TI関数から例外がスローされることはありません。エラー状態は関数の戻り値として伝えられます。 JVM TI関数が呼び出されている間、既存の例外状態はすべて維持されます。 例外の処理については、JNI仕様のJava例外に関するセクションを参照してください。関数の索引
- メモリー管理
- スレッド
- スレッド・グループ
- スタック・フレーム
- 早期復帰の強制
- ヒープ
- ヒープ (1.0)
- 局所変数
- ブレークポイント
- 監視されるフィールド
- Module
- クラス
- オブジェクト
- フィールド
- メソッド
- rawモニター
- JNI関数の遮断
- イベント管理
- 拡張機能メカニズム
- 権限
- タイマー
- クラス・ローダー検索
- システム・プロパティ
- 全般
- ヒープ・モニタリング
メモリー管理
メモリー管理関数: これらの関数は、JVM TI機能で使用されるメモリの割当て/割当て解除機能を備えており、エージェント用の作業メモリーを提供するために使用できます。 JVM TIで管理されるメモリーは、他のメモリー割当てライブラリやメカニズムとは互換性がありません。Allocate
jvmtiError
Allocate(jvmtiEnv* env,
jlong size,
unsigned char** mem_ptr)
JVM TIのアロケータを使用して、メモリーの領域を割り当てます。 割り当てられたメモリーは、Deallocateによって解放してください。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
46
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
size | jlong |
割り当てるバイト数。
原理の説明: |
mem_ptr | unsigned char** |
戻ったとき、割り当てられたメモリーの先頭を指すポインタ。 sizeがゼロの場合、NULLが返される。
エージェントはunsigned char*へのポインタを渡す。 戻ったとき、unsigned char*は、サイズsizeの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_OUT_OF_MEMORY | メモリー要求を履行できない。 |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
sizeがゼロより小さい。
|
JVMTI_ERROR_NULL_POINTER |
mem_ptrがNULL。
|
Deallocate
jvmtiError
Deallocate(jvmtiEnv* env,
unsigned char* mem)
JVM TIのアロケータを使用して、memを解放します。 この関数は、JVM TIの関数によって割り当てられて返されたメモリー(Allocateを使用して割り当てられたメモリーを含む)を解放するために使用します。 割り当てられたすべてのメモリーを解除するまで、メモリーを再生することはできません。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
47
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
mem | unsigned char * |
割り当てられたメモリーの先頭を指すポインタ。 「On return, the elements are set」は無視してよい。
エージェントは、unsigned charの配列を渡す。 配列の要素の値は無視される。 戻ったとき、要素が設定されている。 memがNULLの場合、呼出しが無視される。
|
エラー
この関数は、汎用エラーを返します
スレッド
スレッド関数:- スレッド状態の取得
- 現在のスレッドの取得
- すべてのスレッドの取得
- スレッドの中断
- スレッド・リストの中断
- すべての仮想スレッドの一時停止
- スレッドの再開
- スレッド・リストの再開
- すべての仮想スレッドを再開
- スレッドの停止
- スレッドの割り込み
- スレッド情報の取得
- 所有モニター情報の取得
- 所有モニターのスタックの深さ情報の取得
- 現在競合しているモニターの取得
- エージェント・スレッドの実行
- スレッド・ローカルな記憶領域の設定
- スレッド・ローカルな記憶領域の取得
-
jvmtiThreadInfo- スレッド情報構造体 -
jvmtiMonitorStackDepthInfo- モニター・スタック深さ情報構造体
jthreadは、「プラットフォーム・スレッド」または「仮想スレッド」へのJNI参照です。 一部の関数は仮想スレッドではサポートされず、仮想スレッドへの参照を使用して呼び出されるとJVMTI_ERROR_UNSUPPORTED_OPERATIONを返します。
スレッド状態の取得
jvmtiError
GetThreadState(jvmtiEnv* env,
jthread thread,
jint* thread_state_ptr)
スレッドの状態を取得します。 スレッドの状態は、以下の一連の質問に答えることでわかります。
-
活動状態か
-
活動状態ではない。
-
なぜ活動状態ではないか
- 新規であるため。
-
終了したため(
JVMTI_THREAD_STATE_TERMINATED)
-
なぜ活動状態ではないか
-
活動状態(
JVMTI_THREAD_STATE_ALIVE)-
中断したか
-
中断した(
JVMTI_THREAD_STATE_SUSPENDED) - 中断していない
-
中断した(
-
割り込みか
-
割り込み(
JVMTI_THREAD_STATE_INTERRUPTED) - 割込みでない。
-
割り込み(
-
ネイティブ・コード内か
-
ネイティブ・コード内(
JVMTI_THREAD_STATE_IN_NATIVE) - Javaプログラミング言語コード内
-
ネイティブ・コード内(
-
どの活動状態か
-
実行可能状態(
JVMTI_THREAD_STATE_RUNNABLE) -
ロックされている(
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) -
待機中(
JVMTI_THREAD_STATE_WAITING)- 待機時間は
-
待機理由は
-
Object.wait (
JVMTI_THREAD_STATE_IN_OBJECT_WAIT) -
LockSupport.park (
JVMTI_THREAD_STATE_PARKED) -
スリープ中(
JVMTI_THREAD_STATE_SLEEPING)
-
Object.wait (
-
実行可能状態(
-
中断したか
-
活動状態ではない。
次の定義は、JVM TIスレッド状態を
スレッド状態のフラグ 定数 値 説明 JVMTI_THREAD_STATE_ALIVE0x0001 スレッドは活動状態。 スレッドが新規(起動していない)または終了した場合は、0。 JVMTI_THREAD_STATE_TERMINATED0x0002 スレッドは実行を完了した。 JVMTI_THREAD_STATE_RUNNABLE0x0004 スレッドは実行可能。 JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER0x0400 スレッドは同期ブロック/メソッドの入力を待機しています。または、 Object.wait()の後は、同期ブロック/メソッドの再入力を待機しています。JVMTI_THREAD_STATE_WAITING0x0080 スレッドは待機中。 JVMTI_THREAD_STATE_WAITING_INDEFINITELY0x0010 スレッドはタイム・アウトなしで待機中。 たとえば、 Object.wait()。JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT0x0020 スレッドは、指定された最大待機時間で待機中。 たとえば、 Object.wait(long)。JVMTI_THREAD_STATE_SLEEPING0x0040 スレッドがスリープしています -- Thread.sleep。JVMTI_THREAD_STATE_IN_OBJECT_WAIT0x0100 スレッドはオブジェクト・モニターを待機中 - Object.wait。JVMTI_THREAD_STATE_PARKED0x0200 スレッドは一時停止中。 LockSupport.park、LockSupport.parkUtil、およびLockSupport.parkNanos。Thread.sleepでスリープ中の仮想スレッドは、JVMTI_THREAD_STATE_SLEEPINGの代わりにこの状態フラグを設定できます。JVMTI_THREAD_STATE_SUSPENDED0x100000 スレッドは中断関数 ( SuspendThreadなど)によって中断されます。 このビットが設定されている場合、他のビットはスレッドの中断前の状態を表します。JVMTI_THREAD_STATE_INTERRUPTED0x200000 スレッド割込みが発生した。 JVMTI_THREAD_STATE_IN_NATIVE0x400000 スレッドはネイティブ・コード内にある。つまり、VMまたはJavaプログラミング言語コードに呼び戻されなかったネイティブ・メソッドが実行中。 このフラグは、VMでコンパイルされたJavaプログラミング言語コードの実行中、VMコードの実行中、VMサポート・コードの実行中は設定されない。 JNIおよびJVM TI関数などのネイティブVMインタフェース関数は、VMコードとして実装することも可能。 JVMTI_THREAD_STATE_VENDOR_10x10000000 VMベンダーが定義する。 JVMTI_THREAD_STATE_VENDOR_20x20000000 VMベンダーが定義する。 JVMTI_THREAD_STATE_VENDOR_30x40000000 VMベンダーが定義する。
java.lang.Thread.State形式の状態に変換するために使用します。
Rules 質問に対する回答は多くても1つですが、回答がないこともあります(回答が不明であるか、該当しないか、どの回答も正しくないため)。 ある回答が設定されるのは、それを包含する回答が一致する場合のみです。 つまり、次のいずれか1つ以上は設定できません。
java.lang.Thread.State変換マスク 定数 値 説明 JVMTI_JAVA_LANG_THREAD_STATE_MASKJVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT 比較前に、この値で状態をマスクする JVMTI_JAVA_LANG_THREAD_STATE_NEW0 java.lang.Thread.State.NEWJVMTI_JAVA_LANG_THREAD_STATE_TERMINATEDJVMTI_THREAD_STATE_TERMINATED java.lang.Thread.State.TERMINATEDJVMTI_JAVA_LANG_THREAD_STATE_RUNNABLEJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE java.lang.Thread.State.RUNNABLEJVMTI_JAVA_LANG_THREAD_STATE_BLOCKEDJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER java.lang.Thread.State.BLOCKEDJVMTI_JAVA_LANG_THREAD_STATE_WAITINGJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY java.lang.Thread.State.WAITINGJVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITINGJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT java.lang.Thread.State.TIMED_WAITING
-
JVMTI_THREAD_STATE_RUNNABLE -
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER -
JVMTI_THREAD_STATE_WAITING
JVMTI_THREAD_STATE_ALIVEが設定されている場合、J2SETM準拠実装では、以上のいずれかが常に設定されます。 いずれかが設定されている場合は、包含する回答JVMTI_THREAD_STATE_ALIVEが設定されます。 以下のいずれか1つのみを
-
JVMTI_THREAD_STATE_WAITING_INDEFINITELY -
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
JVMTI_THREAD_STATE_WAITINGが設定されている場合、J2SETM準拠実装では、これらのいずれかが常に設定されます)。 いずれかが設定されている場合、包含する回答JVMTI_THREAD_STATE_ALIVEおよびJVMTI_THREAD_STATE_WAITINGが設定されます。 以下のいずれか1つのみを
-
JVMTI_THREAD_STATE_IN_OBJECT_WAIT -
JVMTI_THREAD_STATE_PARKED -
JVMTI_THREAD_STATE_SLEEPING
JVMTI_THREAD_STATE_ALIVEおよびJVMTI_THREAD_STATE_WAITINGが設定されます。 またJVMTI_THREAD_STATE_SLEEPINGが設定されている場合は、JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUTが設定されます。 状態Aが状態Bのメカニズムを使用して実装されている場合、この関数で返されるのは状態Aです。 たとえばThread.sleep(long)がObject.wait(long)を使用して実装されている場合は、返されるのはJVMTI_THREAD_STATE_SLEEPINGのままです。 以下は複数設定できます。
-
JVMTI_THREAD_STATE_SUSPENDED -
JVMTI_THREAD_STATE_INTERRUPTED -
JVMTI_THREAD_STATE_IN_NATIVE
JVMTI_THREAD_STATE_ALIVEが設定されます。
そして、JVMTI_THREAD_STATE_TERMINATEDはJVMTI_THREAD_STATE_ALIVEが設定されるまでは設定されません。
スレッド状態の表現は、将来のバージョンの仕様での拡張を前提に設計されています。スレッド状態の値を使用する際にはその点に留意すべきです(つまり、序数として使用すべきではない)。 ほとんどのクエリーは単一のビットをテストすることで行えますが、switch文で状態ビットを使用する必要がある場合には、状態ビットを対象のビットでマスクすべきです。 上で定義されていないビットはすべて、将来用として予約されたものです。 現在の仕様に準拠したVMは、予約ビットをゼロに設定する必要があります。 エージェントは予約ビットを無視すべきです。予約ビットは、ゼロであると仮定すべきではなく、したがって比較式に含めるべきではありません。
例
これから説明する値は、予約ビットとベンダー・ビットを除外しています。
synchronized文でブロックされたスレッドの状態は次のようになります。
JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
開始していないスレッドの状態は次のようになります。
0
Object.wait(3000)によるスレッドの状態は次のようになります。
JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_WAITING +
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
JVMTI_THREAD_STATE_MONITOR_WAITING
実行可能中に中断されたスレッドの状態は次のようになります。
JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_RUNNABLE + JVMTI_THREAD_STATE_SUSPENDED
状態のテスト
ほとんどの場合、スレッドの状態は該当する状態に対応する1ビットをテストすれば判明します。 たとえば、スレッドがスリープ状態かどうかをテストするコードは次のとおりです。
jint state;
jvmtiError err;
err = (*jvmti)->GetThreadState(jvmti, thread, &state);
if (err == JVMTI_ERROR_NONE) {
if (state & JVMTI_THREAD_STATE_SLEEPING) { ...
待機中(Object.wait、一時停止中、またはスリープ中)の場合は、次のとおりです。
if (state & JVMTI_THREAD_STATE_WAITING) { ...
状態によっては、複数ビットをテストする必要があります。スレッドが開始していないかどうかをテストする場合などです。
if ((state & (JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_TERMINATED)) == 0) { ...
時間指定した場合としていない場合のObject.waitを区別するには、次のようにします。
if (state & JVMTI_THREAD_STATE_IN_OBJECT_WAIT) {
if (state & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) {
printf("in Object.wait(long timeout)\n");
} else {
printf("in Object.wait()\n");
}
}
java.lang.Thread.Stateとの関係
java.lang.Thread.getState()から返されるjava.lang.Thread.Stateで示されるスレッドの状態は、この関数から返される情報のサブセットです。 対応するjava.lang.Thread.Stateは、指定された変換マスクを使用して決定できます。 たとえば、次のコードはjava.lang.Thread.Stateスレッド状態の名前を返します。
err = (*jvmti)->GetThreadState(jvmti, thread, &state);
abortOnError(err);
switch (state & JVMTI_JAVA_LANG_THREAD_STATE_MASK) {
case JVMTI_JAVA_LANG_THREAD_STATE_NEW:
return "NEW";
case JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED:
return "TERMINATED";
case JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE:
return "RUNNABLE";
case JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED:
return "BLOCKED";
case JVMTI_JAVA_LANG_THREAD_STATE_WAITING:
return "WAITING";
case JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING:
return "TIMED_WAITING";
}
ライブ段階でしか呼び出せない
いいえ
17
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
thread_state_ptr | jint* |
戻ったとき、スレッド状態フラグの定義に従って状態フラグをポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
thread_state_ptrがNULL。
|
現在のスレッドの取得
jvmtiError
GetCurrentThread(jvmtiEnv* env,
jthread* thread_ptr)
現在のスレッドを取得します。 現在のスレッドとは、この関数を呼び出したJavaプログラミング言語スレッドのことです。 can_generate_early_vmstart機能が有効で、java.lang.Threadクラスがまだ初期化されていない場合、ファンクションは開始フェーズでNULLを返すことがあります。
スレッドを引数に取るJVM TI関数のほとんどは、NULLを現在のスレッドを意味するものとして受け入れます。
開始またはライブ段階でしか呼び出せない
いいえ
18
1.1
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread_ptr | jthread* |
戻ったら、現在のスレッドまたはNULLをポイントします。
エージェントはjthreadへのポインタを渡す。 戻ったとき、jthreadが設定されている。 thread_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
thread_ptrがNULL。
|
すべてのスレッドの取得
jvmtiError
GetAllThreads(jvmtiEnv* env,
jint* threads_count_ptr,
jthread** threads_ptr)
VMにアタッチされているすべてのライブ・プラットフォーム・スレッドを取得します。 スレッドのリストには「エージェント・スレッド」が含まれます。 仮想スレッドは含まれません。 java.lang.Thread.isAlive()がtrueを返す場合、つまりスレッドが開始され、まだ終了していない場合、スレッドはライブになります。 スレッドの領域はJVM TI環境のコンテキストによって決まりますが、それは通常、VMに接続されたすべてのスレッドになります。
ライブ段階でしか呼び出せない
いいえ
4
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
threads_count_ptr | jint* |
戻り時にスレッドの数を示します。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
threads_ptr | jthread** |
戻り時には、スレッドごとに1つずつ参照の配列を指します。
エージェントはjthread*へのポインタを渡す。 戻ったとき、jthread*は、サイズ*threads_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 threads_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
threads_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
threads_ptrがNULL。
|
スレッドの中断
jvmtiError
SuspendThread(jvmtiEnv* env,
jthread thread)
指定されたスレッドを中断します。 呼出し側スレッドが指定されている場合、この関数は、ほかのスレッドがResumeThreadを呼び出すまで戻りません。 スレッドが現在中断されている場合、この関数は何も行わず、エラーを返します。
ライブ段階でしか呼び出せない
いいえ
5
1.0
| 権限 | 効果 |
|---|---|
can_suspend | スレッドを中断し、再開できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
中断するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_suspendを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_THREAD_SUSPENDED | スレッドはすでに中断されている。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
スレッド・リストの中断
jvmtiError
SuspendThreadList(jvmtiEnv* env,
jint request_count,
const jthread* request_list,
jvmtiError* results)
request_list配列に指定されたrequest_count個のスレッドを中断します。 スレッドの再開には、ResumeThreadListまたはResumeThreadを使用します。 request_list配列に呼出し側スレッドが指定されている場合、この関数は、ほかのスレッドによって再開されるまで戻りません。 スレッドの一時停止で発生したエラーは、この関数の戻り値ではなく、results配列で返されます。 現在中断しているスレッドの状態は変わりません。
ライブ段階でしか呼び出せない
いいえ
92
1.0
| 権限 | 効果 |
|---|---|
can_suspend | スレッドを中断し、再開できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
request_count | jint | 中断するスレッドの数。 |
request_list | const jthread* |
中断するスレッドのリスト。
エージェントはjthreadのrequest_count要素の配列を渡す。 |
results | jvmtiError* |
エージェントによって提供されたrequest_count要素の配列。 戻ったとき、対応するスレッドの中断のエラー・コードが入っている。 スレッドがこの呼出しによって中断した場合、エラー・コードはJVMTI_ERROR_NONEになる。 その他のエラー・コードは、SuspendThreadに指定されたエラー・コード。
エージェントは、jvmtiErrorのrequest_count要素を十分保持できる大きさの配列を渡す。 配列の要素の値は無視される。 戻ったとき、要素が設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_suspendを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
request_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
request_listがNULL。
|
JVMTI_ERROR_NULL_POINTER |
resultsがNULL。
|
すべての仮想スレッドの一時停止
jvmtiError
SuspendAllVirtualThreads(jvmtiEnv* env,
jint except_count,
const jthread* except_list)
例外リストにあるものを除くすべての仮想スレッドを中断します。 現在一時停止されている仮想スレッドは状態を変更しません。 仮想スレッドは、ResumeAllVirtualThreads、ResumeThreadListまたはResumeThreadを使用して再開できます。
ライブ段階でしか呼び出せない
いいえ
118
21
| 権限 | 効果 |
|---|---|
can_suspend | スレッドを中断し、再開できる。 |
can_support_virtual_threads | 仮想スレッドをサポートできる |
| 名前 | 型 | 説明 |
|---|---|---|
except_count | jint | 中断されないスレッドのリスト内のスレッド数。 |
except_list | const jthread * |
中断されないスレッドのリスト。
エージェントは、jthreadのexcept_count要素の配列を渡します。 except_listがNULLの場合、except_count == 0の場合はエラーではありません。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_suspendを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境には機能can_support_virtual_threadsがありません。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_THREAD |
except_listのスレッドが無効でした。
|
JVMTI_ERROR_NULL_POINTER |
except_listは両方ともNULLで、except_countはゼロ以外でした。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
except_countは0未満です。
|
スレッドの再開
jvmtiError
ResumeThread(jvmtiEnv* env,
jthread thread)
中断されているスレッドの実行を再開します。 JVM TI中断関数(例、SuspendThread)によって現在一時停止されているスレッドは、実行を再開します。他のすべてのスレッドは影響を受けません。
ライブ段階でしか呼び出せない
いいえ
6
1.0
| 権限 | 効果 |
|---|---|
can_suspend | スレッドを中断し、再開できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread | 再開するスレッド。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_suspendを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されていない。 |
JVMTI_ERROR_INVALID_TYPESTATE | スレッドの状態が変更されたため、不整合が生じている。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
スレッド・リストの再開
jvmtiError
ResumeThreadList(jvmtiEnv* env,
jint request_count,
const jthread* request_list,
jvmtiError* results)
request_list配列に指定されたrequest_count個のスレッドを再開します。 JVM TI中断関数(例、 SuspendThreadList)によって一時停止されたスレッドは、実行を再開します。
ライブ段階でしか呼び出せない
いいえ
93
1.0
| 権限 | 効果 |
|---|---|
can_suspend | スレッドを中断し、再開できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
request_count | jint | 再開するスレッドの数。 |
request_list | const jthread* |
再開するスレッド。
エージェントはjthreadのrequest_count要素の配列を渡す。 |
results | jvmtiError* |
エージェントによって提供されたrequest_count要素の配列。 戻ったとき、対応するスレッドの再開のエラー・コードが入っている。 スレッドがこの呼出しによって中断した場合、エラー・コードはJVMTI_ERROR_NONEになる。 その他のエラー・コードは、ResumeThreadに指定されたエラー・コード。
エージェントは、jvmtiErrorのrequest_count要素を十分保持できる大きさの配列を渡す。 配列の要素の値は無視される。 戻ったとき、要素が設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_suspendを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
request_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
request_listがNULL。
|
JVMTI_ERROR_NULL_POINTER |
resultsがNULL。
|
すべての仮想スレッドを再開
jvmtiError
ResumeAllVirtualThreads(jvmtiEnv* env,
jint except_count,
const jthread* except_list)
例外リストにあるものを除くすべての仮想スレッドを再開します。 現在再開されている仮想スレッドは状態を変更しません。 仮想スレッドは、SuspendAllVirtualThreads、SuspendThreadListまたはSuspendThreadを使用して一時停止できます。
ライブ段階でしか呼び出せない
いいえ
119
21
| 権限 | 効果 |
|---|---|
can_suspend | スレッドを中断し、再開できる。 |
can_support_virtual_threads | 仮想スレッドをサポートできる |
| 名前 | 型 | 説明 |
|---|---|---|
except_count | jint | 再開されないスレッドのリスト内のスレッド数。 |
except_list | const jthread * |
再開されないスレッドのリスト。
エージェントは、jthreadのexcept_count要素の配列を渡します。 except_listがNULLの場合、except_count == 0の場合はエラーではありません。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_suspendを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境には機能can_support_virtual_threadsがありません。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_THREAD |
except_listのスレッドが無効でした。
|
JVMTI_ERROR_NULL_POINTER |
except_listは両方ともNULLで、except_countはゼロ以外でした。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
except_countは0未満です。
|
スレッドの停止
jvmtiError
StopThread(jvmtiEnv* env,
jthread thread,
jobject exception)
指定された非同期の例外を指定されたスレッドに送信します。
ライブ段階でしか呼び出せない
いいえ
7
1.0
| 権限 | 効果 |
|---|---|
can_signal_thread | スレッドに停止または割込み信号を送信できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
停止するスレッド。 StopThread関数は、イベントで一時停止されている仮想スレッドに非同期例外を送信するために使用できます。 実装では、中断された仮想スレッドへの非同期例外の送信がサポートされている場合があります。
|
exception | jobject | 非同期の例外オブジェクト。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_signal_threadを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは仮想スレッドであり、中断されておらず、現在のスレッドではありませんでした。 |
JVMTI_ERROR_OPAQUE_FRAME | スレッドは一時停止中の仮想スレッドであり、実装は現在のフレームから非同期例外をスローできませんでした。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_INVALID_OBJECT |
exceptionがオブジェクトではない。
|
スレッドの割込み
jvmtiError
InterruptThread(jvmtiEnv* env,
jthread thread)
指定されたスレッドに割り込みます(java.lang.Thread.interruptと同様)。
ライブ段階でしか呼び出せない
いいえ
8
1.0
| 権限 | 効果 |
|---|---|
can_signal_thread | スレッドに停止または割込み信号を送信できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread | 割り込むスレッド。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_signal_threadを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
スレッド情報の取得
スレッド情報を取得します。typedef struct { char* name; jint priority; jboolean is_daemon; jthreadGroup thread_group; jobject context_class_loader; } jvmtiThreadInfo;jvmtiError GetThreadInfo(jvmtiEnv* env, jthread thread, jvmtiThreadInfo* info_ptr)
jvmtiThreadInfo構造体のフィールドに、指定されたスレッドの詳細が入ります。
ライブ段階でしか呼び出せない
いいえ
9
1.0
権限
必要な機能
| フィールド | 型 | 説明 |
|---|---|---|
name | char* | スレッド名。修正UTF-8文字列としてエンコードされる。 |
priority | jint |
スレッドの優先順位。 スレッド優先順位定数jvmtiThreadPriorityを参照。 仮想スレッドの優先度は常にJVMTI_THREAD_NORM_PRIORITYです。
|
is_daemon | jboolean |
デーモン・スレッドかどうか 仮想スレッドのデーモン・ステータスは常にJNI_TRUEです。
|
thread_group | jthreadGroup |
このスレッドが属するスレッド・グループ。 スレッドが終了している場合、NULL 。
|
context_class_loader | jobject | このスレッドに関連付けられているコンテキスト・クラス・ローダー。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
info_ptr | jvmtiThreadInfo* |
戻ったとき、指定されたスレッドについての情報が入っている。
エージェントはjvmtiThreadInfoへのポインタを渡す。 戻ったとき、jvmtiThreadInfoが設定されている。 jvmtiThreadInfoのnameフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiThreadInfoのフィールドthread_groupで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。 jvmtiThreadInfoのフィールドcontext_class_loaderで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
info_ptrがNULL。
|
所有モニター情報の取得
jvmtiError
GetOwnedMonitorInfo(jvmtiEnv* env,
jthread thread,
jint* owned_monitor_count_ptr,
jobject** owned_monitors_ptr)
指定されたスレッドが所有するモニターについての情報を取得します。
ライブ段階でしか呼び出せない
いいえ
10
1.0
| 権限 | 効果 |
|---|---|
can_get_owned_monitor_info |
モニターの所有に関する情報を取得できる - GetOwnedMonitorInfo
|
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
owned_monitor_count_ptr | jint* |
返されるモニターの数。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
owned_monitors_ptr | jobject** |
所有されるモニターの配列。
エージェントはjobject*へのポインタを渡す。 戻ったとき、jobject*は、サイズ*owned_monitor_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 owned_monitors_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_owned_monitor_infoを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_NULL_POINTER |
owned_monitor_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
owned_monitors_ptrがNULL。
|
所有モニターのスタックの深さ情報の取得
指定されたスレッドが所有するモニターに関する情報と、それらのモニターをロックしているスタック・フレームの深さを取得します。typedef struct { jobject monitor; jint stack_depth; } jvmtiMonitorStackDepthInfo;jvmtiError GetOwnedMonitorStackDepthInfo(jvmtiEnv* env, jthread thread, jint* monitor_info_count_ptr, jvmtiMonitorStackDepthInfo** monitor_info_ptr)
ライブ段階でしか呼び出せない
いいえ
153
1.1
| 権限 | 効果 |
|---|---|
can_get_owned_monitor_stack_depth_info |
所有されているモニターに関する情報とスタックの深さを取得できる - GetOwnedMonitorStackDepthInfo
|
| フィールド | 型 | 説明 |
|---|---|---|
monitor | jobject | 所有されるモニター。 |
stack_depth | jint |
スタックの深さ。 スタック・フレーム関数で使用されるスタックの深さに対応している。 つまり、0は現在のフレームを、1は現在のフレームを呼び出したフレームをそれぞれ表す。 また、実装がスタックの深さを判断できない場合は - 1になる(JNIのMonitorEnterを使って取得されたモニターの場合など)。
|
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
monitor_info_count_ptr | jint* |
返されるモニターの数。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
monitor_info_ptr | jvmtiMonitorStackDepthInfo ** |
所有されるモニターの深さ情報の配列。
エージェントはjvmtiMonitorStackDepthInfo*へのポインタを渡す。 戻ったとき、jvmtiMonitorStackDepthInfo*は、サイズ*monitor_info_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 jvmtiMonitorStackDepthInfoのフィールドmonitorで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_owned_monitor_stack_depth_infoを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_NULL_POINTER |
monitor_info_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
monitor_info_ptrがNULL。
|
現在競合しているモニターの取得
jvmtiError
GetCurrentContendedMonitor(jvmtiEnv* env,
jthread thread,
jobject* monitor_ptr)
指定されたスレッドが、java.lang.Object.waitを使ってオブジェクトのモニターに入るか、モニターを獲得し直すのを待機している場合に、そのオブジェクトを取得します。
ライブ段階でしか呼び出せない
いいえ
11
1.0
| 権限 | 効果 |
|---|---|
can_get_current_contended_monitor |
GetCurrentContendedMonitorが可能
|
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
monitor_ptr | jobject* |
戻ったとき、現在競合しているモニターが入っている。そのようなモニターがない場合はNULLが入っている。
エージェントはjobjectへのポインタを渡す。 戻ったとき、jobjectが設定されている。 monitor_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_current_contended_monitorを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_NULL_POINTER |
monitor_ptrがNULL。
|
エージェント起動関数
typedef void (JNICALL *jvmtiStartFunction)
(jvmtiEnv* jvmti_env,
JNIEnv* jni_env,
void* arg);
エージェントによって提供されるコールバック関数。 この関数は、RunAgentThreadで開始されるエージェント・スレッドのエントリ・ポイントになります。
| 名前 | 型 | 説明 |
|---|---|---|
jvmti_env | jvmtiEnv * | JVM TI環境。 |
jni_env | JNIEnv * | JNI環境。 |
arg | void * |
RunAgentThreadに渡されたargパラメータ。
|
エージェント・スレッドの実行
jvmtiError
RunAgentThread(jvmtiEnv* env,
jthread thread,
jvmtiStartFunction proc,
const void* arg,
jint priority)
指定されたネイティブ関数を使って、エージェント・スレッドの実行を開始します。 パラメータargは起動関数 (procで指定)の単一の引数として転送されます。 この関数により、java.lang.Threadの特別なサブクラスやjava.lang.Runnableの実装側をロードせずに、別のプロセスとの通信処理またはイベント処理用のエージェント・スレッドを作成できます。 その代わり、作成されたスレッドは完全にネイティブ・コード内で実行できます。 ただし、作成するスレッドには、java.lang.Threadの新しく作成されたインスタンス(引数threadによって参照される)が必要で、そのインスタンスにスレッドを関連付けます。 スレッド・オブジェクトは、JNI呼出しで作成できます。
次に一般的なスレッド優先順位を参考として示します。
新しいスレッドは、指定の
スレッド優先順位定数 定数 値 説明 JVMTI_THREAD_MIN_PRIORITY1 いちばん低い優先順位 JVMTI_THREAD_NORM_PRIORITY5 中間の優先順位 JVMTI_THREAD_MAX_PRIORITY10 いちばん高い優先順位
priorityで、デーモン・スレッドとして起動されます。 有効な場合は、ThreadStartイベントが送信されます。
スレッドが開始されたため、スレッドがただちに終了しないかぎり、この関数が返されるとスレッドはライブになります。
このスレッドのスレッド・グループは無視されます。具体的には、このスレッドは、スレッド・グループに追加されず、Javaプログラミング言語、JVM TIのいずれのレベルでもスレッド・グループのクエリーには表示されません。
このスレッドは、Javaプログラミング言語のクエリーでは表示されませんが、GetAllThreadsやGetAllStackTracesなど、JVM TIのクエリーには含まれます。
procを実行すると、新しいスレッドがVMにアタッチされます -- 「VMへの接続」のJNIドキュメントを参照してください。
ライブ段階でしか呼び出せない
いいえ
12
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
実行するスレッド。 threadは仮想スレッドではない可能性があります。 そうしないと、エラー・コードJVMTI_ERROR_UNSUPPORTED_OPERATIONが返されます。
|
proc | jvmtiStartFunction | 起動関数。 |
arg | const void * |
起動関数の引数。
エージェントがポインタを渡す。 argがNULLの場合、起動関数にNULLが渡される。
|
priority | jint |
開始されるスレッドの優先順位。 java.lang.Thread.setPriorityで許可されているスレッド優先順位を使用できる(jvmtiThreadPriorityの優先順位を含む)。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_PRIORITY |
priorityがJVMTI_THREAD_MIN_PRIORITYより低いかJVMTI_THREAD_MAX_PRIORITYより高い
|
JVMTI_ERROR_UNSUPPORTED_OPERATION |
threadは仮想スレッドです。
|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
procがNULL。
|
スレッド・ローカルな記憶領域の設定
jvmtiError
SetThreadLocalStorage(jvmtiEnv* env,
jthread thread,
const void* data)
VMは、個々の環境スレッド・ペアに関連付けられているポインタ値を格納します。 このポインタ値をスレッド・ローカルな記憶領域と呼びます。 この関数で設定されない場合、値はNULLになります。 エージェントは、スレッド固有の情報を格納するため、メモリーを割り当てることができます。 スレッド・ローカルな記憶領域を設定することにより、GetThreadLocalStorageを使ってアクセスできるようになります。
この関数は、JVM TIのスレッド・ローカルな記憶領域の値を設定するため、エージェントによって呼び出されます。 JVM TIは、エージェントに対して、スレッドごとの情報を記録するために利用できる、ポインタ・サイズのスレッド・ローカルな記憶領域を提供します。
開始またはライブ段階でしか呼び出せない
いいえ
103
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
このスレッドを格納する。 threadがNULLの場合、現在のスレッドが使用される。
|
data | const void * |
スレッド・ローカルな記憶領域に入力する値。
エージェントがポインタを渡す。 dataがNULLの場合、値はNULLに設定される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
スレッド・ローカルな記憶領域の取得
jvmtiError
GetThreadLocalStorage(jvmtiEnv* env,
jthread thread,
void** data_ptr)
JVM TIのスレッド・ローカルな記憶領域の値を取得するため、エージェントによって呼び出されます。
開始またはライブ段階でしか呼び出せない
いいえ
102
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
このスレッドから取得する。 threadがNULLの場合、現在のスレッドが使用される。
|
data_ptr | void** |
スレッド・ローカルな記憶領域の値を返すポインタ。 スレッド・ローカルな記憶領域がSetThreadLocalStorageで設定されていない場合、返されるポインタはNULL。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_NULL_POINTER |
data_ptrがNULL。
|
スレッド・グループ
スレッド・グループ関数: スレッド・グループの型:-
jvmtiThreadGroupInfo- スレッド・グループ情報構造体
トップ・レベルのスレッド・グループの取得
jvmtiError
GetTopThreadGroups(jvmtiEnv* env,
jint* group_count_ptr,
jthreadGroup** groups_ptr)
VM内のトップ・レベルの(親がない)スレッド・グループをすべて返します。
ライブ段階でしか呼び出せない
いいえ
13
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
group_count_ptr | jint* |
戻ったとき、トップ・レベルのスレッド・グループの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
groups_ptr | jthreadGroup** |
戻ったとき、トップ・レベルのスレッド・グループの配列を指すポインタを参照する。
エージェントはjthreadGroup*へのポインタを渡す。 戻ったとき、jthreadGroup*は、サイズ*group_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 groups_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
group_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
groups_ptrがNULL。
|
スレッド・グループ情報の取得
スレッド・グループの情報を取得します。typedef struct { jthreadGroup parent; char* name; jint max_priority; jboolean is_daemon; } jvmtiThreadGroupInfo;jvmtiError GetThreadGroupInfo(jvmtiEnv* env, jthreadGroup group, jvmtiThreadGroupInfo* info_ptr)
jvmtiThreadGroupInfo構造体のフィールドに、指定されたスレッド・グループの詳細が入ります。
ライブ段階でしか呼び出せない
いいえ
14
1.0
権限
必要な機能
| フィールド | 型 | 説明 |
|---|---|---|
parent | jthreadGroup | 親スレッド・グループ。 |
name | char* | スレッド・グループの名前。修正UTF-8文字列としてエンコードされる。 |
max_priority | jint | このスレッド・グループの最高の優先順位。 |
is_daemon | jboolean | デーモン・スレッド・グループかどうか。 |
| 名前 | 型 | 説明 |
|---|---|---|
group | jthreadGroup | 照会するスレッド・グループ。 |
info_ptr | jvmtiThreadGroupInfo* |
戻ったとき、指定されたスレッド・グループについての情報が入っている。
エージェントはjvmtiThreadGroupInfoへのポインタを渡す。 戻ったとき、jvmtiThreadGroupInfoが設定されている。 jvmtiThreadGroupInfoのフィールドparentで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。 jvmtiThreadGroupInfoのnameフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD_GROUP |
groupはスレッド・グループ・オブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
info_ptrがNULL。
|
子スレッド・グループの取得
jvmtiError
GetThreadGroupChildren(jvmtiEnv* env,
jthreadGroup group,
jint* thread_count_ptr,
jthread** threads_ptr,
jint* group_count_ptr,
jthreadGroup** groups_ptr)
このスレッド・グループ内のライブ・プラットフォーム・スレッドと子スレッド・グループを取得します。 仮想スレッドはこの関数によって返されません。
ライブ段階でしか呼び出せない
いいえ
15
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
group | jthreadGroup | 照会するグループ。 |
thread_count_ptr | jint* |
戻ったとき、このスレッド・グループ内のライブ・スレッドの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
threads_ptr | jthread** |
戻ったとき、このスレッド・グループ内のライブ・スレッドの配列をポイントする。
エージェントはjthread*へのポインタを渡す。 戻ったとき、jthread*は、サイズ*thread_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 threads_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
group_count_ptr | jint* |
戻り時に、子スレッド・グループの数を示します
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
groups_ptr | jthreadGroup** |
戻り時に、子スレッド・グループの配列を指し示します。
エージェントはjthreadGroup*へのポインタを渡す。 戻ったとき、jthreadGroup*は、サイズ*group_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 groups_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD_GROUP |
groupはスレッド・グループ・オブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
thread_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
threads_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
group_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
groups_ptrがNULL。
|
スタック・フレーム
スタック・フレーム関数: スタック・フレームの型:-
jvmtiFrameInfo- スタック・フレーム情報構造体 -
jvmtiStackInfo- スタック情報構造体
main()やrun()よりも深い位置に表示されるフレームが存在する可能性があります。 ただしこの表現は、スタック・フレームやスタックの深さを使用するすべてのJVM TI機能の間で一貫している必要があります。
スタック・フレーム情報構造体
スタック・フレームに関する情報は次の構造体で戻されます。typedef struct { jmethodID method; jlocation location; } jvmtiFrameInfo;
jvmtiFrameInfo- スタック・フレーム情報構造体フィールド 型 説明 methodjmethodIDこのフレーム内で実行されているメソッド。 locationjlocationこのフレーム内で実行されている命令のインデックス。フレームがネイティブ・メソッドを実行している場合は -1。
スタック情報構造体
スタック・フレーム・セットに関する情報は次の構造体で戻されます。typedef struct { jthread thread; jint state; jvmtiFrameInfo* frame_buffer; jint frame_count; } jvmtiStackInfo;
jvmtiStackInfo- スタック情報構造体フィールド 型 説明 threadjthread戻ったとき、トレースされたスレッド。 statejint戻ったとき、スレッドの状態。 GetThreadStateを参照。frame_bufferjvmtiFrameInfo *戻ったとき、このエージェントによって割り当てられたバッファに、スタック・フレーム情報が入っている。 frame_countjint戻ったとき、レコード数が frame_bufferに入っている。 これはmin(max_frame_count, stackDepth)になる。
スタック・トレースの取得
jvmtiError
GetStackTrace(jvmtiEnv* env,
jthread thread,
jint start_depth,
jint max_frame_count,
jvmtiFrameInfo* frame_buffer,
jint* count_ptr)
あるスレッドのスタックに関する情報を取得します。 max_frame_countがスタックの深さより小さい場合、max_frame_countのいちばん上のフレームが返され、それ以外の場合はスタック全体が返されます。 最後に呼び出されたフレームである最上位フレームが、返されるバッファの先頭になります。
次の例では、いちばん上のフレームから5つめまでのフレームが返されます。さらに、フレームがある場合は、現在実行しているメソッドの名前が出力されます。
jvmtiFrameInfo frames[5];
jint count;
jvmtiError err;
err = (*jvmti)->GetStackTrace(jvmti, aThread, 0, 5,
frames, &count);
if (err == JVMTI_ERROR_NONE && count >= 1) {
char *methodName;
err = (*jvmti)->GetMethodName(jvmti, frames[0].method,
&methodName, NULL, NULL);
if (err == JVMTI_ERROR_NONE) {
printf("Executing method: %s", methodName);
}
}
threadは、中断することなく、この関数を呼び出すことができます。
位置と行番号のマッピングには、GetLineNumberTable関数を使用できます。 このマッピングは、遅延してもかまいません。
ライブ段階でしか呼び出せない
いいえ
104
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
このスレッドのスタック・トレースをフェッチする。 threadがNULLの場合、現在のスレッドが使用される。
|
start_depth | jint |
フレームの取得をこの深さから開始する。 負でない場合は現在のフレームからカウントし、最初に取得されるフレームは深さstart_depthになる。 たとえば、0の場合は現在のフレームから開始し、1の場合は現在のフレームの呼出し元から開始し、2の場合は現在のフレームの呼出し元の呼出し元から開始する、といった具合になる。 負の場合、もっとも古いフレームの下からカウントし、最初に取得されるフレームは深さstackDepth + start_depthになる(stackDepthはスタックのフレーム数)。 たとえば、マイナス1の場合はもっとも古いフレームのみが取得され、マイナス2の場合はもっとも古いフレームから呼び出されたフレームから開始する。
|
max_frame_count | jint |
取得するjvmtiFrameInfoレコードの最大数。
|
frame_buffer | jvmtiFrameInfo * |
戻ったとき、このエージェントによって割り当てられたバッファに、スタック・フレーム情報が入っている。
エージェントは、jvmtiFrameInfoのmax_frame_count要素を十分保持できる大きさの配列を渡す。 配列の要素の値は無視される。 戻ったとき、要素の*count_ptrが設定される。 |
count_ptr | jint* |
戻ったとき、情報を入力されるレコードの数をポイントする。 start_depthが負の数でない場合、min(max_frame_count, stackDepth - start_depth)。 start_depthが負の数の場合、min(max_frame_count, -start_depth)。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
start_depthが正で、stackDepthと等しいかそれよりも大きい。 または、start_depthが負で、-stackDepthよりも小さい。
|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
max_frame_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
frame_bufferがNULL。
|
JVMTI_ERROR_NULL_POINTER |
count_ptrがNULL。
|
すべてのスタック・トレースの取得
jvmtiError
GetAllStackTraces(jvmtiEnv* env,
jint max_frame_count,
jvmtiStackInfo** stack_info_ptr,
jint* thread_count_ptr)
VMにアタッチされているすべてのライブ・プラットフォーム・スレッドのスタック・トレースを取得します。 リストには、「エージェント・スレッド」のスタック・トレースが含まれています。 仮想スレッドのスタック・トレースは含まれません。
max_frame_countがスタックの深さより小さい場合、そのスレッドについてmax_frame_countのいちばん上のフレームが返され、それ以外の場合はスタック全体が返されます。 最後に呼び出されたフレームである最上位フレームが、返されるバッファの先頭になります。
すべてのスタックは、同時に収集されます。つまり、あるスレッドのサンプリングと次のスレッドのサンプリングとの間には、スレッドの状態またはスタックに変更は発生しません。 スレッドを中断する必要はありません。
jvmtiStackInfo *stack_info;
jint thread_count;
int ti;
jvmtiError err;
err = (*jvmti)->GetAllStackTraces(jvmti, MAX_FRAMES, &stack_info, &thread_count);
if (err != JVMTI_ERROR_NONE) {
...
}
for (ti = 0; ti < thread_count; ++ti) {
jvmtiStackInfo *infop = &stack_info[ti];
jthread thread = infop->thread;
jint state = infop->state;
jvmtiFrameInfo *frames = infop->frame_buffer;
int fi;
myThreadAndStatePrinter(thread, state);
for (fi = 0; fi < infop->frame_count; fi++) {
myFramePrinter(frames[fi].method, frames[fi].location);
}
}
/* this one Deallocate call frees all data allocated by GetAllStackTraces */
err = (*jvmti)->Deallocate(jvmti, stack_info);
ライブ段階でしか呼び出せない
いいえ
100
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
max_frame_count | jint |
スレッドごとに取得するjvmtiFrameInfoレコードの最大数。
|
stack_info_ptr | jvmtiStackInfo ** |
戻ったときに、このバッファに各スレッドのスタック情報が入っている。 jvmtiStackInfoのレコード数は、thread_count_ptrで決定される。
このバッファは、jvmtiStackInfo.frame_bufferでポイントされたjvmtiFrameInfoバッファを含むように割り当てられている。 これらのバッファは、別々に解放してはならない。
エージェントはjvmtiStackInfo*へのポインタを渡す。 戻り時に、jvmtiStackInfo*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 jvmtiStackInfoのフィールドthreadで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
thread_count_ptr | jint* |
トレースされたスレッドの数。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
max_frame_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
stack_info_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
thread_count_ptrがNULL。
|
スレッド・リストのスタック・トレースの取得
jvmtiError
GetThreadListStackTraces(jvmtiEnv* env,
jint thread_count,
const jthread* thread_list,
jint max_frame_count,
jvmtiStackInfo** stack_info_ptr)
指定されたスレッドのスタックに関する情報を取得します。 max_frame_countがスタックの深さより小さい場合、そのスレッドについてmax_frame_countのいちばん上のフレームが返され、それ以外の場合はスタック全体が返されます。 最後に呼び出されたフレームである最上位フレームが、返されるバッファの先頭になります。
すべてのスタックは、同時に収集されます。つまり、あるスレッドのサンプリングと次のスレッドのサンプリングとの間には、スレッドの状態またはスタックに変更は発生しません。 スレッドを中断する必要はありません。
スレッドがまだ起動されていないか、スタック情報が収集される前にスレッドが終了した場合は、長さ0のスタック(jvmtiStackInfo.frame_countが0)が返されるため、スレッドjvmtiStackInfo.stateをチェックできます。
例は、同様な関数GetAllStackTracesを参照してください。
ライブ段階でしか呼び出せない
いいえ
101
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread_count | jint | トレースするスレッドの数。 |
thread_list | const jthread* |
トレースするスレッドのリスト。
エージェントはjthreadのthread_count要素の配列を渡す。 |
max_frame_count | jint |
スレッドごとに取得するjvmtiFrameInfoレコードの最大数。
|
stack_info_ptr | jvmtiStackInfo ** |
戻ったときに、このバッファに各スレッドのスタック情報が入っている。 jvmtiStackInfoのレコード数は、thread_countで決定される。
このバッファは、jvmtiStackInfo.frame_bufferでポイントされたjvmtiFrameInfoバッファを含むように割り当てられている。 これらのバッファは、別々に解放してはならない。
エージェントはjvmtiStackInfo*へのポインタを渡す。 戻ったとき、jvmtiStackInfo*は、サイズ*thread_countの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 jvmtiStackInfoのフィールドthreadで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
スレッド・オブジェクトでない要素がthread_list内に存在する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
thread_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
thread_listがNULL。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
max_frame_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
stack_info_ptrがNULL。
|
フレーム・カウントの取得
jvmtiError
GetFrameCount(jvmtiEnv* env,
jthread thread,
jint* count_ptr)
指定されたスレッドの呼出しスタックに現在入っているフレームの数を取得します。
アクティブにバイト・コードを実行しているスレッド(現在のスレッドではなく、中断されていないスレッドなど)のためにこの関数が呼び出された場合、一時的な情報が返されます。
ライブ段階でしか呼び出せない
いいえ
16
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
count_ptr | jint* |
戻ったとき、呼出しスタック内のフレームの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_NULL_POINTER |
count_ptrがNULL。
|
フレームのポップ
jvmtiError
PopFrame(jvmtiEnv* env,
jthread thread)
threadスタックの現在のフレームをポップします。 フレームをポップすると、直前のフレームに戻ります。 スレッドが再開されると、スレッドの実行状態は、メソッドが呼び出される直前の状態にリセットされます。 Java™仮想マシン仕様の用語で説明すると、次のようになります。
- 現在のフレームが破棄され、以前のフレームが現在のフレームになる
-
オペランド・スタックは回復します。引数が再度追加され、呼出しが
invokestaticではなかった場合、objectrefも再度追加されます。 - Java仮想マシンのPCが呼出し命令の操作コード(opcode)へ回復する
PopFrameの呼び出しとスレッドの再開の間、スタックの状態は未定義です。 最初のフレームよりも前にフレームをポップするには、次の3つのステップを繰り返す必要があります。
- イベントを通じてスレッドを中断する(ステップ、ブレークポイントなど)
-
PopFrameを呼び出す - スレッドを再開する
synchronizedメソッドの場合)と、被呼出しメソッド内のsynchronizedブロックに入ることによって獲得されたロックは解放されます。 ノート: これは、ネイティブ・ロックやjava.util.concurrent.locksロックには適用されません。
最終的に、ブロックは実行されません。
グローバル状態への変更には対応しないので、変更は行われません。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
被呼出しメソッドと呼出し側のメソッドのどちらも、非ネイティブのJavaプログラミング言語のメソッドとします。
この関数は、JVM TIイベントを生成しません。
ライブ段階でしか呼び出せない
いいえ
80
1.0
| 権限 | 効果 |
|---|---|
can_pop_frame |
スタックからフレームをポップできる - PopFrame
|
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
ポップする現在のフレームのスレッド。 PopFrame関数は、イベントで一時停止されている仮想スレッドの現在のフレームをポップするために使用できます。 実装では、中断された仮想スレッドの現在のフレームのポップがサポートされる場合があります。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_pop_frameを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME | 呼出し先メソッドまたは呼出し側メソッドがネイティブ・メソッドである。 実装がこのフレームをポップできない。 |
JVMTI_ERROR_OPAQUE_FRAME | スレッドは一時停止中の仮想スレッドであり、実装は現在のフレームをポップできませんでした。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_NO_MORE_FRAMES | 呼出しスタック上のスタック・フレームの数が、2個より少ない。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
フレームの位置の取得
jvmtiError
GetFrameLocation(jvmtiEnv* env,
jthread thread,
jint depth,
jmethodID* method_ptr,
jlocation* location_ptr)
Javaプログラミング言語のフレームについて、現在実行中の命令の位置を返します。
ライブ段階でしか呼び出せない
いいえ
19
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 照会するフレームの深さ。 |
method_ptr | jmethodID* |
戻ったとき、現在の位置のメソッドをポイントする。
エージェントはjmethodIDへのポインタを渡す。 戻ったとき、jmethodIDが設定されている。 |
location_ptr | jlocation* |
戻ったとき、現在実行中の命令のインデックスをポイントする。 フレームがネイティブ・メソッドを実行している場合は-1に設定される。
エージェントはjlocationへのポインタを渡す。 戻ったとき、jlocationが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_NULL_POINTER |
method_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
location_ptrがNULL。
|
フレームのポップの通知
jvmtiError
NotifyFramePop(jvmtiEnv* env,
jthread thread,
jint depth)
深さdepthのフレームがスタックからポップされたとき、FramePopイベントを生成します。 詳細は、FramePopイベントの説明を参照してください。 非ネイティブJavaプログラミング言語のメソッドに対応するフレームだけが通知を受信できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
20
1.0
| 権限 | 効果 |
|---|---|
can_generate_frame_pop_events |
FramePopイベントを設定し、取得できる。
|
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
フレームのポップ・イベントが生成されるフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | フレームのポップ・イベントが生成されるフレームの深さ。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_generate_frame_pop_eventsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME |
depthのフレームはネイティブ・メソッドを実行している。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
早期復帰の強制
早期復帰の強制の関数:- 早期復帰の強制 - オブジェクト型
- 早期復帰の強制 - 整数型
- 早期復帰の強制 - 長整数型
- 早期復帰の強制 - 浮動小数点数型
- 早期復帰の強制 - 倍精度浮動小数点数型
- 早期復帰の強制 - void型
synchronizedメソッドの場合)と、被呼出しメソッド内のsynchronizedブロックに入ることによって獲得されたロックは解放されます。 ノート: これは、ネイティブ・ロックやjava.util.concurrent.locksロックには適用されません。
通常復帰の場合と同様に、MethodExitなどのイベントが生成されます。
被呼出しメソッドは、非ネイティブのJavaプログラミング言語のメソッドとします。 スタック上にフレームが1つだけある状態でスレッドへの強制復帰を行なった場合、スレッドが再開時に終了します。
早期復帰の強制 - オブジェクト型
jvmtiError
ForceEarlyReturnObject(jvmtiEnv* env,
jthread thread,
jobject value)
この関数を使うと、結果の型がObjectまたはObjectのサブクラスであるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
81
1.1
| 権限 | 効果 |
|---|---|
can_force_early_return | 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
現在のフレームが早期復帰するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
value | jobject |
被呼出しフレームの戻り値。 オブジェクトまたはNULL。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_force_early_returnを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME | ネイティブ・メソッドに対応するフレームからの早期復帰が試みられた。 スレッドは中断された仮想スレッドであり、実装は現在のフレームを強制的に返すことができませんでした。 または、実装がこのフレーム上でこの機能を提供できない。 |
JVMTI_ERROR_TYPE_MISMATCH |
被呼出しメソッドの結果の型が、Objectでも、Objectのサブクラスでもない。
|
JVMTI_ERROR_TYPE_MISMATCH |
指定されたvalueと、被呼出しメソッドの結果の型に互換性がない。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_NO_MORE_FRAMES | 呼出しスタックにこれ以上のフレームがない。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_INVALID_OBJECT |
valueがオブジェクトではない。
|
早期復帰の強制 - 整数型
jvmtiError
ForceEarlyReturnInt(jvmtiEnv* env,
jthread thread,
jint value)
この関数を使うと、結果の型がint、short、char、byte、booleanのいずれかであるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
82
1.1
| 権限 | 効果 |
|---|---|
can_force_early_return | 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
現在のフレームが早期復帰するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
value | jint | 被呼出しフレームの戻り値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_force_early_returnを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME | ネイティブ・メソッドに対応するフレームからの早期復帰が試みられた。 スレッドは中断された仮想スレッドであり、実装は現在のフレームを強制的に返すことができませんでした。 または、実装がこのフレーム上でこの機能を提供できない。 |
JVMTI_ERROR_TYPE_MISMATCH |
被呼出しメソッドの結果の型がint、short、char、byte、booleanのいずれでもない。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_NO_MORE_FRAMES | 呼出しスタックにフレームがない。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
早期復帰の強制 - 長整数型
jvmtiError
ForceEarlyReturnLong(jvmtiEnv* env,
jthread thread,
jlong value)
この関数を使うと、結果の型がlongであるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
83
1.1
| 権限 | 効果 |
|---|---|
can_force_early_return | 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
現在のフレームが早期復帰するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
value | jlong | 被呼出しフレームの戻り値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_force_early_returnを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME | ネイティブ・メソッドに対応するフレームからの早期復帰が試みられた。 スレッドは中断された仮想スレッドであり、実装は現在のフレームを強制的に返すことができませんでした。 または、実装がこのフレーム上でこの機能を提供できない。 |
JVMTI_ERROR_TYPE_MISMATCH |
被呼出しメソッドの結果の型がlongではない。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_NO_MORE_FRAMES | 呼出しスタックにフレームがない。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
早期復帰の強制 - 浮動小数点数型
jvmtiError
ForceEarlyReturnFloat(jvmtiEnv* env,
jthread thread,
jfloat value)
この関数を使うと、結果の型がfloatであるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
84
1.1
| 権限 | 効果 |
|---|---|
can_force_early_return | 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
現在のフレームが早期復帰するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
value | jfloat | 被呼出しフレームの戻り値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_force_early_returnを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME | ネイティブ・メソッドに対応するフレームからの早期復帰が試みられた。 スレッドは中断された仮想スレッドであり、実装は現在のフレームを強制的に返すことができませんでした。 または、実装がこのフレーム上でこの機能を提供できない。 |
JVMTI_ERROR_TYPE_MISMATCH |
被呼出しメソッドの結果の型がfloatではない。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_NO_MORE_FRAMES | 呼出しスタックにフレームがない。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
早期復帰の強制 - 倍精度浮動小数点数型
jvmtiError
ForceEarlyReturnDouble(jvmtiEnv* env,
jthread thread,
jdouble value)
この関数を使うと、結果の型がdoubleであるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
85
1.1
| 権限 | 効果 |
|---|---|
can_force_early_return | 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
現在のフレームが早期復帰するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
value | jdouble | 被呼出しフレームの戻り値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_force_early_returnを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME | ネイティブ・メソッドに対応するフレームからの早期復帰が試みられた。 スレッドは中断された仮想スレッドであり、実装は現在のフレームを強制的に返すことができませんでした。 または、実装がこのフレーム上でこの機能を提供できない。 |
JVMTI_ERROR_TYPE_MISMATCH |
被呼出しメソッドの結果の型がdoubleではない。
|
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_NO_MORE_FRAMES | 呼出しスタックにフレームがない。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
早期復帰の強制 - void型
jvmtiError
ForceEarlyReturnVoid(jvmtiEnv* env,
jthread thread)
この関数を使うと、結果の型を持たないメソッドから復帰できます。 つまり、被呼出しメソッドがvoidと宣言されていなければいけません。
ライブ段階でしか呼び出せない
いいえ
86
1.1
| 権限 | 効果 |
|---|---|
can_force_early_return | 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
現在のフレームが早期復帰するスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_force_early_returnを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_OPAQUE_FRAME | ネイティブ・メソッドに対応するフレームからの早期復帰が試みられた。 スレッドは中断された仮想スレッドであり、実装は現在のフレームを強制的に返すことができませんでした。 または、実装がこのフレーム上でこの機能を提供できない。 |
JVMTI_ERROR_TYPE_MISMATCH | 被呼出しメソッドが結果の型を持っている。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_NO_MORE_FRAMES | 呼出しスタックにフレームがない。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
ヒープ
ヒープ関数: ヒープの関数型: ヒープの型:-
jvmtiHeapReferenceKind- ヒープ参照の列挙 -
jvmtiPrimitiveType- プリミティブ型の列挙 -
jvmtiHeapReferenceInfoField- フィールド参照用の参照情報構造体 -
jvmtiHeapReferenceInfoArray- 配列参照用の参照情報構造体 -
jvmtiHeapReferenceInfoConstantPool- 定数プール参照用の参照情報構造体 -
jvmtiHeapReferenceInfoStackLocal- 局所変数参照用の参照情報構造体 -
jvmtiHeapReferenceInfoJniLocal- JNIローカル参照用の参照情報構造体 -
jvmtiHeapReferenceInfoReserved- その他の参照用の参照情報構造体 -
jvmtiHeapReferenceInfo- 参照情報構造体 -
jvmtiHeapCallbacks- ヒープ・コールバック関数構造体
オブジェクトのタグ
タグは、オブジェクトに関連付けられる値です。 タグは、エージェントにより、SetTag関数を使用して明示的に設定されます。または、jvmtiHeapIterationCallbackなどのコールバック関数によって設定されます。
タグは環境に対してローカルです。つまり、ある環境のタグを別の環境で表示することはできません。
jlong値であるタグを使えば、オブジェクトを単純にマークしたり、詳細情報へのポインタを格納したりできます。 タグ付けされていないオブジェクトのタグはゼロになります。 タグをゼロに設定すると、オブジェクトのタグ付けが解除されます。
ヒープ・コールバック関数
ヒープ関数は、ヒープ内での反復処理とオブジェクト参照の再帰的な追跡を行い、エージェントが指定したコールバック関数を使って情報提供を行います。 これらのヒープ・コールバック関数は次の制限に準拠する必要があります。これらのコールバックはJNI関数を使用してはいけません。 これらのコールバックは、コールバック安全な関数(そのような使用を明確に許可している関数)以外のJVM TI関数を使用してはいけません(rawモニター関数、メモリー管理関数、環境ローカル・ストレージ関数を参照)。 実装は、内部スレッド上または反復関数を呼び出したスレッド上で、コールバックを呼び出せます。 ヒープ・コールバックはシングル・スレッドです。一度に呼び出されるコールバックの数は最大1個になります。 ヒープ・フィルタ・フラグを使うと、オブジェクトまたはそのクラスのタグの状態に基づいて報告を行わないようにすることができます。 フラグが設定されていない場合(jintがゼロの場合)、オブジェクトのフィルタ・リングは行われません。
ヒープ・コールバックによって返されるヒープ・ビジット制御フラグを使うと、反復処理を中止できます。 また、ヒープ参照コールバックは、トラバース対象となる参照のグラフを取り除くために使うこともできます(
ヒープ・フィルタ・フラグ 定数 値 説明 JVMTI_HEAP_FILTER_TAGGED0x4 タグ付きのオブジェクトをフィルタ・リングする。 タグの付いたオブジェクトが除外される。 JVMTI_HEAP_FILTER_UNTAGGED0x8 タグなしのオブジェクトをフィルタ・リングする。 タグの付いていないオブジェクトが除外される。 JVMTI_HEAP_FILTER_CLASS_TAGGED0x10 タグ付きのクラスを持つオブジェクトをフィルタ・リングする。 タグの付いたクラスのオブジェクトが除外される。 JVMTI_HEAP_FILTER_CLASS_UNTAGGED0x20 タグなしのクラスを持つオブジェクトをフィルタ・リングする。 タグの付いていないクラスのオブジェクトが除外される。
JVMTI_VISIT_OBJECTSを設定しない)。
ヒープ参照の列挙は、報告対象の参照の種類を記述する目的で、ヒープ参照コールバックとプリミティブ・フィールド・コールバックによって提供されます。
ヒープ・ビジット制御フラグ 定数 値 説明 JVMTI_VISIT_OBJECTS0x100 あるオブジェクトをビジットする際にこのコールバックが FollowReferencesによって起動されたものであった場合、そのオブジェクトの参照をトラバースする。 それ以外の場合は無視される。JVMTI_VISIT_ABORT0x8000 反復処理を中止。 ほかのすべてのビットを無視する。
プリミティブ型の単一文字型記述子の定義。
ヒープ参照の列挙( jvmtiHeapReferenceKind)定数 値 説明 JVMTI_HEAP_REFERENCE_CLASS1 オブジェクトからそのクラスへの参照。 JVMTI_HEAP_REFERENCE_FIELD2 オブジェクトから、そのオブジェクトのいずれかのインスタンス・フィールド値への参照。 JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT3 配列から、その配列のいずれかの要素への参照。 JVMTI_HEAP_REFERENCE_CLASS_LOADER4 クラスからそのクラス・ローダーへの参照。 JVMTI_HEAP_REFERENCE_SIGNERS5 クラスからその署名者の配列への参照。 JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN6 クラスからその保護ドメインへの参照。 JVMTI_HEAP_REFERENCE_INTERFACE7 クラスから、そのクラスのいずれかのインタフェースへの参照。 ノート: インタフェースは定数プール参照経由で定義されるため、参照されたインタフェースは参照の種類が JVMTI_HEAP_REFERENCE_CONSTANT_POOLで報告される可能性もある。JVMTI_HEAP_REFERENCE_STATIC_FIELD8 クラスからそのいずれかのstaticフィールド値への参照。 JVMTI_HEAP_REFERENCE_CONSTANT_POOL9 クラスから定数プール内の解決済みエントリへの参照。 JVMTI_HEAP_REFERENCE_SUPERCLASS10 クラスからそのスーパー・クラスへの参照。 スーパークラスが java.lang.Objectの場合、コールバックは送信されません。 ノート: ロードされたクラスは定数プール参照経由でスーパー・クラスを定義するため、参照されたスーパー・クラスは参照の種類がJVMTI_HEAP_REFERENCE_CONSTANT_POOLで報告される可能性もある。JVMTI_HEAP_REFERENCE_JNI_GLOBAL21 ヒープ・ルート参照: JNIグローバル参照。 JVMTI_HEAP_REFERENCE_SYSTEM_CLASS22 ヒープ・ルート参照: システム・クラス。 JVMTI_HEAP_REFERENCE_MONITOR23 ヒープ・ルート参照: モニター。 JVMTI_HEAP_REFERENCE_STACK_LOCAL24 スレッド・スタックのローカル変数。 JVMTI_HEAP_REFERENCE_JNI_LOCAL25 JNIローカル参照。 JVMTI_HEAP_REFERENCE_THREAD26 ヒープ・ルート参照: スレッド。 JVMTI_HEAP_REFERENCE_OTHER27 ヒープ・ルート参照: ほかのヒープ・ルート参照。
プリミティブ型の列挙( jvmtiPrimitiveType)定数 値 説明 JVMTI_PRIMITIVE_TYPE_BOOLEAN90 「Z」- Javaプログラミング言語の boolean- JNIのjbooleanJVMTI_PRIMITIVE_TYPE_BYTE66 「B」- Javaプログラミング言語の byte- JNIのjbyteJVMTI_PRIMITIVE_TYPE_CHAR67 「C」- Javaプログラミング言語の char- JNIのjcharJVMTI_PRIMITIVE_TYPE_SHORT83 「S」- Javaプログラミング言語の short- JNIのjshortJVMTI_PRIMITIVE_TYPE_INT73 「I」- Javaプログラミング言語の int- JNIのjintJVMTI_PRIMITIVE_TYPE_LONG74 「J」- Javaプログラミング言語の long- JNIのjlongJVMTI_PRIMITIVE_TYPE_FLOAT70 「F」- Javaプログラミング言語の float- JNIのjfloatJVMTI_PRIMITIVE_TYPE_DOUBLE68 「D」- Javaプログラミング言語の double- JNIのjdouble
フィールド参照用の参照情報構造体
JVMTI_HEAP_REFERENCE_FIELDおよびJVMTI_HEAP_REFERENCE_STATIC_FIELD参照に対して返される参照情報。
typedef struct { jint index; } jvmtiHeapReferenceInfoField;
jvmtiHeapReferenceInfoField- フィールド参照用の参照情報構造体フィールド 型 説明 indexjintJVMTI_HEAP_REFERENCE_FIELDの場合、参照側オブジェクトはクラスまたはインタフェースではありません。 この場合、indexは、参照側オブジェクトのクラスに含まれるフィールドのインデックスです。 以降、このクラスをCと呼びます。JVMTI_HEAP_REFERENCE_STATIC_FIELDの場合、参照側オブジェクトは、クラス(以降Cと呼ぶ)とインタフェース(以降Iと呼ぶ)のいずれかになります。 この場合、indexは、そのクラスまたはインタフェースに含まれるフィールドのインデックスです。 参照側オブジェクトがインタフェースでない場合、フィールドのインデックスは次のようにして決定されます。参照側オブジェクトがインタフェースである場合、フィールドのインデックスは次のようにして決定されます。
- Cとそのスーパー・クラスに含まれるすべてのフィールドのリストが作成されます。このリストは、
java.lang.Object内のすべてのフィールドで始まり、C内のすべてのフィールドで終わります。- このリスト内で、指定されたクラスのフィールドが
GetClassFieldsから返された順番に並べられます。- このリスト内のフィールドに、インデックスn、n+1、... が順に割り当てられます。nは、Cによって実装されたすべてのインタフェースに含まれるフィールドのカウント数です。 Cは、そのスーパークラスが直接実装しているすべてのインタフェースと、それらのインタフェースのすべてのスーパーインタフェースを実装しています。
この計算には、フィールド修飾子(static、public、privateなど)の種類にかかわらず、すべてのフィールドが含まれます。 たとえば、次のようなクラスとインタフェースが指定されているとします。
- I内で直接宣言されているフィールドのリストが作成されます。
- このリスト内のフィールドが
GetClassFieldsから返された順番に並べられます。- このリスト内のフィールドに、インデックスn、n+1、... が順に割り当てられます。nは、Iのすべてのスーパー・インタフェースに含まれるフィールドのカウント数です。
interface I0 { int p = 0; } interface I1 extends I0 { int x = 1; } interface I2 extends I0 { int y = 2; } class C1 implements I1 { public static int a = 3; private int b = 4; } class C2 extends C1 implements I2 { static int q = 5; final int r = 6; }C1で呼び出されたGetClassFieldsから、C1のフィールドa、bがこの順番で返され、C2のフィールドq、rがこの順番で返されるものとします。 クラスC1のインスタンスのフィールド・インデックスは、次のようになります。クラス
フィールド 索引 説明 a 2 C1が実装するインタフェース内のフィールドのカウント数は2 (n=2)です。つまり、I0のpとI1のxです。b 3 後続のインデックス。 C1も同じフィールド・インデックスを持ちます。 クラスC2のインスタンスのフィールド・インデックスは、次のようになります。クラス
フィールド 索引 説明 a 3 C2が実装するインタフェース内のフィールドのカウント数は3 (n=3)です。つまり、I0のp、I1のx、I2のy(C2のインタフェース)です。I0のフィールドpが含まれるのは、一度のみです。b 4 「a」に続くインデックス。 q 5 「b」に続くインデックス。 r 6 「q」に続くインデックス。 C2も同じフィールド・インデックスを持ちます。 上記のフィールド「a」のように、同じフィールドが、参照側オブジェクトごとに異なるインデックスを持つ可能性があります。 また、コールバックからすべてのフィールド・インデックスが可視になるわけではありませんが、ここでは説明のためにすべてのインデックスを示しています。 インタフェースI1も同じフィールド・インデックスを持ちます。
フィールド 索引 説明 x 1 I1のスーパー・インタフェース内のフィールドのカウント数は1 (n=1)です。つまり、I0のpです。
配列参照用の参照情報構造体
JVMTI_HEAP_REFERENCE_ARRAY_ELEMENTの参照に対して返される参照情報。
typedef struct { jint index; } jvmtiHeapReferenceInfoArray;
jvmtiHeapReferenceInfoArray- 配列参照用の参照情報構造体フィールド 型 説明 indexjint配列のインデックス。
定数プール参照用の参照情報構造体
JVMTI_HEAP_REFERENCE_CONSTANT_POOLの参照に対して返される参照情報。
typedef struct { jint index; } jvmtiHeapReferenceInfoConstantPool;
jvmtiHeapReferenceInfoConstantPool- 定数プール参照用の参照情報構造体フィールド 型 説明 indexjintクラスの定数プール内のインデックス。 Java™仮想マシン仕様のセクション4.4を参照。
局所変数参照用の参照情報構造体
JVMTI_HEAP_REFERENCE_STACK_LOCALの参照に対して返される参照情報。
typedef struct { jlong thread_tag; jlong thread_id; jint depth; jmethodID method; jlocation location; jint slot; } jvmtiHeapReferenceInfoStackLocal;
jvmtiHeapReferenceInfoStackLocal- 局所変数参照用の参照情報構造体フィールド 型 説明 thread_tagjlongこのスタックに対応するスレッドのタグ。タグ付けされていない場合はゼロ。 thread_idjlongこのスタックに対応するスレッドの一意のスレッドID。 depthjintフレームの深さ。 methodjmethodIDこのフレーム内で実行されているメソッド。 locationjlocationこのフレーム内で現在実行されている位置。 slotjint局所変数のスロット番号。
JNIローカル参照用の参照情報構造体
JVMTI_HEAP_REFERENCE_JNI_LOCALの参照に対して返される参照情報。
typedef struct { jlong thread_tag; jlong thread_id; jint depth; jmethodID method; } jvmtiHeapReferenceInfoJniLocal;
jvmtiHeapReferenceInfoJniLocal- JNIローカル参照用の参照情報構造体フィールド 型 説明 thread_tagjlongこのスタックに対応するスレッドのタグ。タグ付けされていない場合はゼロ。 thread_idjlongこのスタックに対応するスレッドの一意のスレッドID。 depthjintフレームの深さ。 methodjmethodIDこのフレーム内で実行されているメソッド。
その他の参照用の参照情報構造体
その他の参照に対して返される参照情報。typedef struct { jlong reserved1; jlong reserved2; jlong reserved3; jlong reserved4; jlong reserved5; jlong reserved6; jlong reserved7; jlong reserved8; } jvmtiHeapReferenceInfoReserved;
jvmtiHeapReferenceInfoReserved- その他の参照用の参照情報構造体フィールド 型 説明 reserved1jlong将来の使用のために予約済み。 reserved2jlong将来の使用のために予約済み。 reserved3jlong将来の使用のために予約済み。 reserved4jlong将来の使用のために予約済み。 reserved5jlong将来の使用のために予約済み。 reserved6jlong将来の使用のために予約済み。 reserved7jlong将来の使用のために予約済み。 reserved8jlong将来の使用のために予約済み。
参照情報構造体
参照側に関して返される情報。 各種参照情報の共用体として表されます。typedef union { jvmtiHeapReferenceInfoField field; jvmtiHeapReferenceInfoArray array; jvmtiHeapReferenceInfoConstantPool constant_pool; jvmtiHeapReferenceInfoStackLocal stack_local; jvmtiHeapReferenceInfoJniLocal jni_local; jvmtiHeapReferenceInfoReserved other; } jvmtiHeapReferenceInfo;
jvmtiHeapReferenceInfo- 参照情報構造体フィールド 型 説明 fieldjvmtiHeapReferenceInfoFieldJVMTI_HEAP_REFERENCE_FIELDおよびJVMTI_HEAP_REFERENCE_STATIC_FIELD参照の参照側情報。arrayjvmtiHeapReferenceInfoArrayJVMTI_HEAP_REFERENCE_ARRAY_ELEMENT参照の参照側情報。constant_pooljvmtiHeapReferenceInfoConstantPoolJVMTI_HEAP_REFERENCE_CONSTANT_POOL参照の参照側情報。stack_localjvmtiHeapReferenceInfoStackLocalJVMTI_HEAP_REFERENCE_STACK_LOCAL参照の参照側情報。jni_localjvmtiHeapReferenceInfoJniLocalJVMTI_HEAP_REFERENCE_JNI_LOCAL参照の参照側情報。otherjvmtiHeapReferenceInfoReserved将来の使用のために予約済み。
ヒープ・コールバック関数構造体
typedef struct { jvmtiHeapIterationCallback heap_iteration_callback; jvmtiHeapReferenceCallback heap_reference_callback; jvmtiPrimitiveFieldCallback primitive_field_callback; jvmtiArrayPrimitiveValueCallback array_primitive_value_callback; jvmtiStringPrimitiveValueCallback string_primitive_value_callback; jvmtiReservedCallback reserved5; jvmtiReservedCallback reserved6; jvmtiReservedCallback reserved7; jvmtiReservedCallback reserved8; jvmtiReservedCallback reserved9; jvmtiReservedCallback reserved10; jvmtiReservedCallback reserved11; jvmtiReservedCallback reserved12; jvmtiReservedCallback reserved13; jvmtiReservedCallback reserved14; jvmtiReservedCallback reserved15; } jvmtiHeapCallbacks;
jvmtiHeapCallbacks- ヒープ・コールバック関数構造体フィールド 型 説明 heap_iteration_callbackjvmtiHeapIterationCallbackヒープ内のオブジェクトを記述するために呼び出されるコールバック。 IterateThroughHeap関数によって使用され、FollowReferences関数によって無視されます。heap_reference_callbackjvmtiHeapReferenceCallbackオブジェクト参照を記述するために呼び出されるコールバック。 FollowReferences関数によって使用され、IterateThroughHeap関数によって無視されます。primitive_field_callbackjvmtiPrimitiveFieldCallbackプリミティブ・フィールドを記述するために呼び出されるコールバック。 array_primitive_value_callbackjvmtiArrayPrimitiveValueCallbackプリミティブ値の配列を記述するために呼び出されるコールバック。 string_primitive_value_callbackjvmtiStringPrimitiveValueCallbackString値を記述するために呼び出されるコールバック。 reserved5jvmtiReservedCallback将来の使用のために予約済み。 reserved6jvmtiReservedCallback将来の使用のために予約済み。 reserved7jvmtiReservedCallback将来の使用のために予約済み。 reserved8jvmtiReservedCallback将来の使用のために予約済み。 reserved9jvmtiReservedCallback将来の使用のために予約済み。 reserved10jvmtiReservedCallback将来の使用のために予約済み。 reserved11jvmtiReservedCallback将来の使用のために予約済み。 reserved12jvmtiReservedCallback将来の使用のために予約済み。 reserved13jvmtiReservedCallback将来の使用のために予約済み。 reserved14jvmtiReservedCallback将来の使用のために予約済み。 reserved15jvmtiReservedCallback将来の使用のために予約済み。
原理の説明: ヒープ・ダンプ機能(下記)では、オブジェクトごとにコールバックが使用されます。 バッファ方式の方がスループットが高いように思われますが、テストでは、そのような結果は得られません。メモリー参照の場所または配列アクセスのオーバーヘッドによるものと考えられます。
ヒープ反復コールバック
typedef jint (JNICALL *jvmtiHeapIterationCallback)
(jlong class_tag,
jlong size,
jlong* tag_ptr,
jint length,
void* user_data);
エージェントによって提供されるコールバック関数。 ヒープ内のオブジェクトを記述しますが、値は渡しません。
この関数は、必要なビジット制御フラグのビット・ベクトルを返すはずです。 これにより、反復処理の全体を中止すべきかどうかが決まります(JVMTI_VISIT_OBJECTSフラグは無視される)。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
class_tag | jlong |
オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 オブジェクトが実行時クラスを表す場合、class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
size | jlong |
オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
length | jint | このオブジェクトが配列である場合はその配列の長さ。 それ以外の場合はマイナス1 (-1)。 |
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
ヒープ参照コールバック
typedef jint (JNICALL *jvmtiHeapReferenceCallback)
(jvmtiHeapReferenceKind reference_kind,
const jvmtiHeapReferenceInfo* reference_info,
jlong class_tag,
jlong referrer_class_tag,
jlong size,
jlong* tag_ptr,
jlong* referrer_tag_ptr,
jint length,
void* user_data);
エージェントによって提供されるコールバック関数。 あるオブジェクトまたはVM (参照側)から別のオブジェクト(参照先)への参照、またはあるヒープ・ルートからある参照先への参照を記述します。
この関数は、必要なビジット制御フラグのビット・ベクトルを返すはずです。 これにより、参照先が参照しているオブジェクトをビジットすべきかどうかや、反復処理の全体を中止すべきかどうかが決まります。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
reference_kind | jvmtiHeapReferenceKind | 参照の種類。 |
reference_info | const jvmtiHeapReferenceInfo * |
参照に関する詳細。 reference_kindがJVMTI_HEAP_REFERENCE_FIELD、JVMTI_HEAP_REFERENCE_STATIC_FIELD、JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT、JVMTI_HEAP_REFERENCE_CONSTANT_POOL、JVMTI_HEAP_REFERENCE_STACK_LOCAL、またはJVMTI_HEAP_REFERENCE_JNI_LOCALの場合に設定される。 それ以外の場合はNULL。
|
class_tag | jlong |
参照されるオブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 参照先オブジェクトが実行時クラスを表す場合、class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
referrer_class_tag | jlong |
参照側オブジェクトのクラスのタグ(クラスにタグが付いていないか参照先がヒープ・ルートである場合はゼロ)。 参照側オブジェクトが実行時クラスを表す場合、referrer_class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
size | jlong |
参照されるオブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
参照オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
referrer_tag_ptr | jlong* |
参照元オブジェクトのタグをポイントする(参照元オブジェクトがタグ付けされていない場合はゼロをポイントする)。 参照元がオブジェクトでない場合(つまり、このコールバックの報告対象がヒープ・ルートである場合)はNULL。 参照元オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。 このコールバックの報告対象が、あるオブジェクトからそれ自身への参照である場合、referrer_tag_ptr == tag_ptrとなる。
|
length | jint | このオブジェクトが配列である場合はその配列の長さ。 それ以外の場合はマイナス1 (-1)。 |
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
プリミティブ・フィールド・コールバック
typedef jint (JNICALL *jvmtiPrimitiveFieldCallback)
(jvmtiHeapReferenceKind kind,
const jvmtiHeapReferenceInfo* info,
jlong object_class_tag,
jlong* object_tag_ptr,
jvalue value,
jvmtiPrimitiveType value_type,
void* user_data);
あるオブジェクト(オブジェクト)のプリミティブ・フィールドを記述する、エージェントによって提供されるコールバック関数。 プリミティブ・フィールドとは、型がプリミティブ型であるフィールドのことです。 このコールバックは、オブジェクトがクラスの場合はstaticフィールドを、それ以外の場合はインスタンス・フィールドをそれぞれ記述します。
この関数は、必要なビジット制御フラグのビット・ベクトルを返すはずです。 これにより、反復処理の全体を中止すべきかどうかが決まります(JVMTI_VISIT_OBJECTSフラグは無視される)。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
kind | jvmtiHeapReferenceKind |
フィールドの種類 -- インスタンスまたはstatic (JVMTI_HEAP_REFERENCE_FIELDまたはJVMTI_HEAP_REFERENCE_STATIC_FIELD)。
|
info | const jvmtiHeapReferenceInfo * | どのフィールドか(フィールドのインデックス)。 |
object_class_tag | jlong |
オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 オブジェクトが実行時クラスを表す場合、object_class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
object_tag_ptr | jlong* |
オブジェクトのタグ(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
value | jvalue | フィールドの値。 |
value_type | jvmtiPrimitiveType | フィールドの型。 |
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
配列プリミティブ値コールバック
typedef jint (JNICALL *jvmtiArrayPrimitiveValueCallback)
(jlong class_tag,
jlong size,
jlong* tag_ptr,
jint element_count,
jvmtiPrimitiveType element_type,
const void* elements,
void* user_data);
エージェントによって提供されるコールバック関数。 プリミティブ型の配列内の値を記述します。
この関数は、必要なビジット制御フラグのビット・ベクトルを返すはずです。 これにより、反復処理の全体を中止すべきかどうかが決まります(JVMTI_VISIT_OBJECTSフラグは無視される)。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
class_tag | jlong | 配列オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 |
size | jlong |
配列のサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
配列オブジェクトのタグ(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
element_count | jint | プリミティブ配列の長さ。 |
element_type | jvmtiPrimitiveType | 配列の要素の型。 |
elements | const void* |
配列の要素。この配列は、element_typeのサイズを持つelement_count個の項目から成るパック配列となる。
|
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
文字列プリミティブ値コールバック
typedef jint (JNICALL *jvmtiStringPrimitiveValueCallback)
(jlong class_tag,
jlong size,
jlong* tag_ptr,
const jchar* value,
jint value_length,
void* user_data);
エージェントによって提供されるコールバック関数。 java.lang.Stringの値を記述します。
この関数は、必要なビジット制御フラグのビット・ベクトルを返すはずです。 これにより、反復処理の全体を中止すべきかどうかが決まります(JVMTI_VISIT_OBJECTSフラグは無視される)。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
class_tag | jlong | Stringクラスのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 |
size | jlong |
文字列のサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
Stringオブジェクトのタグ(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
value | const jchar* | Stringの値。Unicode文字列としてエンコードされる。 |
value_length | jint | 文字列の長さ。 この長さは、文字列内の16ビットUnicode文字の数に等しくなる。 |
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
将来使用するために予約されたコールバック
typedef jint (JNICALL *jvmtiReservedCallback)
();
プレースホルダー -- 将来の使用のために予約済み。
パラメータ
なし
参照の追跡
jvmtiError
FollowReferences(jvmtiEnv* env,
jint heap_filter,
jclass klass,
jobject initial_object,
const jvmtiHeapCallbacks* callbacks,
const void* user_data)
この関数は、指定されたオブジェクトから直接的、間接的に到達可能なオブジェクト(initial_objectが指定されなかった場合はヒープ・ルートから到達可能なすべてのオブジェクト)に対してトラバーサルを開始します。 ヒープ・ルートは、システム・クラス、JNIグローバル、プラットフォーム・スレッド・スタックからの参照、およびガベージ・コレクションの目的でルートとして使用されるその他のオブジェクトのセットです。
この関数は、参照グラフをトラバースすることで動作します。 A、B、...がオブジェクトを表すとします。 AからBへの参照がトラバースされた場合、ヒープ・ルートからBへの参照がトラバースされた場合、またはBがinitial_objectとして指定された場合に、Bがビジットされたと言います。 AからBへの参照がトラバースされるのは、Aがビジットされた後です。 参照の報告順序は、参照のトラバース順序と同じになります。 オブジェクト参照の報告は、エージェントから提供されたコールバック関数jvmtiHeapReferenceCallbackを呼び出すことで行われます。 AからBへの参照で、Aは参照元、Bは参照先と呼ばれます。 コールバックの呼出しは、参照元からの参照ごとに1回ずつ行われます。これは、参照循環が存在する場合や参照元へのパスが複数存在する場合でも言えることです。 参照元と参照先との間に参照が複数存在する可能性もありますが、その場合はそれぞれの参照が報告されます。 これらの参照を区別するには、jvmtiHeapReferenceCallbackコールバックのreference_kindおよびreference_infoパラメータを確認します。
この関数が報告するのは、オブジェクト参照のJavaプログラミング言語ビューであり、仮想マシン実装ビューではありません。 次のオブジェクト参照が報告されます(nullではない場合)。
- インスタンス・オブジェクトは、各非プリミティブ・インスタンス・フィールド(継承されたフィールドも含む)への参照を報告します。
- インスタンス・オブジェクトは、そのオブジェクトの型(クラス)への参照を報告します。
- クラスは、スーパー・クラスへの参照と、直接実装または拡張したインタフェースへの参照を報告します。
- クラスは、クラス・ローダー、保護ドメイン、署名者、および定数プール内の解決済みエントリへの参照を報告します。
- クラスは、直接宣言された各非プリミティブstaticフィールドへの参照を報告します。
- 配列は、その配列の型(クラス)と各配列要素への参照を報告する。
- プリミティブ配列は、その配列の型への参照を報告します。
jvmtiArrayPrimitiveValueCallbackまたはjvmtiStringPrimitiveValueCallbackが呼び出されます。 あるプリミティブ・フィールドが報告されるのは、そのフィールドを含むオブジェクトがビジットされた後です。その報告時には、エージェントが提供するコールバック関数jvmtiPrimitiveFieldCallbackが呼び出されます。
コールバックが提供されるかNULLであるかは、そのコールバックが呼び出されるかどうかだけを決定し、どのオブジェクトがビジットされるかや、ほかのコールバックが呼び出されるかどうかには影響しません。 ただし、jvmtiHeapReferenceCallbackから返されるビジット制御フラグは、現在のオブジェクトが参照しているオブジェクトをビジットするかどうかを決定します。 この関数のパラメータとして提供されるヒープ・フィルタ・フラグとklassは、ビジットされるオブジェクトは制御しませんが、コールバックによって報告されるオブジェクトおよびプリミティブ値は制御します。 たとえば、設定された唯一のコールバックがarray_primitive_value_callbackであり、klassがバイト配列のクラスに設定された場合、バイト配列のみが報告されます。 以上をまとめたのが次の表です。
| ビジット対象オブジェクトを制御する | 報告対象オブジェクトを制御する | 報告対象プリミティブを制御する | |
|---|---|---|---|
jvmtiHeapReferenceCallbackによって返されるヒープ・ビジット制御フラグ
|
Yes | はい、ビジットが制御されるため | はい、ビジットが制御されるため |
callbacksセット内のarray_primitive_value_callback
|
いいえ | Yes | いいえ |
heap_filter
|
いいえ | Yes | Yes |
klass
|
いいえ | Yes | Yes |
ライブ段階でしか呼び出せない
いいえ
115
1.1
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
heap_filter | jint | ヒープ・フィルタ・フラグのこのビット・ベクトルは、コールバック関数の呼出し対象となるオブジェクトを制限します。 これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。 |
klass | jclass |
コールバックが報告するのは、オブジェクトがこのクラスのインスタンスである場合だけである。 klassのスーパー・クラスのインスタンスであるオブジェクトは、報告されません。 klassがインタフェースの場合、オブジェクトは報告されません。 これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。
klassがNULLの場合、コールバックは特定のクラスのインスタンスに制限されません。
|
initial_object | jobject |
追跡するオブジェクト
initial_objectがNULLの場合、ヒープ・ルートから参照の追跡が行われる。
|
callbacks | const jvmtiHeapCallbacks * |
一連のコールバック関数を定義する構造体。
エージェントはjvmtiHeapCallbacksへのポインタを渡す。 |
user_data | const void * |
ユーザーが入力し、コールバックに渡されるデータ。
エージェントがポインタを渡す。 user_dataがNULLの場合、NULLがユーザー指定データとして渡される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_CLASS |
klassは有効なクラスではない。
|
JVMTI_ERROR_INVALID_OBJECT |
initial_objectは有効なオブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
callbacksがNULL。
|
ヒープ内での反復
jvmtiError
IterateThroughHeap(jvmtiEnv* env,
jint heap_filter,
jclass klass,
const jvmtiHeapCallbacks* callbacks,
const void* user_data)
ヒープ内のすべてのオブジェクトに対する反復処理を起動します。 到達可能なオブジェクトも、そうでないオブジェクトも含まれます。 オブジェクトのビジットは特定の順番では行われません。
ヒープ・オブジェクトの報告は、エージェントから提供されるコールバック関数jvmtiHeapIterationCallbackを呼び出すことで行われます。 オブジェクト間の参照は報告されません。 到達可能なオブジェクトのみが必要である場合や、オブジェクト参照の情報が必要である場合には、FollowReferencesを使用してください。
またこの関数を使えば、プリミティブ(非オブジェクト)値を確認することもできます。 配列またはStringのプリミティブ値が報告されるのは、オブジェクトがビジットされた後です。その報告時には、エージェントが提供するコールバック関数jvmtiArrayPrimitiveValueCallbackまたはjvmtiStringPrimitiveValueCallbackが呼び出されます。 あるプリミティブ・フィールドが報告されるのは、そのフィールドを含むオブジェクトがビジットされた後です。その報告時には、エージェントが提供するコールバック関数jvmtiPrimitiveFieldCallbackが呼び出されます。
コールバックから返されるヒープ・ビジット制御フラグによって反復処理が中止されないかぎり、ヒープ内のすべてのオブジェクトがビジットされます。 コールバックが提供されるかNULLであるかは、そのコールバックが呼び出されるかどうかだけを決定し、どのオブジェクトがビジットされるかや、ほかのコールバックが呼び出されるかどうかには影響しません。 この関数のパラメータとして提供されるヒープ・フィルタ・フラグとklassは、ビジットされるオブジェクトは制御しませんが、コールバックによって報告されるオブジェクトおよびプリミティブ値は制御します。 たとえば、設定された唯一のコールバックがarray_primitive_value_callbackであり、klassがバイト配列のクラスに設定された場合、バイト配列のみが報告されます。 これをまとめたのが下の表です(これをFollowReferencesと比較してください)。
| ビジット対象オブジェクトを制御する | 報告対象オブジェクトを制御する | 報告対象プリミティブを制御する | |
|---|---|---|---|
jvmtiHeapIterationCallbackによって返されるヒープ・ビジット制御フラグ
|
いいえ (反復処理が中止される場合は除く) |
いいえ (反復処理が中止される場合は除く) |
いいえ (反復処理が中止される場合は除く) |
callbacksセット内のarray_primitive_value_callback
|
いいえ | Yes | いいえ |
heap_filter
|
いいえ | Yes | Yes |
klass
|
いいえ | Yes | Yes |
ライブ段階でしか呼び出せない
いいえ
116
1.1
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
heap_filter | jint | ヒープ・フィルタ・フラグのこのビット・ベクトルは、コールバック関数の呼出し対象となるオブジェクトを制限します。 これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。 |
klass | jclass |
コールバックが報告するのは、オブジェクトがこのクラスのインスタンスである場合だけである。 klassのスーパー・クラスのインスタンスであるオブジェクトは、報告されません。 klassがインタフェースの場合、オブジェクトは報告されません。 これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。
klassがNULLの場合、コールバックは特定のクラスのインスタンスに制限されません。
|
callbacks | const jvmtiHeapCallbacks * |
一連のコールバック関数を定義する構造体。
エージェントはjvmtiHeapCallbacksへのポインタを渡す。 |
user_data | const void * |
ユーザーが入力し、コールバックに渡されるデータ。
エージェントがポインタを渡す。 user_dataがNULLの場合、NULLがユーザー指定データとして渡される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_CLASS |
klassは有効なクラスではない。
|
JVMTI_ERROR_NULL_POINTER |
callbacksがNULL。
|
タグの取得
jvmtiError
GetTag(jvmtiEnv* env,
jobject object,
jlong* tag_ptr)
オブジェクトに関連付けられているタグを取得します。 タグは長整数値で、通常、オブジェクト情報の一意の識別子またはポインタを格納するために使用されます。 タグの設定には、SetTag関数を使用します。 タグが設定されていないオブジェクトは、タグ値としてゼロを返します。
開始またはライブ段階でしか呼び出せない
いいえ
106
1.0
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
object | jobject | タグが取得されるオブジェクト。 |
tag_ptr | jlong* |
戻ったとき、参照される長整数値にタグ値が設定されている。
エージェントはjlongへのポインタを渡す。 戻ったとき、jlongが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_OBJECT |
objectがオブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
tag_ptrがNULL。
|
タグの設定
jvmtiError
SetTag(jvmtiEnv* env,
jobject object,
jlong tag)
オブジェクトに関連付けられているタグを設定します。 タグは長整数値で、通常、オブジェクト情報の一意の識別子またはポインタを格納するために使用されます。 タグの表示には、GetTag関数を使用します。
開始またはライブ段階でしか呼び出せない
いいえ
107
1.0
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
object | jobject | タグが設定されるオブジェクト。 |
tag | jlong | タグの新しい値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_OBJECT |
objectがオブジェクトではない。
|
タグを使ったオブジェクトの取得
jvmtiError
GetObjectsWithTags(jvmtiEnv* env,
jint tag_count,
const jlong* tags,
jint* count_ptr,
jobject** object_result_ptr,
jlong** tag_result_ptr)
ヒープ内の指定されたタグを持つオブジェクトを返します。 オブジェクトとタグの並行配列の形式になります。
ライブ段階でしか呼び出せない
いいえ
114
1.0
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
tag_count | jint | 走査するタグの数。 |
tags | const jlong * |
これらのタグが付けられたオブジェクトを走査する。 この配列内では、ゼロは使用できない。
エージェントはjlongのtag_count要素の配列を渡す。 |
count_ptr | jint * |
tags内の任意のタグを持つオブジェクトの数を返す。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
object_result_ptr | jobject ** |
tags内の任意のタグを持つオブジェクトの配列を返す。
エージェントはjobject*へのポインタを渡す。 戻ったとき、jobject*は、サイズ*count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 object_result_ptrがNULLの場合、この情報は返されない。 object_result_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
tag_result_ptr | jlong ** |
object_result_ptr内の各オブジェクトに対して、対応するインデックスのタグを返す。
エージェントはjlong*へのポインタを渡す。 戻ったとき、jlong*は、サイズ*count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 tag_result_ptrがNULLの場合、この情報は返されない。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
tags内にゼロが存在する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
tag_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
tagsがNULL。
|
JVMTI_ERROR_NULL_POINTER |
count_ptrがNULL。
|
ガベージ・コレクションの強制
VMにガベージ・コレクションの実行を強制します。 ガベージ・コレクションは可能なかぎり完全に行われます。 この関数は、ファイナライザを実行させません。 この関数は、ガベージ・コレクションが完了するまで終了しません。 ガベージ・コレクションは可能なかぎり完全に実行されますが、この関数が戻るまでにすべてのjvmtiError ForceGarbageCollection(jvmtiEnv* env)
ObjectFreeイベントが送信されているという保証はありません。 特に、ファイナライズ待ちのオブジェクトが解放されない可能性があります。
ライブ段階でしか呼び出せない
いいえ
108
1.0
権限
必要な機能
パラメータ
なし
エラー
この関数は、汎用エラーを返します
ヒープ(1.0)
ヒープ(1.0)の関数: ヒープ(1.0)の関数型: ヒープ(1.0)の型:-
jvmtiHeapObjectFilter- ヒープ・オブジェクトのフィルタの列挙 -
jvmtiHeapRootKind- ヒープ・ルートの種類の列挙 -
jvmtiObjectReferenceKind- オブジェクト参照の列挙 -
jvmtiIterationControl- 反復制御の列挙
- プリミティブ値(Strings、配列、およびプリミティブ・フィールドの値)へのアクセスを可能にする
- 参照側のタグを設定できるようにする。このため、より効率的なローカライズされた参照グラフの構築が可能となる
- より広範なフィルタ・リング機能を提供する
- 拡張可能である。このため、JVM TIの将来のバージョンで拡張を施すことができる
ヒープ・オブジェクトのフィルタの列挙( jvmtiHeapObjectFilter)定数 値 説明 JVMTI_HEAP_OBJECT_TAGGED1 タグ付きオブジェクトのみ。 JVMTI_HEAP_OBJECT_UNTAGGED2 タグなしオブジェクトのみ。 JVMTI_HEAP_OBJECT_EITHER3 タグ付きオブジェクトまたはタグなしオブジェクト。
ヒープ・ルートの種類の列挙( jvmtiHeapRootKind)定数 値 説明 JVMTI_HEAP_ROOT_JNI_GLOBAL1 JNIグローバル参照。 JVMTI_HEAP_ROOT_SYSTEM_CLASS2 システム・クラス。 JVMTI_HEAP_ROOT_MONITOR3 モニター。 JVMTI_HEAP_ROOT_STACK_LOCAL4 スタック・ローカル。 JVMTI_HEAP_ROOT_JNI_LOCAL5 JNIローカル参照。 JVMTI_HEAP_ROOT_THREAD6 スレッド。 JVMTI_HEAP_ROOT_OTHER7 その他。
オブジェクト参照の列挙( jvmtiObjectReferenceKind)定数 値 説明 JVMTI_REFERENCE_CLASS1 オブジェクトからそのクラスへの参照。 JVMTI_REFERENCE_FIELD2 オブジェクトから、そのオブジェクトのいずれかのインスタンス・フィールド値への参照。 この種の参照の場合、jvmtiObjectReferenceCallbackの referrer_indexパラメータはインスタンス・フィールドのインデックス。 インデックスは、すべてのオブジェクトのフィールドの順序が基になる。 クラスで直接宣言されたstaticおよびインスタンス・フィールドが含まれるほか、スーパー・クラスおよびスーパー・インタフェースで宣言されたすべてのフィールド(publicとprivateの両方)が含まれる。 そのためインデックスは、直接宣言されたクラスにあるフィールドのインデックス(GetClassFields参照)と、すべてのスーパー・クラスおよびスーパー・インタフェースで宣言されたフィールド(publicとprivateの両方)の合計数を足し合わせたもので計算されます。 インデックスは0から始まる。JVMTI_REFERENCE_ARRAY_ELEMENT3 配列から、その配列のいずれかの要素への参照。 この種の参照の場合、jvmtiObjectReferenceCallbackの referrer_indexパラメータは配列のインデックス。JVMTI_REFERENCE_CLASS_LOADER4 クラスからそのクラス・ローダーへの参照。 JVMTI_REFERENCE_SIGNERS5 クラスからその署名者の配列への参照。 JVMTI_REFERENCE_PROTECTION_DOMAIN6 クラスからその保護ドメインへの参照。 JVMTI_REFERENCE_INTERFACE7 クラスから、そのクラスのいずれかのインタフェースへの参照。 JVMTI_REFERENCE_STATIC_FIELD8 クラスからそのいずれかのstaticフィールド値への参照。 この種の参照の場合、jvmtiObjectReferenceCallbackの referrer_indexパラメータはstaticフィールドのインデックス。 インデックスは、すべてのオブジェクトのフィールドの順序が基になる。 クラスで直接宣言されたstaticおよびインスタンス・フィールドが含まれるほか、スーパー・クラスおよびスーパー・インタフェースで宣言されたすべてのフィールド(publicとprivateの両方)が含まれる。 そのためインデックスは、直接宣言されたクラスにあるフィールドのインデックス(GetClassFields参照)と、すべてのスーパー・クラスおよびスーパー・インタフェースで宣言されたフィールド(publicとprivateの両方)の合計数を足し合わせたもので計算されます。 インデックスは0から始まる。 ノート: この定義は、JVM TI 1.0仕様での定義と異なる。原理の説明: 既知の実装のなかで、1.0の定義を使用したものはない。
JVMTI_REFERENCE_CONSTANT_POOL9 クラスから定数プール内の解決済みエントリへの参照。 この種の参照の場合、jvmtiObjectReferenceCallbackの referrer_indexパラメータは、クラスの定数プール・テーブルのインデックスで、1から始まる。 Java™仮想マシン仕様のセクション4.4を参照。
反復制御の列挙( jvmtiIterationControl)定数 値 説明 JVMTI_ITERATION_CONTINUE1 反復処理を継続。 参照の反復処理の場合、このオブジェクトの参照に従う。 JVMTI_ITERATION_IGNORE2 反復処理を継続。 参照の反復処理の場合、このオブジェクトの参照を無視する。 JVMTI_ITERATION_ABORT0 反復処理を中止。
ヒープ・オブジェクトのコールバック
typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback)
(jlong class_tag,
jlong size,
jlong* tag_ptr,
void* user_data);
エージェントによって提供されるコールバック関数。 ヒープ内のオブジェクトを記述しますが、値は渡しません。
反復処理を継続する場合、戻り値はJVMTI_ITERATION_CONTINUEです。反復処理を停止する場合、戻り値はJVMTI_ITERATION_ABORTです。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
class_tag | jlong |
オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 オブジェクトが実行時クラスを表す場合、class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
size | jlong |
オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
ヒープ・ルート・オブジェクトのコールバック
typedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback)
(jvmtiHeapRootKind root_kind,
jlong class_tag,
jlong size,
jlong* tag_ptr,
void* user_data);
エージェントによって提供されるコールバック関数。 ガベージ・コレクションの目的で、ルート・オブジェクトについて説明しますが、値は渡しません。
戻り値は、反復処理を継続する場合はJVMTI_ITERATION_CONTINUE、参照側オブジェクトからの参照を続行しないで反復処理を継続する場合はJVMTI_ITERATION_IGNORE、反復処理を停止する場合はJVMTI_ITERATION_ABORTのはずです。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
root_kind | jvmtiHeapRootKind | ヒープ・ルートの種類。 |
class_tag | jlong |
オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 オブジェクトが実行時クラスを表す場合、class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
size | jlong |
オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
スタック参照オブジェクトのコールバック
typedef jvmtiIterationControl (JNICALL *jvmtiStackReferenceCallback)
(jvmtiHeapRootKind root_kind,
jlong class_tag,
jlong size,
jlong* tag_ptr,
jlong thread_tag,
jint depth,
jmethodID method,
jint slot,
void* user_data);
エージェントによって提供されるコールバック関数。 ガベージ・コレクションの目的で、スタック上のルート・オブジェクトについて説明しますが、値は渡しません。
戻り値は、反復処理を継続する場合はJVMTI_ITERATION_CONTINUE、参照側オブジェクトからの参照を続行しないで反復処理を継続する場合はJVMTI_ITERATION_IGNORE、反復処理を停止する場合はJVMTI_ITERATION_ABORTのはずです。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
root_kind | jvmtiHeapRootKind |
ルートの種類(JVMTI_HEAP_ROOT_STACK_LOCALまたはJVMTI_HEAP_ROOT_JNI_LOCAL)。
|
class_tag | jlong |
オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 オブジェクトが実行時クラスを表す場合、class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
size | jlong |
オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
thread_tag | jlong | このスタックに対応するスレッドのタグ。タグ付けされていない場合はゼロ。 |
depth | jint | フレームの深さ。 |
method | jmethodID | このフレーム内で実行されているメソッド。 |
slot | jint | スロット番号。 |
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
オブジェクト参照のコールバック
typedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback)
(jvmtiObjectReferenceKind reference_kind,
jlong class_tag,
jlong size,
jlong* tag_ptr,
jlong referrer_tag,
jint referrer_index,
void* user_data);
エージェントによって提供されるコールバック関数。 あるオブジェクト(参照側)から別のオブジェクト(参照先)の参照について説明します。
戻り値は、反復処理を継続する場合はJVMTI_ITERATION_CONTINUE、参照側オブジェクトからの参照を続行しないで反復処理を継続する場合はJVMTI_ITERATION_IGNORE、反復処理を停止する場合はJVMTI_ITERATION_ABORTのはずです。
ヒープ・コールバック関数の制約を参照してください。
| 名前 | 型 | 説明 |
|---|---|---|
reference_kind | jvmtiObjectReferenceKind | 参照型。 |
class_tag | jlong |
参照されるオブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。 参照先オブジェクトが実行時クラスを表す場合、class_tagはjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
|
size | jlong |
参照されるオブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
tag_ptr | jlong* |
参照オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。 オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
|
referrer_tag | jlong | 参照側のオブジェクトのタグ値。タグ付けされていないオブジェクトの場合はゼロ。 |
referrer_index | jint |
JVMTI_REFERENCE_FIELDまたはJVMTI_REFERENCE_STATIC_FIELD型の参照の場合、参照元オブジェクト内のフィールドのインデックス。 このインデックスは、オブジェクトのすべてのフィールドの順番に基づく。詳しい説明については、JVMTI_REFERENCE_FIELDまたはJVMTI_REFERENCE_STATIC_FIELD を参照。
型JVMTI_REFERENCE_ARRAY_ELEMENTの参照の場合は、配列インデックス。詳細な説明については、JVMTI_REFERENCE_ARRAY_ELEMENTを参照。
型JVMTI_REFERENCE_CONSTANT_POOLの参照の場合は、クラスの定数プールに対するインデックス。詳細な説明については、JVMTI_REFERENCE_CONSTANT_POOLを参照。
その他の参照の場合、referrer_indexは-1。
|
user_data | void* | ユーザーが入力し、反復関数に渡されたデータ。 |
オブジェクトから到達可能なオブジェクトの反復
jvmtiError
IterateOverObjectsReachableFromObject(jvmtiEnv* env,
jobject object,
jvmtiObjectReferenceCallback object_reference_callback,
const void* user_data)
この関数は、指定されたオブジェクトから直接的または間接的に到達可能なすべてのオブジェクトに対して反復処理を行います。 オブジェクトBを参照する各オブジェクトA(参照元と呼ばれる)に対し、そのオブジェクト参照を記述する目的で、指定されたコールバック関数が呼び出されます。 コールバックの呼出しは、参照元からの参照ごとに1回ずつ行われます。これは、参照循環が存在する場合や参照元へのパスが複数存在する場合でも言えることです。 参照元と参照先との間の参照は複数存在する可能性があります。これらを区別するには、jvmtiObjectReferenceCallback.reference_kindおよびjvmtiObjectReferenceCallback.referrer_indexを使用します。 あるオブジェクトのコールバックは必ず、その参照元のコールバックの後で発生します。
報告されるオブジェクト参照については、FollowReferencesを参照してください。
この関数の実行中、ヒープの状態は変化しません。オブジェクトの割当てやガベージ・コレクションは行われず、オブジェクトの状態(保持された値を含む)は変化しません。 このため、Javaプログラミング言語コードを実行するスレッド、Javaプログラミング言語コードの実行を再開しようとしているスレッド、およびJNI関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
109
1.0
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
object | jobject | オブジェクト |
object_reference_callback | jvmtiObjectReferenceCallback | 各オブジェクト参照を記述するために呼び出されるコールバック。 |
user_data | const void * |
ユーザーが入力し、コールバックに渡されるデータ。
エージェントがポインタを渡す。 user_dataがNULLの場合、NULLがユーザー指定データとして渡される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_OBJECT |
objectがオブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
object_reference_callbackがNULL。
|
到達可能なオブジェクトの反復
jvmtiError
IterateOverReachableObjects(jvmtiEnv* env,
jvmtiHeapRootCallback heap_root_callback,
jvmtiStackReferenceCallback stack_ref_callback,
jvmtiObjectReferenceCallback object_ref_callback,
const void* user_data)
この関数は、ルート・オブジェクトと、ルート・オブジェクトから直接または間接的に到達可能なすべてのオブジェクトに対して反復処理を行います。 ルート・オブジェクトは、システム・クラス、JNIグローバル、プラットフォーム・スレッド・スタックからの参照、およびガベージ・コレクションの目的でルートとして使用されるその他のオブジェクトのセットで構成されます。
各ルートに対して、heap_root_callbackまたはstack_ref_callbackコールバックが呼び出されます。 オブジェクトは複数の理由でルート・オブジェクトになる可能性がありますが、その場合、対応するコールバックが理由ごとに呼び出されます。
各オブジェクト参照について、そのオブジェクト参照を記述する目的でobject_ref_callbackコールバック関数が呼び出されます。 コールバックの呼出しは、参照元からの参照ごとに1回ずつ行われます。これは、参照循環が存在する場合や参照元へのパスが複数存在する場合でも言えることです。 参照元と参照先との間の参照は複数存在する可能性があります。これらを区別するには、jvmtiObjectReferenceCallback.reference_kindおよびjvmtiObjectReferenceCallback.referrer_indexを使用します。 あるオブジェクトのコールバックは必ず、その参照元のコールバックの後で発生します。
報告されるオブジェクト参照については、FollowReferencesを参照してください。
ルートは、常に、オブジェクト参照が報告される前に、プロファイラに報告されます。 つまり、object_ref_callbackは、すべてのルートに対して適切なコールバックが呼び出されるまで、呼び出されません。 object_ref_callbackがNULLと指定されている場合、この関数は、プロファイラにルート・オブジェクトを報告したあと、終了します。
この関数の実行中、ヒープの状態は変化しません。オブジェクトの割当てやガベージ・コレクションは行われず、オブジェクトの状態(保持された値を含む)は変化しません。 このため、Javaプログラミング言語コードを実行するスレッド、Javaプログラミング言語コードの実行を再開しようとしているスレッド、およびJNI関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
110
1.0
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
heap_root_callback | jvmtiHeapRootCallback |
JVMTI_HEAP_ROOT_JNI_GLOBAL、JVMTI_HEAP_ROOT_SYSTEM_CLASS、JVMTI_HEAP_ROOT_MONITOR、JVMTI_HEAP_ROOT_THREAD、またはJVMTI_HEAP_ROOT_OTHER型の各ヒープ・ルートのために呼び出されるコールバック関数。
heap_root_callbackがNULLの場合、ヒープ・ルートの報告は行わない。
|
stack_ref_callback | jvmtiStackReferenceCallback |
JVMTI_HEAP_ROOT_STACK_LOCALまたはJVMTI_HEAP_ROOT_JNI_LOCALの各ヒープ・ルートのために呼び出されるコールバック関数。
stack_ref_callbackがNULLの場合、スタック参照の報告は行わない。
|
object_ref_callback | jvmtiObjectReferenceCallback |
各オブジェクト参照のために呼び出されるコールバック関数。
object_ref_callbackがNULLの場合、ルート・オブジェクトからの参照には従わない。
|
user_data | const void * |
ユーザーが入力し、コールバックに渡されるデータ。
エージェントがポインタを渡す。 user_dataがNULLの場合、NULLがユーザー指定データとして渡される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
ヒープの反復
jvmtiError
IterateOverHeap(jvmtiEnv* env,
jvmtiHeapObjectFilter object_filter,
jvmtiHeapObjectCallback heap_object_callback,
const void* user_data)
ヒープ内のすべてのオブジェクトに対して反復処理を行います。 到達可能なオブジェクトも、そうでないオブジェクトも含まれます。
object_filterパラメータは、どのオブジェクトのためにコールバック関数が呼び出されるかを示します。 パラメータがJVMTI_HEAP_OBJECT_TAGGEDの場合、コールバックは、すべてのタグ付きオブジェクトに対してのみ呼び出されます。 パラメータがJVMTI_HEAP_OBJECT_UNTAGGEDの場合、コールバックは、すべてのタグなしオブジェクトに対してのみ呼び出されます。 パラメータがJVMTI_HEAP_OBJECT_EITHERの場合、コールバックは、タグが付いているかどうかに関係なく、ヒープ内のすべてのオブジェクトに対して呼び出されます。
この関数の実行中、ヒープの状態は変化しません。オブジェクトの割当てやガベージ・コレクションは行われず、オブジェクトの状態(保持された値を含む)は変化しません。 このため、Javaプログラミング言語コードを実行するスレッド、Javaプログラミング言語コードの実行を再開しようとしているスレッド、およびJNI関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
111
1.0
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
object_filter | jvmtiHeapObjectFilter | どのオブジェクトに対してコールバック関数が呼び出されるかを示す。 |
heap_object_callback | jvmtiHeapObjectCallback |
object_filterに一致する各オブジェクトに対して呼び出される反復関数。
|
user_data | const void * |
ユーザーが入力し、コールバックに渡されるデータ。
エージェントがポインタを渡す。 user_dataがNULLの場合、NULLがユーザー指定データとして渡される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
object_filterがjvmtiHeapObjectFilterではない。
|
JVMTI_ERROR_NULL_POINTER |
heap_object_callbackがNULL。
|
クラスのインスタンスの反復
jvmtiError
IterateOverInstancesOfClass(jvmtiEnv* env,
jclass klass,
jvmtiHeapObjectFilter object_filter,
jvmtiHeapObjectCallback heap_object_callback,
const void* user_data)
指定されたクラスのインスタンスになっている、ヒープ内のすべてのオブジェクトに対して反復処理を行います。 これには、指定されたクラスの直接のインスタンスと、指定されたクラスのすべてのサブクラスのインスタンスが含まれます。 到達可能なオブジェクトも、そうでないオブジェクトも含まれます。
object_filterパラメータは、どのオブジェクトのためにコールバック関数が呼び出されるかを示します。 パラメータがJVMTI_HEAP_OBJECT_TAGGEDの場合、コールバックは、すべてのタグ付きオブジェクトに対してのみ呼び出されます。 パラメータがJVMTI_HEAP_OBJECT_UNTAGGEDの場合、コールバックは、すべてのタグなしオブジェクトに対してのみ呼び出されます。 パラメータがJVMTI_HEAP_OBJECT_EITHERの場合、コールバックは、タグが付いているかどうかに関係なく、ヒープ内のすべてのオブジェクトに対して呼び出されます。
この関数の実行中、ヒープの状態は変化しません。オブジェクトの割当てやガベージ・コレクションは行われず、オブジェクトの状態(保持された値を含む)は変化しません。 このため、Javaプログラミング言語コードを実行するスレッド、Javaプログラミング言語コードの実行を再開しようとしているスレッド、およびJNI関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
112
1.0
| 権限 | 効果 |
|---|---|
can_tag_objects | ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | このクラスのオブジェクトに対してのみ反復処理を行う。 |
object_filter | jvmtiHeapObjectFilter | どのオブジェクトに対してコールバック関数が呼び出されるかを示す。 |
heap_object_callback | jvmtiHeapObjectCallback |
object_filterに一致する各klassインスタンスに対して呼び出される反復関数。
|
user_data | const void * |
ユーザーが入力し、コールバックに渡されるデータ。
エージェントがポインタを渡す。 user_dataがNULLの場合、NULLがユーザー指定データとして渡される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_tag_objectsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
object_filterがjvmtiHeapObjectFilterではない。
|
JVMTI_ERROR_NULL_POINTER |
heap_object_callbackがNULL。
|
局所変数
局所変数関数:- 局所変数の取得 - オブジェクト型
- 局所インスタンスの取得
- 局所変数の取得 - 整数型
- 局所変数の取得 - 長整数型
- 局所変数の取得 - 浮動小数点数型
- 局所変数の取得 - 倍精度浮動小数点数型
- 局所変数の設定 - オブジェクト型
- 局所変数の設定 - 整数型
- 局所変数の設定 - 長整数型
- 局所変数の設定 - 浮動小数点数型
- 局所変数の設定 - 倍精度浮動小数点数型
GetLocalVariableTableを使って取得できます。
GetLocalXXX関数は、仮想スレッドのフレームに含まれるローカル変数の値を取得するために使用できます。 SetLocalXXX関数は、イベントで一時停止された仮想スレッドの最上位フレームでローカル変数の値を設定するために使用できます。 実装では、他のケースで地域の設定をサポートする場合があります。
局所変数の取得 - オブジェクト型
jvmtiError
GetLocalObject(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jobject* value_ptr)
この関数を使うと、型がObjectまたはObjectのサブクラスである局所変数の値を取得できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
21
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value_ptr | jobject* |
戻ったとき、変数の値をポイントする。
エージェントはjobjectへのポインタを渡す。 戻ったとき、jobjectが設定されている。 value_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がObjectでもObjectのサブクラスでもない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_NULL_POINTER |
value_ptrがNULL。
|
局所インスタンスの取得
jvmtiError
GetLocalInstance(jvmtiEnv* env,
jthread thread,
jint depth,
jobject* value_ptr)
この関数を使うと、静的でないフレームからスロット0 (「this」オブジェクト)の局所オブジェクト変数の値を取得できます。 この関数は、ネイティブ・メソッドのフレームから「this」オブジェクトを取得しますが、この場合、GetLocalObject()はJVMTI_ERROR_OPAQUE_FRAMEを返します。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
155
1.2
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
value_ptr | jobject* |
戻ったとき、変数の値をポイントする。
エージェントはjobjectへのポインタを渡す。 戻ったとき、jobjectが設定されている。 value_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT | 指定されたフレームが静的なメソッドのフレームである場合。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_NULL_POINTER |
value_ptrがNULL。
|
局所変数の取得 - 整数型
jvmtiError
GetLocalInt(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jint* value_ptr)
この関数を使うと、型がint、short、char、byte、booleanのいずれかである局所変数の値を取得できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
22
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value_ptr | jint* |
戻ったとき、変数の値をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がint、short、char、byte、またはbooleanではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_NULL_POINTER |
value_ptrがNULL。
|
局所変数の取得 - 長整数型
jvmtiError
GetLocalLong(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jlong* value_ptr)
この関数を使うと、型がlongである局所変数の値を取得できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
23
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value_ptr | jlong* |
戻ったとき、変数の値をポイントする。
エージェントはjlongへのポインタを渡す。 戻ったとき、jlongが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がlongではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_NULL_POINTER |
value_ptrがNULL。
|
局所変数の取得 - 浮動小数点数型
jvmtiError
GetLocalFloat(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jfloat* value_ptr)
この関数を使うと、型がfloatである局所変数の値を取得できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
24
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value_ptr | jfloat* |
戻ったとき、変数の値をポイントする。
エージェントはjfloatへのポインタを渡す。 戻ったとき、jfloatが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がfloatではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_NULL_POINTER |
value_ptrがNULL。
|
局所変数の取得 - 倍精度浮動小数点数型
jvmtiError
GetLocalDouble(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jdouble* value_ptr)
この関数を使うと、型がlongである局所変数の値を取得できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
25
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value_ptr | jdouble* |
戻ったとき、変数の値をポイントする。
エージェントはjdoubleへのポインタを渡す。 戻ったとき、jdoubleが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がdoubleではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_NULL_POINTER |
value_ptrがNULL。
|
局所変数の設定 - オブジェクト型
jvmtiError
SetLocalObject(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jobject value)
この関数を使うと、型がObjectまたはObjectのサブクラスである局所変数の値を設定できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
26
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value | jobject | 変数の新しい値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がObjectでもObjectのサブクラスでもない。
|
JVMTI_ERROR_TYPE_MISMATCH |
指定されたvalueと変数の型に互換性がない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_OPAQUE_FRAME | スレッドは中断された仮想スレッドであり、実装では、指定された深さのフレームでのローカルの値の設定をサポートしていません。 「局所変数」を参照。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
JVMTI_ERROR_INVALID_OBJECT |
valueがオブジェクトではない。
|
局所変数の設定 - 整数型
jvmtiError
SetLocalInt(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jint value)
この関数を使うと、型がint、short、char、byte、booleanのいずれかである局所変数の値を設定できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
27
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value | jint | 変数の新しい値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がint、short、char、byte、またはbooleanではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_OPAQUE_FRAME | スレッドは中断された仮想スレッドであり、実装では、指定された深さのフレームでのローカルの値の設定をサポートしていません。 「局所変数」を参照。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
局所変数の設定 - 長整数型
jvmtiError
SetLocalLong(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jlong value)
この関数を使うと、型がlongである局所変数の値を設定できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
28
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value | jlong | 変数の新しい値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がlongではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_OPAQUE_FRAME | スレッドは中断された仮想スレッドであり、実装では、指定された深さのフレームでのローカルの値の設定をサポートしていません。 「局所変数」を参照。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
局所変数の設定 - 浮動小数点数型
jvmtiError
SetLocalFloat(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jfloat value)
この関数を使うと、型がfloatである局所変数の値を設定できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
29
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value | jfloat | 変数の新しい値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がfloatではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_OPAQUE_FRAME | スレッドは中断された仮想スレッドであり、実装では、指定された深さのフレームでのローカルの値の設定をサポートしていません。 「局所変数」を参照。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
局所変数の設定 - 倍精度浮動小数点数型
jvmtiError
SetLocalDouble(jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jdouble value)
この関数を使うと、型がdoubleである局所変数の値を設定できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
30
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
変数の値を含むフレームのスレッド。 threadがNULLの場合、現在のスレッドが使用される。
|
depth | jint | 変数の値を含むフレームの深さ。 |
slot | jint | 変数のスロット番号。 |
value | jdouble | 変数の新しい値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_SLOT |
無効なslot。
|
JVMTI_ERROR_TYPE_MISMATCH |
変数の型がdoubleではない。
|
JVMTI_ERROR_OPAQUE_FRAME | 可視のフレームではない。 |
JVMTI_ERROR_OPAQUE_FRAME | スレッドは中断された仮想スレッドであり、実装では、指定された深さのフレームでのローカルの値の設定をサポートしていません。 「局所変数」を参照。 |
JVMTI_ERROR_THREAD_NOT_SUSPENDED | スレッドは中断されず、現在のスレッドではなかった。 |
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
depthがゼロより小さい。
|
JVMTI_ERROR_NO_MORE_FRAMES |
指定されたdepthにスタック・フレームがない。
|
ブレークポイント
ブレークポイント関数:ブレークポイントの設定
jvmtiError
SetBreakpoint(jvmtiEnv* env,
jmethodID method,
jlocation location)
methodおよびlocationで指定された命令にブレークポイントを設定します。 1つの命令に対して設定できるブレークポイントは1つだけです。
指定した命令が実行される直前に、Breakpointイベントが生成されます。
ライブ段階でしか呼び出せない
いいえ
38
1.0
| 権限 | 効果 |
|---|---|
can_generate_breakpoint_events |
Breakpointイベントを設定し、取得できる。
|
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | ブレークポイントを設定するメソッド |
location | jlocation | ブレークポイントを設定する命令のインデックス |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_generate_breakpoint_eventsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_DUPLICATE | 指定されたバイト・コードにはブレークポイントがすでに設定されている。 |
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_INVALID_LOCATION |
locationが有効な位置ではない。
|
ブレークポイントのクリア
jvmtiError
ClearBreakpoint(jvmtiEnv* env,
jmethodID method,
jlocation location)
methodおよびlocationで指定されたバイト・コードに設定されているブレークポイントをクリアします。
ライブ段階でしか呼び出せない
いいえ
39
1.0
| 権限 | 効果 |
|---|---|
can_generate_breakpoint_events |
Breakpointイベントを設定し、取得できる。
|
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | ブレークポイントをクリアするメソッド |
location | jlocation | ブレークポイントをクリアする命令のインデックス |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_generate_breakpoint_eventsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_NOT_FOUND | 指定されたバイト・コードにはブレークポイントが設定されていない。 |
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_INVALID_LOCATION |
locationが有効な位置ではない。
|
監視されるフィールド
監視されるフィールド関数:フィールド・アクセスの監視の設定
jvmtiError
SetFieldAccessWatch(jvmtiEnv* env,
jclass klass,
jfieldID field)
klassおよびfieldで指定されたフィールドがアクセスされようとした時点で、FieldAccessイベントを生成します。 イベントは、ClearFieldAccessWatchを使用して取り消されるまで、フィールドがアクセスされるたびに生成されます。 Javaプログラミング言語コードまたはJNIコードからのフィールド・アクセスが監視され、他の手段で変更されるフィールドは監視されません。 JVM TIのユーザーは、自分自身のフィールド・アクセスによって監視イベントがトリガーされることに注意してください。 1つのフィールドに対し、フィールド・アクセスの監視を1つのみ設定できます。 フィールドの変更はアクセスとはみなされません。変更を監視するにはSetFieldModificationWatchを使用します。
ライブ段階でしか呼び出せない
いいえ
41
1.0
| 権限 | 効果 |
|---|---|
can_generate_field_access_events |
フィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch
|
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 監視するフィールドを含むクラス |
field | jfieldID | 監視するフィールド |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_generate_field_access_eventsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_DUPLICATE | 指定されたフィールドはすでにアクセスが監視されている。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
フィールド・アクセスの監視のクリア
jvmtiError
ClearFieldAccessWatch(jvmtiEnv* env,
jclass klass,
jfieldID field)
SetFieldAccessWatchを使って以前に設定した、klassおよびfieldで指定されるフィールドに対するフィールド・アクセスの監視を取り消します。
ライブ段階でしか呼び出せない
いいえ
42
1.0
| 権限 | 効果 |
|---|---|
can_generate_field_access_events |
フィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch
|
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 監視するフィールドを含むクラス |
field | jfieldID | 監視するフィールド |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_generate_field_access_eventsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_NOT_FOUND | 指定されたフィールドはアクセスが監視されていない。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
フィールド変更の監視の設定
jvmtiError
SetFieldModificationWatch(jvmtiEnv* env,
jclass klass,
jfieldID field)
klassおよびfieldで指定されたフィールドが変更されようとした時点で、FieldModificationイベントを生成します。 イベントは、ClearFieldModificationWatchを使って取り消されるまで、フィールドが変更されるたびに生成されます。 Javaプログラミング言語コードまたはJNIコードからのフィールド変更が監視され、ほかの手段で変更されるフィールドは監視されません。 JVM TIのユーザーは、自分自身のフィールド変更によって監視イベントがトリガーされることに注意してください。 1つのフィールドに対し、フィールド変更の監視を1つだけ設定できます。
ライブ段階でしか呼び出せない
いいえ
43
1.0
| 権限 | 効果 |
|---|---|
can_generate_field_modification_events |
フィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch
|
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 監視するフィールドを含むクラス |
field | jfieldID | 監視するフィールド |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_generate_field_modification_eventsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_DUPLICATE | 指定されたフィールドはすでに変更が監視されている。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
フィールド変更の監視のクリア
jvmtiError
ClearFieldModificationWatch(jvmtiEnv* env,
jclass klass,
jfieldID field)
klassおよびfieldで指定されるフィールドに対して、SetFieldModificationWatchを使って以前に設定したフィールド変更の監視を取り消します。
ライブ段階でしか呼び出せない
いいえ
44
1.0
| 権限 | 効果 |
|---|---|
can_generate_field_modification_events |
フィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch
|
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 監視するフィールドを含むクラス |
field | jfieldID | 監視するフィールド |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_generate_field_modification_eventsを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_NOT_FOUND | 指定されたフィールドは変更が監視されていない。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
モジュール
モジュール機能:- すべてのモジュールを取得
- 名前付きモジュールを取得
- モジュールの読み込みを追加
- モジュールのエクスポートを追加
- モジュールのオープンの追加
- モジュール使用を追加
- モジュール提供を追加
- 変更可能モジュールか
すべてのモジュールを取得
jvmtiError
GetAllModules(jvmtiEnv* env,
jint* module_count_ptr,
jobject** modules_ptr)
仮想マシンにロードされたすべてのモジュールの配列を返します。 配列には、クラス・ローダーごとに名前のないモジュールが含まれます。 配列内のモジュールの数はmodule_count_ptr経由で返され、配列自体はmodules_ptr経由で返されます。
ライブ段階でしか呼び出せない
いいえ
3
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
module_count_ptr | jint* |
戻ったときに、返されたモジュールの数を示します。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
modules_ptr | jobject** |
戻り時には、各モジュールに1つずつ、参照の配列を指します。
エージェントはjobject*へのポインタを渡す。 戻ると、jobject*は、新しく割り当てられたサイズ*module_count_ptrの配列を指します。 この配列は、Deallocateを使って解放するべき。 modules_ptrによって返されるオブジェクトはJNIローカル参照であり、managedでなければなりません。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
module_count_ptrはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
modules_ptrはNULLです。
|
名前付きモジュールを取得
jvmtiError
GetNamedModule(jvmtiEnv* env,
jobject class_loader,
const char* package_name,
jobject* module_ptr)
指定されたパッケージを含むクラス・ローダーに定義されている、指定されたモジュールのjava.lang.Moduleオブジェクトを返します。 モジュールはmodule_ptr経由で返されます。
名前付きモジュールがクラス・ローダーに定義され、そのモジュールにパッケージが含まれている場合は、その名前付きモジュールが返され、それ以外の場合はNULLが返されます。
ライブ段階でしか呼び出せない
いいえ
40
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
class_loader | jobject |
クラス・ローダー。 class_loaderがNULLまたはjava.lang.ClassLoaderのサブクラスでない場合、この関数はJVMTI_ERROR_ILLEGAL_ARGUMENTを返します。
class_loaderがNULLの場合、ブートストラップ・ローダーが想定されます。
|
package_name | const char* |
「変更されたUTF-8」文字列としてエンコードされたパッケージの名前。 パッケージ名は内部形式(JVMS 4.2.1)で、識別子はピリオドではなくスラッシュで区切られます。
エージェントは、charの配列を渡す。 |
module_ptr | jobject* |
戻ったら、java.lang.Moduleオブジェクトをポイントするか、NULLをポイントします。
エージェントはjobjectへのポインタを渡す。 戻ったとき、jobjectが設定されている。 module_ptrによって返されるオブジェクトは、JNIローカル参照であり、managedでなければなりません。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
クラス・ローダーがNULLではなく、クラス・ローダー・オブジェクトでない場合。
|
JVMTI_ERROR_NULL_POINTER |
package_nameはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
module_ptrはNULLです。
|
モジュールの読み込みを追加
jvmtiError
AddModuleReads(jvmtiEnv* env,
jobject module,
jobject to_module)
モジュールを更新して別のモジュールを読み取ります。 moduleが名前のないモジュールの場合、この関数はno-opです。 この関数は、モジュールが読み取る一連のモジュールを拡張する必要がある、指定されたモジュール内のコードの計測を容易にします。
ライブ段階でしか呼び出せない
いいえ
94
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
module | jobject | 更新するモジュール。 |
to_module | jobject | 読み取る追加のモジュール。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_MODULE |
moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_INVALID_MODULE |
to_moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_UNMODIFIABLE_MODULE |
モジュールを変更できない場合。 IsModifiableModuleを参照してください。
|
JVMTI_ERROR_NULL_POINTER |
moduleはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
to_moduleはNULLです。
|
モジュールのエクスポートを追加
jvmtiError
AddModuleExports(jvmtiEnv* env,
jobject module,
const char* pkg_name,
jobject to_module)
パッケージを別のモジュールにエクスポートするようにモジュールを更新します。 moduleが名前のないモジュールまたはオープン・モジュールである場合、この関数はno-opです。 この関数は、モジュールがエクスポートする一連のパッケージを拡張する必要がある、指定されたモジュール内のコードの計測を容易にします。
ライブ段階でしか呼び出せない
いいえ
95
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
module | jobject | 更新するモジュール。 |
pkg_name | const char* |
エクスポートされたパッケージ名。
エージェントは、charの配列を渡す。 |
to_module | jobject |
パッケージのエクスポート先のモジュール。 to_moduleがjava.lang.Moduleのサブクラスでない場合、この関数はJVMTI_ERROR_INVALID_MODULEを返します。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_MODULE |
moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_INVALID_MODULE |
to_moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
パッケージpkg_nameがモジュールに属していない場合。
|
JVMTI_ERROR_UNMODIFIABLE_MODULE |
モジュールを変更できない場合。 IsModifiableModuleを参照してください。
|
JVMTI_ERROR_NULL_POINTER |
moduleはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
pkg_nameはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
to_moduleはNULLです。
|
モジュールのオープンを追加
jvmtiError
AddModuleOpens(jvmtiEnv* env,
jobject module,
const char* pkg_name,
jobject to_module)
モジュールを更新して、パッケージを別のモジュールに開きます。 moduleが名前のないモジュールまたはオープン・モジュールである場合、この関数はno-opです。 この関数は、モジュール内のコードのインストゥルメンテーションを容易にします。このインストゥルメンテーションでは、モジュールが他のモジュールに開く一連のパッケージを拡張する必要があります。
ライブ段階でしか呼び出せない
いいえ
96
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
module | jobject | 更新するモジュール。 |
pkg_name | const char* |
開くパッケージのパッケージ名。
エージェントは、charの配列を渡す。 |
to_module | jobject |
開くパッケージがあるモジュール。 to_moduleがjava.lang.Moduleのサブクラスでない場合、この関数はJVMTI_ERROR_INVALID_MODULEを返します。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_MODULE |
moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_INVALID_MODULE |
to_moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
パッケージpkg_nameがモジュールに属していない場合。
|
JVMTI_ERROR_UNMODIFIABLE_MODULE |
モジュールを変更できない場合。 IsModifiableModuleを参照してください。
|
JVMTI_ERROR_NULL_POINTER |
moduleはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
pkg_nameはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
to_moduleはNULLです。
|
モジュール使用を追加
jvmtiError
AddModuleUses(jvmtiEnv* env,
jobject module,
jclass service)
モジュールを更新して、モジュールが使用するサービスのセットにサービスを追加します。 この関数は、モジュールが名前のないモジュールの場合、no-opです。 この関数は、モジュールが使用している一連のサービスを拡張する必要がある、指定されたモジュール内のコードの計測を容易にします。
ライブ段階でしか呼び出せない
いいえ
97
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
module | jobject | 更新するモジュール。 |
service | jclass | 使用するサービス。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_MODULE |
moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_INVALID_CLASS |
serviceがクラス・オブジェクトでない場合。
|
JVMTI_ERROR_UNMODIFIABLE_MODULE |
モジュールを変更できない場合。 IsModifiableModuleを参照してください。
|
JVMTI_ERROR_NULL_POINTER |
moduleはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
serviceはNULLです。
|
モジュール提供を追加
jvmtiError
AddModuleProvides(jvmtiEnv* env,
jobject module,
jclass service,
jclass impl_class)
モジュールを更新して、モジュールが提供するサービスのセットにサービスを追加します。 この関数は、モジュールが名前のないモジュールの場合、no-opです。 この関数は、指定されたモジュール内のコードのインストゥルメンテーションを容易にします。このインストゥルメンテーションでは、提供されるサービスを変更する必要があります。
ライブ段階でしか呼び出せない
いいえ
98
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
module | jobject | 更新するモジュール。 |
service | jclass | 提供するサービス。 |
impl_class | jclass | 提供されたサービスの実装クラス。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_MODULE |
moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_INVALID_CLASS |
serviceがクラス・オブジェクトでない場合。
|
JVMTI_ERROR_INVALID_CLASS |
impl_classがクラス・オブジェクトでない場合。
|
JVMTI_ERROR_UNMODIFIABLE_MODULE |
モジュールを変更できない場合。 IsModifiableModuleを参照してください。
|
JVMTI_ERROR_NULL_POINTER |
moduleはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
serviceはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
impl_classはNULLです。
|
変更可能モジュールか
jvmtiError
IsModifiableModule(jvmtiEnv* env,
jobject module,
jboolean* is_modifiable_module_ptr)
モジュールが変更可能かどうかを決定します。 モジュールが変更可能な場合、このモジュールはAddModuleReads、AddModuleExports、AddModuleOpens、AddModuleUses、およびAddModuleProvidesで更新できます。 モジュールを変更できない場合、モジュールはこれらの関数で更新できません。 このファンクションの結果は、名前のないモジュールが変更可能かどうかを判断するためにコールされると常にJNI_TRUEになります。
ライブ段階でしか呼び出せない
いいえ
99
9
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
module | jobject | 問合せするモジュール。 |
is_modifiable_module_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_MODULE |
moduleがモジュール・オブジェクトでない場合。
|
JVMTI_ERROR_NULL_POINTER |
moduleはNULLです。
|
JVMTI_ERROR_NULL_POINTER |
is_modifiable_module_ptrはNULLです。
|
クラス
クラス関数:- ロード済みクラスの取得
- クラス・ローダー・クラスの取得
- クラスのシグニチャの取得
- クラスのステータスの取得
- ソース・ファイル名の取得
- クラスの修飾子の取得
- クラスのメソッドの取得
- クラスのフィールドの取得
- 実装されたインタフェースの取得
- クラス・バージョン番号の取得
- 定数プールの取得
- インタフェースかどうかの検査
- 配列クラスかどうかの検査
- 変更可能クラスかどうかの検査
- クラス・ローダーの取得
- ソース・デバッグ拡張機能の取得
- クラスの再変換
- クラスの再定義
-
jvmtiClassDefinition- クラスの再定義の説明
ロード済みクラスの取得
jvmtiError
GetLoadedClasses(jvmtiEnv* env,
jint* class_count_ptr,
jclass** classes_ptr)
仮想マシンにロードされている全クラスの配列を返します。 配列内のクラスの数はclass_count_ptr、配列自体はclasses_ptrによって返されます。
クラスまたはインタフェースの作成は、次のいずれかによってトリガーできます:
-
クラス・ローダー(「Javaの仮想マシン仕様の第5.3章」を参照)を使用して、
classファイル表現からクラスをロードおよび導出します。 -
classファイル表現から非表示のクラスまたはインタフェースを作成するLookup::defineHiddenClassを起動します。 - リフレクションなどの特定のJava SEプラットフォームAPIでメソッドを起動します。
java.lang.Integer.TYPE)は、返されるリストに含まれません。
ライブ段階でしか呼び出せない
いいえ
78
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
class_count_ptr | jint* |
戻ったとき、クラスの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
classes_ptr | jclass** |
戻ったとき、各クラスへの参照(クラスごとに1つずつ)の配列をポイントする。
エージェントはjclass*へのポインタを渡す。 戻ったとき、jclass*は、サイズ*class_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 classes_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
class_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
classes_ptrがNULL。
|
クラス・ローダー・クラスの取得
jvmtiError
GetClassLoaderClasses(jvmtiEnv* env,
jobject initiating_loader,
jint* class_count_ptr,
jclass** classes_ptr)
このクラス・ローダーがClassLoader::loadClass、Class::forNameおよびバイトコード・リンケージを介して名前で検索できるすべてのクラスの配列を返します。 つまり、initiating_loaderが開始ローダーとして記録されているすべてのクラスです。 返される配列内の各クラスは、このクラス・ローダーによって直接定義されて作成されたものか、または別のクラス・ローダーに委譲して作成されたものです。 Java™仮想マシン仕様のセクション5.3を参照してください。
返されるリストには、要素タイプが非表示のクラスまたはインタフェースである「非表示のクラスまたはインタフェース」または配列クラスは含まれません。これらは、どのクラス・ローダーでも検出できないためです。
配列内のクラスの数はclass_count_ptr、配列自体はclasses_ptrによって返されます。
Lookup::defineHiddenClassを参照してください。
ライブ段階でしか呼び出せない
いいえ
79
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
initiating_loader | jobject |
起動クラス・ローダー。
initiating_loaderがNULLの場合、ブートストラップ・ローダーによって起動されたクラスが返される。
|
class_count_ptr | jint* |
戻ったとき、クラスの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
classes_ptr | jclass** |
戻ったとき、各クラスへの参照(クラスごとに1つずつ)の配列をポイントする。
エージェントはjclass*へのポインタを渡す。 戻ったとき、jclass*は、サイズ*class_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 classes_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
class_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
classes_ptrがNULL。
|
クラスのシグニチャの取得
jvmtiError
GetClassSignature(jvmtiEnv* env,
jclass klass,
char** signature_ptr,
char** generic_ptr)
klassによって示されるクラスの名前とジェネリック・シグネチャを返します。
クラスがクラスまたはインタフェースの場合:
- クラスまたはインタフェースがhiddenでない場合、返される名前は「JNI型シグネチャ」です。 たとえば、java.util.Listは"Ljava/util/List;"です。
-
クラスまたはインタフェースがhiddenの場合、返される名前は次の形式の文字列です。 :
"L" + N + "." + S + ";"では、NはLookup::defineHiddenClassに渡されるclassファイルによって示される(JVMS 4.2.1)内部形式でエンコードされたバイナリ名で、Sは未修飾の名前です。 返された名前は型記述子ではなく、JVMS 4.3.2に準拠していません。 たとえば、com.foo.Foo/AnySuffixは"Lcom/foo/Foo.AnySuffix;"です。
klassで指定されたクラスが配列クラスを表す場合、返される名前は、配列のネストの深さを表す1つ以上の"["文字と、その後に要素タイプのクラス・シグネチャで構成される文字列です。 たとえば、java.lang.String []のクラス・シグネチャは"[Ljava/lang/String;"で、int []のクラス・シグネチャは"[I"です。
klassによって示されるクラスがプリミティブ型またはvoidを表す場合、返される名前は「対応するプリミティブ型の型シグネチャ文字」です。 たとえば、java.lang.Integer.TYPEは"I"です。
開始またはライブ段階でしか呼び出せない
いいえ
48
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
signature_ptr | char ** |
戻ったとき、クラスのJNI型シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 signature_ptrがNULLの場合、シグニチャは返されない。
|
generic_ptr | char ** |
戻ったとき、クラスのジェネリック・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。 クラスのジェネリック・シグニチャ属性が存在しない場合は、戻ったときNULLをポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 generic_ptrがNULLの場合、ジェネリックス・シグニチャは返されない。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
クラスのステータスの取得
jvmtiError
GetClassStatus(jvmtiEnv* env,
jclass klass,
jint* status_ptr)
クラスのステータスを取得します。 次のビットのうち、0個以上のビットがセットされます。
クラスのステータス・フラグ 定数 値 説明 JVMTI_CLASS_STATUS_VERIFIED1 クラスのバイト・コードが検証された。 JVMTI_CLASS_STATUS_PREPARED2 クラスの準備が完了した。 JVMTI_CLASS_STATUS_INITIALIZED4 クラスの初期化が完了した。 静的な初期化子が実行された。 JVMTI_CLASS_STATUS_ERROR8 初期化中のエラーによりクラスが使用できない。 JVMTI_CLASS_STATUS_ARRAY16 クラスは配列。 設定されている場合、その他のすべてのビットはゼロ。 JVMTI_CLASS_STATUS_PRIMITIVE32 クラスはプリミティブ・クラス( java.lang.Integer.TYPEなど)。 設定されている場合、その他のすべてのビットはゼロ。
開始またはライブ段階でしか呼び出せない
いいえ
49
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
status_ptr | jint* |
戻ったとき、このクラスの現在の状態としてクラスのステータス・フラグを1つ以上ポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
status_ptrがNULL。
|
ソース・ファイル名の取得
jvmtiError
GetSourceFileName(jvmtiEnv* env,
jclass klass,
char** source_name_ptr)
klassで指定されたクラスについて、source_name_ptrを介してソース・ファイル名を返します。 返される文字列は、ファイル名だけで、ディレクトリ名は含まれません。
プリミティブ・クラス(たとえば、java.lang.Integer.TYPE)および配列の場合、この関数はJVMTI_ERROR_ABSENT_INFORMATIONを返します。
開始またはライブ段階でしか呼び出せない
いいえ
50
1.0
| 権限 | 効果 |
|---|---|
can_get_source_file_name | クラスのソース・ファイルの名前を取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
source_name_ptr | char** |
戻ったとき、クラスのソース・ファイル名(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_source_file_nameを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ABSENT_INFORMATION | クラス情報に、ソース・ファイル名が含まれていない。 これには、クラスが配列クラスまたはプリミティブ・クラスである場合が含まれる。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
source_name_ptrがNULL。
|
クラスの修飾子の取得
jvmtiError
GetClassModifiers(jvmtiEnv* env,
jclass klass,
jint* modifiers_ptr)
klassで指定されたクラスのアクセス・フラグを、modifiers_ptrを介して返します。 アクセス・フラグは、Java™仮想マシン仕様の第4章に定義されています。
クラスが配列クラスの場合、そのpublic、privateおよびprotected修飾子は、そのコンポーネント型の修飾子と同じです。 プリミティブ型の配列の場合、このコンポーネント型は、プリミティブ・クラスの1つ(たとえば、java.lang.Integer.TYPE)で表現されます。
クラスがプリミティブ・クラスの場合、そのpublic修飾子は常にtrueになります。また、そのprotected修飾子およびprivate修飾子は常にfalseになります。
クラスが配列クラスまたはプリミティブ・クラスの場合、そのfinal修飾子は常にtrueになり、interface修飾子は常にfalseになります。 その他の修飾子の値は、この仕様では判定されません。
開始またはライブ段階でしか呼び出せない
いいえ
51
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
modifiers_ptr | jint* |
戻ったとき、このクラスの現在のアクセス・フラグをポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
modifiers_ptrがNULL。
|
クラスのメソッドの取得
jvmtiError
GetClassMethods(jvmtiEnv* env,
jclass klass,
jint* method_count_ptr,
jmethodID** methods_ptr)
klassで指定されたクラスに含まれるメソッドの数をmethod_count_ptrを介して返し、メソッドIDのリストをmethods_ptrを介して返します。 メソッドのリストには、本来のメソッドだけでなく、コンストラクタおよびstatic初期化子も含まれます。 直接宣言されたメソッドだけが返されます(継承したメソッドは返されない)。 配列クラスおよびプリミティブ・クラス(たとえば、java.lang.Integer.TYPE)の場合、空のメソッド・リストが返されます。
開始またはライブ段階でしか呼び出せない
いいえ
52
1.0
| 任意の機能 | |
|---|---|
| 権限 | 効果 |
can_maintain_original_method_order | クラス・ファイル内に出現する順序でメソッドを返すことができる |
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
method_count_ptr | jint* |
戻ったとき、このクラスで宣言されているメソッドの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
methods_ptr | jmethodID** |
戻ったとき、メソッドIDの配列をポイントする。
エージェントはjmethodID*へのポインタを渡す。 戻ったとき、jmethodID*は、サイズ*method_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_CLASS_NOT_PREPARED |
klassが準備されていない。
|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
method_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
methods_ptrがNULL。
|
クラスのフィールドの取得
jvmtiError
GetClassFields(jvmtiEnv* env,
jclass klass,
jint* field_count_ptr,
jfieldID** fields_ptr)
klassで指定されたクラスに含まれるフィールドの数をfield_count_ptrを介して返し、フィールドIDのリストをfields_ptrを介して返します。 直接宣言されたフィールドだけが返されます(継承したフィールドは返されない)。 フィールドは、クラス・ファイル内に出現する順序で返されます。 配列クラスおよびプリミティブ・クラス(たとえば、java.lang.Integer.TYPE)の場合、空のフィールド・リストが返されます。 JNIを使って、配列の長さを判別してください。
開始またはライブ段階でしか呼び出せない
いいえ
53
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
field_count_ptr | jint* |
戻ったとき、このクラスで宣言されているフィールドの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
fields_ptr | jfieldID** |
戻ったとき、フィールドIDの配列をポイントする。
エージェントはjfieldID*へのポインタを渡す。 戻ったとき、jfieldID*は、サイズ*field_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_CLASS_NOT_PREPARED |
klassが準備されていない。
|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
field_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
fields_ptrがNULL。
|
実装されたインタフェースの取得
jvmtiError
GetImplementedInterfaces(jvmtiEnv* env,
jclass klass,
jint* interface_count_ptr,
jclass** interfaces_ptr)
このクラスの直接のスーパー・インタフェースを返します。 クラスに対しては、この関数は、implements節で宣言されているインタフェースを返します。 インタフェースに対しては、この関数は、extends節で宣言されているインタフェースを返します。 配列クラスおよびプリミティブ・クラス(たとえば、java.lang.Integer.TYPE)の場合、空のインタフェース・リストが返されます。
開始またはライブ段階でしか呼び出せない
いいえ
54
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
interface_count_ptr | jint* |
戻ったとき、インタフェースの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
interfaces_ptr | jclass** |
戻ったとき、インタフェースの配列をポイントする。
エージェントはjclass*へのポインタを渡す。 戻ったとき、jclass*は、サイズ*interface_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 interfaces_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_CLASS_NOT_PREPARED |
klassが準備されていない。
|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
interface_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
interfaces_ptrがNULL。
|
クラス・バージョン番号の取得
jvmtiError
GetClassVersionNumbers(jvmtiEnv* env,
jclass klass,
jint* minor_version_ptr,
jint* major_version_ptr)
klassに指定されたクラスについては、Java™仮想マシン仕様の第4章で定義されているように、マイナー・バージョン番号とメジャー・バージョン番号を返します。
開始またはライブ段階でしか呼び出せない
いいえ
145
1.1
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
minor_version_ptr | jint* |
戻ったとき、クラス・ファイル形式のminor_version項目の値をポイントする。 ノート: クラス・ファイル形式との一貫性を保つために、マイナー・バージョン番号が最初のパラメータになっている。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
major_version_ptr | jint* |
戻ったとき、クラス・ファイル形式のmajor_version項目の値をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ABSENT_INFORMATION | クラスがプリミティブまたは配列クラスである。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
minor_version_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
major_version_ptrがNULL。
|
定数プールの取得
jvmtiError
GetConstantPool(jvmtiEnv* env,
jclass klass,
jint* constant_pool_count_ptr,
jint* constant_pool_byte_count_ptr,
unsigned char** constant_pool_bytes_ptr)
klassで示されたクラスについては、Java™仮想マシン仕様の第4章に記載されたconstant_pool項目の形式で定数プールのrawバイトを返します。 定数プールの形式は、クラス・ファイル形式のバージョンによって異なる可能性があるので、クラスのメジャー・バージョン番号、マイナー・バージョン番号に互換性があることを確認するようにしてください。
返される定数プールのレイアウトや内容が、定義元のクラス・ファイル内の定数プールと同じでないこともあります。 GetConstantPool()から返される定数プールのエントリ数は、定義元の定数プールのエントリ数と異なる場合があります。 エントリの順序が異なる場合もあります。 GetConstantPool()から返される定数プールは、GetBytecodes()が使用する定数プールに一致します。 つまり、GetBytecodes()から返されるバイト・コードに含まれる定数プール・インデックスは、GetConstantPool()から返される定数プールのエントリを参照します。 RetransformClassesおよびRedefineClassesは定数プールを変更できるため、この関数から返される定数プールは、それに応じて変更される可能性があります。 したがって、途中でクラスの再変換または再定義が行われた場合は、GetConstantPool()とGetBytecodes()の間の対応関係が維持されません。 ある特定のバイト・コードが使用する定数プール・エントリの値は、定義元クラス・ファイルの対応する値に一致します(インデックスが一致しない場合でも)。 バイト・コードが直接的にも間接的にも使用しない定数プール・エントリ(注釈に関連付けられているUTF-8文字列など)は、返された定数プール内に存在していなくてもかまいません。
開始またはライブ段階でしか呼び出せない
いいえ
146
1.1
| 権限 | 効果 |
|---|---|
can_get_constant_pool |
あるクラスの定数プールを取得できる - GetConstantPool
|
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
constant_pool_count_ptr | jint* |
戻ったとき、定数プール・テーブル内のエントリの数+1をポイントする。 これは、クラス・ファイル形式のconstant_pool_count項目に対応している。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
constant_pool_byte_count_ptr | jint* |
戻ったとき、返されたraw定数プール内のバイト数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
constant_pool_bytes_ptr | unsigned char** |
戻ったとき、raw定数プールをポイントする。これは、クラス・ファイル形式のconstant_pool項目で定義されたバイトになる。
エージェントはunsigned char*へのポインタを渡す。 戻ったとき、unsigned char*は、サイズ*constant_pool_byte_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_constant_poolを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ABSENT_INFORMATION | クラスがプリミティブまたは配列クラスである。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
constant_pool_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
constant_pool_byte_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
constant_pool_bytes_ptrがNULL。
|
インタフェースかどうかの検査
jvmtiError
IsInterface(jvmtiEnv* env,
jclass klass,
jboolean* is_interface_ptr)
クラス・オブジェクト参照がインタフェースを表しているかどうかを判定します。 クラスが実際にインタフェースである場合、jbooleanはJNI_TRUEを返し、インタフェースではない場合にはJNI_FALSEを返します。
開始またはライブ段階でしか呼び出せない
いいえ
55
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
is_interface_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
is_interface_ptrがNULL。
|
配列クラスかどうかの検査
jvmtiError
IsArrayClass(jvmtiEnv* env,
jclass klass,
jboolean* is_array_class_ptr)
クラス・オブジェクト参照が配列を表しているかどうかを判定します。 jbooleanは、クラスが配列である場合はJNI_TRUEになり、そうでない場合はJNI_FALSEになります。
開始またはライブ段階でしか呼び出せない
いいえ
56
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
is_array_class_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
is_array_class_ptrがNULL。
|
変更可能クラスかどうかの検査
jvmtiError
IsModifiableClass(jvmtiEnv* env,
jclass klass,
jboolean* is_modifiable_class_ptr)
クラスが変更可能かどうかを判定します。 クラスが変更可能である場合(is_modifiable_class_ptrがJNI_TRUEを返した場合)、そのクラスは、RedefineClassesを使って再定義したり(エージェントがcan_redefine_classes権限を所有していると仮定)、RetransformClassesを使って再変換したり(エージェントがcan_retransform_classes権限を所有していると仮定)できます。 あるクラスが変更不可能である場合(is_modifiable_class_ptrがJNI_FALSEを返した場合)、そのクラスは再定義することも再変換することもできません。
プリミティブ・クラス(たとえば、java.lang.Integer.TYPE)、配列クラスおよび一部の実装定義クラスは、変更できません。
開始またはライブ段階でしか呼び出せない
いいえ
45
1.1
| 任意の機能 | |
|---|---|
| 権限 | 効果 |
can_redefine_any_class |
所有していれば、すべてのクラス(プリミティブ、配列、および一部の実装定義クラスを除く)はRedefineClassesで変更可能です。
|
can_retransform_any_class |
所有していれば、すべてのクラス(プリミティブ、配列、および一部の実装定義クラスを除く)はRetransformClassesで変更可能です。
|
can_redefine_classes |
この関数の結果に何の影響も与えない。 ただし、RedefineClassesを使ってクラスを変更するには、これを追加で所有している必要があります。
|
can_retransform_classes |
この関数の結果に何の影響も与えない。 ただし、RetransformClassesを使ってクラスを変更するには、これを追加で所有している必要があります。
|
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
is_modifiable_class_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
is_modifiable_class_ptrがNULL。
|
クラス・ローダーの取得
jvmtiError
GetClassLoader(jvmtiEnv* env,
jclass klass,
jobject* classloader_ptr)
klassで指定されたクラスのクラス・ローダーの参照を、classloader_ptrを介して返します。
開始またはライブ段階でしか呼び出せない
いいえ
57
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
classloader_ptr | jobject* |
戻ったとき、このクラスをロードしたクラス・ローダーをポイントする。 クラスがクラス・ローダーで作成されていない場合、またはクラス・ローダーがブートストラップ・クラス・ローダーでない場合は、NULLをポイントする。
エージェントはjobjectへのポインタを渡す。 戻ったとき、jobjectが設定されている。 classloader_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
classloader_ptrがNULL。
|
ソース・デバッグ拡張機能の取得
jvmtiError
GetSourceDebugExtension(jvmtiEnv* env,
jclass klass,
char** source_debug_extension_ptr)
klassで指定されたクラスのデバッグ拡張機能を、source_debug_extension_ptrを介して返します。 返される文字列には、klassのクラス・ファイルに存在するデバッグ拡張情報がそのまま含まれます。
開始またはライブ段階でしか呼び出せない
いいえ
90
1.0
| 権限 | 効果 |
|---|---|
can_get_source_debug_extension | クラスのソース・デバッグ拡張機能を取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
source_debug_extension_ptr | char** |
戻ったとき、クラスのデバッグ拡張機能(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_source_debug_extensionを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ABSENT_INFORMATION | クラス情報に、デバッグ拡張が含まれていない。 |
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_NULL_POINTER |
source_debug_extension_ptrがNULL。
|
クラスの再変換
jvmtiError
RetransformClasses(jvmtiEnv* env,
jint class_count,
const jclass* classes)
この関数は、すでにロード済みのクラスのバイト・コード・インストゥルメンテーションを容易にします。 修正しながらデバッグを続けるためにソースから再コンパイルする場合のように、既存のバイト・コードを参照することなしにクラス定義を置換する場合は、代わりにRedefineClasses関数を使用するようにしてください。
クラスがはじめてロードされるときや再定義されるときに、その初期クラス・ファイル・バイトをClassFileLoadHookイベント経由で変換することができます。 この関数は、以前に変換が行われたかどうかには関係なく、変換処理を再実行します。 この再変換は次のステップで行われます。
- 初期クラス・ファイル・バイトから処理が開始されます。
-
前回のロードまたは再定義時に
ClassFileLoadHookイベントを受信した再変換不可能エージェントごとに、エージェントが(new_class_dataパラメータ経由で)返したバイトが変換の出力として再利用されます。これは、ClassFileLoadHookイベントがこれらのエージェントに送信されない点を除けば、前回の変換を変更なしに再適用するのと等価です。 -
再変換可能エージェントごとに、
ClassFileLoadHookイベントが送信されます。これにより、新しい変換を適用できるようになります。 - 変換されたクラス・ファイル・バイトがクラスの新しい定義としてインストールされます。
ClassFileLoadHookイベントを参照してください。
初期クラス・ファイル・バイトは、ClassLoader.defineClassまたはRedefineClassesに渡されたバイト(変換適用前)を表しますが、両者が厳密に一致しない可能性もあります。 定数プールが、GetConstantPoolで説明した点で異なる可能性があります。 メソッドのバイトコード内の定数プール・インデックスは対応します。 一部の属性が存在しない可能性があります。 メソッドの順序など、順序が意味を持たない場合には、順序が維持されないことがあります。
再変換を行うと、新しいバージョンのメソッドがインストールされる可能性があります。 古いバージョンのメソッドは廃止される可能性があります。以降の呼出しでは新しいバージョンのメソッドが使用されます。 メソッドがアクティブなスタック・フレームを持つ場合、それらのアクティブなスタック・フレームは元のメソッド・バージョンのバイト・コードを引き続き実行します。
この関数により、一般的なJVMセマンティックスのもとで行われる以外の初期化は起こりません。 つまり、クラスを再変換しても、そのクラスの初期化は実行されません。 staticフィールドの値は、呼出し前の状態のままです。
スレッドを中断する必要はありません。
クラス内のブレークポイントはクリアされます。
属性はすべて更新されます。
再変換されたクラスのインスタンスは影響を受けません。各フィールドは以前の値を維持します。 インスタンス上のタグも影響を受けません。
この呼び出しへの応答として、ClassFileLoadHook以外のイベントが送信されることはありません。
再変換によって、メソッド本体、定数プール、属性(明示的に禁止されていない場合)が変更される可能性があります。 再変換では、フィールドまたはメソッドの追加、削除、名前変更、メソッドのシグネチャの変更、修飾子の変更、継承の変更を行わないようにする必要があります。 再変換では、NestHost、NestMembers、RecordまたはPermittedSubclasses属性を変更しないでください。 これらの制限は将来のバージョンで解除される可能性があります。 未サポートの再変換が試みられた場合に返されるエラー・コードについては、後述のエラー戻り値の説明を参照してください。 クラス・ファイルのバイトが検証またはインストールされるのは、それらのバイトがClassFileLoadHookイベントのチェーンを通過した後なので、返されるエラー・コードは再変換の結果を反映したものになります。 JVMTI_ERROR_NONE以外のエラー・コードが返された場合、再変換対象のどのクラスについても、新しい定義がインストールされることはありません。 この関数が(エラー・コードJVMTI_ERROR_NONEで)復帰した場合は、再変換対象のすべてのクラスで新しい定義がインストールされます。
ライブ段階でしか呼び出せない
いいえ
152
1.1
| 権限 | 効果 |
|---|---|
can_retransform_classes |
RetransformClassesでクラスを再変換できる。 特定の実装によって適用されるこの権限の制限(「権限」セクションを参照)に加え、この権限は、この環境でClassFileLoadHookイベントがはじめて有効化される前に設定する必要がある。 ClassFileLoadHookがはじめて有効化された時点でこの権限を所有している環境を「再変換可能」と呼ぶ。 ClassFileLoadHookがはじめて有効化された時点でこの権限を所有していない環境を「再変換不可能」と呼ぶ。
|
| 任意の機能 | |
can_retransform_any_class |
RetransformClassesは、変更可能なすべてのクラスでコールできます。 IsModifiableClassを参照してください。(can_retransform_classesも設定する必要があります)
|
| 名前 | 型 | 説明 |
|---|---|---|
class_count | jint | 再変換されるクラスの数。 |
classes | const jclass* |
再変換されるクラスの配列。
エージェントはjclassのclass_count要素の配列を渡す。 |
クラスの再定義
指定されたクラスはすべて、提供される定義に従って再定義されます。 この関数は、あるクラスの定義を新しい定義で置き換える場合に使用されます(修正継続方式のデバッグで必要になる)。 バイトコード・インストゥルメンテーションのように、既存のクラス・ファイル・バイトを変換する必要がある場合は、typedef struct { jclass klass; jint class_byte_count; const unsigned char* class_bytes; } jvmtiClassDefinition;jvmtiError RedefineClasses(jvmtiEnv* env, jint class_count, const jvmtiClassDefinition* class_definitions)
RetransformClassesを使用すべきです。
再定義を行うと、新しいバージョンのメソッドがインストールされる可能性があります。 古いバージョンのメソッドは廃止される可能性があります。以降の呼出しでは新しいバージョンのメソッドが使用されます。 メソッドがアクティブなスタック・フレームを持つ場合、それらのアクティブなスタック・フレームは元のメソッド・バージョンのバイト・コードを引き続き実行します。 スタック・フレームをリセットする必要がある場合は、廃止されたバージョンのメソッドを含むフレームを、PopFrameを使用してポップします。
この関数により、一般的なJVMセマンティックスのもとで行われる以外の初期化は起こりません。 つまり、クラスの再定義では、クラスの初期化子は実行されません。 staticフィールドの値は、呼出し前の状態のままです。
スレッドを中断する必要はありません。
クラス内のブレークポイントはクリアされます。
属性はすべて更新されます。
再定義されたクラスのインスタンスは影響を受けません。各フィールドは以前の値を維持します。 インスタンス上のタグも影響を受けません。
この呼出しにこたえて、JVM TIイベントとしてクラス・ファイル・ロードフックが送信されます(有効な場合)。しかし、その他のJVM TIイベントは送信されません。
再定義では、メソッド本体、定数プール、属性(明示的に禁止されていない場合)を変更できます。 再定義では、フィールドまたはメソッドの追加、削除、名前変更、メソッドのシグネチャの変更、修飾子の変更、継承の変更を行わないようにする必要があります。 再定義では、NestHost、NestMembers、RecordまたはPermittedSubclasses属性を変更しないでください。 これらの制限は将来のバージョンで解除される可能性があります。 未サポートの再定義が試みられた場合に返されるエラー・コードについては、後述のエラー戻り値の説明を参照してください。 クラス・ファイルのバイトが検証またはインストールされるのは、それらのバイトがClassFileLoadHookイベントのチェーンを通過した後なので、返されるエラー・コードは、class_definitionsに渡されたバイトに適用された変換の結果を反映したものになります。 JVMTI_ERROR_NONE以外のエラー・コードが返された場合、再定義対象のどのクラスについても、新しい定義がインストールされることはありません。 この関数が(エラー・コードJVMTI_ERROR_NONEで)復帰した場合は、再定義対象のすべてのクラスで新しい定義がインストールされます。
ライブ段階でしか呼び出せない
いいえ
87
1.0
| 権限 | 効果 |
|---|---|
can_redefine_classes |
RedefineClassesでクラスを再定義できる。
|
| 任意の機能 | |
can_redefine_any_class |
RedefineClassesは、変更可能なすべてのクラスでコールできます。 IsModifiableClassを参照してください。(can_redefine_classesも設定する必要があります)
|
| フィールド | 型 | 説明 |
|---|---|---|
klass | jclass | このクラスのクラス・オブジェクト |
class_byte_count | jint | 定義するクラスのバイト数(下) |
class_bytes | const unsigned char* | クラスを定義するバイト(Java™仮想マシン仕様の第4章を参照) |
| 名前 | 型 | 説明 |
|---|---|---|
class_count | jint |
class_definitionsで指定されたクラスの数
|
class_definitions | const jvmtiClassDefinition* |
新しいクラス定義の配列
エージェントはjvmtiClassDefinitionのclass_count要素の配列を渡す。 |
オブジェクト
オブジェクト関数: オブジェクトの型:-
jvmtiMonitorUsage- オブジェクト・モニターの使用情報
オブジェクト・サイズの取得
jvmtiError
GetObjectSize(jvmtiEnv* env,
jobject object,
jlong* size_ptr)
objectで示されたオブジェクトについて、オブジェクトのサイズをsize_ptr経由で返します。 このサイズは、このオブジェクトにより消費されるストレージの容量の実装固有の近似値です。 これは、オブジェクトのオーバーヘッドの一部または全部を含む可能性があるため、実装内での比較には役立ちますが、実装間の比較には役立ちません。 この近似値は、JVMの単一呼出しの間に変わる可能性があります。
開始またはライブ段階でしか呼び出せない
いいえ
154
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
object | jobject | 照会するオブジェクト。 |
size_ptr | jlong* |
戻ったとき、オブジェクトのサイズ(バイト単位)をポイントする。
エージェントはjlongへのポインタを渡す。 戻ったとき、jlongが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_OBJECT |
objectがオブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
size_ptrがNULL。
|
オブジェクトのハッシュ・コードの取得
jvmtiError
GetObjectHashCode(jvmtiEnv* env,
jobject object,
jint* hash_code_ptr)
objectで示されたオブジェクトについて、ハッシュ・コードをhash_code_ptr経由で返します。 このハッシュ・コードを使えばオブジェクト参照のハッシュ・テーブルを保守できますが、その場合、一部の実装でパフォーマンスが大幅に低下する可能性があります。ほとんどの場合、オブジェクトに情報を関連付けるための手段としては、タグのほうが効率的です。 この関数は、特定のオブジェクトに対し、その存続期間を通じて同じハッシュ・コード値を保証します。
開始またはライブ段階でしか呼び出せない
いいえ
58
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
object | jobject | 照会するオブジェクト。 |
hash_code_ptr | jint* |
戻ったとき、オブジェクトのハッシュ・コードをポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_OBJECT |
objectがオブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
hash_code_ptrがNULL。
|
オブジェクトのモニターの利用情報を取得
オブジェクトのモニターに関する情報を取得します。typedef struct { jthread owner; jint entry_count; jint waiter_count; jthread* waiters; jint notify_waiter_count; jthread* notify_waiters; } jvmtiMonitorUsage;jvmtiError GetObjectMonitorUsage(jvmtiEnv* env, jobject object, jvmtiMonitorUsage* info_ptr)
jvmtiMonitorUsage構造体のフィールドに、モニターの使用に関する情報が入ります。
ライブ段階でしか呼び出せない
いいえ
59
1.0
| 権限 | 効果 |
|---|---|
can_get_monitor_info |
GetObjectMonitorUsageが可能
|
| フィールド | 型 | 説明 |
|---|---|---|
owner | jthread |
このモニターを所有しているスレッド。このモニターが使用されていない場合はNULL
|
entry_count | jint | このモニターを所有するスレッドがモニターを使用した回数 |
waiter_count | jint | このモニターを所有する順番を待っているスレッドの数 |
waiters | jthread* |
waiter_count待機スレッド
|
notify_waiter_count | jint | このモニターから通知を受ける待機スレッドの数 |
notify_waiters | jthread* |
通知を待っているnotify_waiter_countスレッド
|
| 名前 | 型 | 説明 |
|---|---|---|
object | jobject | 照会するオブジェクト。 |
info_ptr | jvmtiMonitorUsage* |
戻ったとき、指定されたオブジェクトのモニター情報が入っている。
エージェントはjvmtiMonitorUsageへのポインタを渡す。 戻ったとき、jvmtiMonitorUsageが設定されている。 jvmtiMonitorUsageのフィールドownerで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。 jvmtiMonitorUsageのwaitersフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiMonitorUsageのフィールドwaitersで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。 jvmtiMonitorUsageのnotify_waitersフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiMonitorUsageのフィールドnotify_waitersで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_monitor_infoを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_OBJECT |
objectがオブジェクトではない。
|
JVMTI_ERROR_NULL_POINTER |
info_ptrがNULL。
|
フィールド
フィールド関数:フィールドの名前とシグニチャの取得
jvmtiError
GetFieldName(jvmtiEnv* env,
jclass klass,
jfieldID field,
char** name_ptr,
char** signature_ptr,
char** generic_ptr)
klassとfieldで指定されたフィールドについて、名前をname_ptrで返し、シグニチャをsignature_ptrで返します。
フィールド・シグネチャは「JNI仕様」で定義され、「Java™仮想マシンの仕様、第4.3.2章」のfield descriptorsと呼ばれます。
開始またはライブ段階でしか呼び出せない
いいえ
60
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するフィールドのクラス。 |
field | jfieldID | 照会するフィールド。 |
name_ptr | char ** |
戻ったとき、フィールド名(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 name_ptrがNULLの場合、名前は返されない。
|
signature_ptr | char ** |
戻ったとき、フィールドのシグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 signature_ptrがNULLの場合、シグニチャは返されない。
|
generic_ptr | char ** |
戻ったとき、フィールドのジェネリック・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。 フィールドのジェネリック・シグニチャ属性が存在しない場合は、戻ったときNULLをポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 generic_ptrがNULLの場合、ジェネリックス・シグニチャは返されない。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
フィールドの宣言クラスの取得
jvmtiError
GetFieldDeclaringClass(jvmtiEnv* env,
jclass klass,
jfieldID field,
jclass* declaring_class_ptr)
klassとfieldで指定されたフィールドについて、そのフィールドを定義しているクラスをdeclaring_class_ptrを介して返します。 宣言しているクラスは、klass、スーパー・クラス、または実装されたインタフェースのいずれかです。
開始またはライブ段階でしか呼び出せない
いいえ
61
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
field | jfieldID | 照会するフィールド。 |
declaring_class_ptr | jclass* |
戻ったとき、宣言するクラスをポイントする。
エージェントはjclassへのポインタを渡す。 戻ったとき、jclassが設定されている。 declaring_class_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
JVMTI_ERROR_NULL_POINTER |
declaring_class_ptrがNULL。
|
フィールドの修飾子の取得
jvmtiError
GetFieldModifiers(jvmtiEnv* env,
jclass klass,
jfieldID field,
jint* modifiers_ptr)
klassとfieldで指定されたフィールドのアクセス・フラグを、modifiers_ptrを介して返します。 アクセス・フラグは、Java™仮想マシン仕様の第4章に定義されています。
開始またはライブ段階でしか呼び出せない
いいえ
62
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するクラス。 |
field | jfieldID | 照会するフィールド。 |
modifiers_ptr | jint* |
戻ったとき、アクセス・フラグをポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
JVMTI_ERROR_NULL_POINTER |
modifiers_ptrがNULL。
|
合成フィールドかどうかの検査
jvmtiError
IsFieldSynthetic(jvmtiEnv* env,
jclass klass,
jfieldID field,
jboolean* is_synthetic_ptr)
klassおよびfieldで指定されたフィールドに対し、is_synthetic_ptrを介してそのフィールドが合成であるかどうかを示す値を返します。 合成フィールドはコンパイラによって生成されますが、元のソース・コード内には存在しません。
開始またはライブ段階でしか呼び出せない
いいえ
63
1.0
| 権限 | 効果 |
|---|---|
can_get_synthetic_attribute |
フィールドまたはメソッドが合成であるかどうかをテストできます - IsFieldSyntheticとIsMethodSynthetic
|
| 名前 | 型 | 説明 |
|---|---|---|
klass | jclass | 照会するフィールドのクラス。 |
field | jfieldID | 照会するフィールド。 |
is_synthetic_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_synthetic_attributeを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_CLASS |
klassがクラス・オブジェクトでないか、クラスがアンロードされている。
|
JVMTI_ERROR_INVALID_FIELDID |
fieldがjfieldIDではない。
|
JVMTI_ERROR_NULL_POINTER |
is_synthetic_ptrがNULL。
|
メソッド
メソッド関数:- メソッドの名前とシグニチャの取得
- メソッドの宣言クラスの取得
- メソッドの修飾子の取得
- 局所変数の取得
- 引数のサイズの取得
- 行番号テーブルの取得
- メソッドの配置位置の取得
- 局所変数テーブルの取得
- バイト・コードの取得
- ネイティブ・メソッドかどうかの検査
- 合成メソッドかどうかの検査
- 廃棄されたメソッドかどうかの検査
- ネイティブ・メソッド接頭辞の設定
- 複数のネイティブ・メソッド接頭辞の設定
-
jvmtiLineNumberEntry- 行番号テーブルのエントリ -
jvmtiLocalVariableEntry- 局所変数テーブルのエントリ
jmethodIDとして表現)に関する情報を提供したり、メソッドの処理方法を設定したりします。
廃止メソッド
関数RetransformClassesおよびRedefineClassesを呼び出すと、新しいバージョンのメソッドがインストールされます。 元のメソッド・バージョンと新しいメソッド・バージョンが同等と見なされるのは、次のような場合です。
- 双方のメソッドのバイト・コードが同じ(定数プールのインデックスを除く)
- 参照定数が等しい。
IsMethodObsoleteを使用します。
メソッドの名前とシグニチャの取得
jvmtiError
GetMethodName(jvmtiEnv* env,
jmethodID method,
char** name_ptr,
char** signature_ptr,
char** generic_ptr)
methodで指定されたメソッドの名前をname_ptrを介して返し、メソッドのシグニチャをsignature_ptrを介して返します。
メソッド・シグネチャは「JNI仕様」で定義され、「Java™仮想マシンの仕様、第4.3.3章」のmethod descriptorsと呼ばれます。 Java言語仕様に定義されたメソッドのシグニチャとは異なる点に注意してください。
開始またはライブ段階でしか呼び出せない
いいえ
64
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
name_ptr | char ** |
戻ったとき、メソッド名(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 name_ptrがNULLの場合、名前は返されない。
|
signature_ptr | char ** |
戻ったとき、メソッド・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 signature_ptrがNULLの場合、シグニチャは返されない。
|
generic_ptr | char ** |
戻ったとき、メソッドのジェネリック・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。 メソッドのジェネリック・シグニチャ属性が存在しない場合は、戻ったときNULLをポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 generic_ptrがNULLの場合、ジェネリックス・シグニチャは返されない。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
メソッドの宣言クラスの取得
jvmtiError
GetMethodDeclaringClass(jvmtiEnv* env,
jmethodID method,
jclass* declaring_class_ptr)
methodで指定されたメソッドを定義するクラスを、declaring_class_ptrを介して返します。
開始またはライブ段階でしか呼び出せない
いいえ
65
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
declaring_class_ptr | jclass* |
戻ったとき、宣言するクラスをポイントする。
エージェントはjclassへのポインタを渡す。 戻ったとき、jclassが設定されている。 declaring_class_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NULL_POINTER |
declaring_class_ptrがNULL。
|
メソッドの修飾子の取得
jvmtiError
GetMethodModifiers(jvmtiEnv* env,
jmethodID method,
jint* modifiers_ptr)
methodで指定されたメソッドのアクセス・フラグを、modifiers_ptrを介して返します。 アクセス・フラグは、Java™仮想マシン仕様の第4章に定義されています。
開始またはライブ段階でしか呼び出せない
いいえ
66
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
modifiers_ptr | jint* |
戻ったとき、アクセス・フラグをポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NULL_POINTER |
modifiers_ptrがNULL。
|
局所変数の取得
jvmtiError
GetMaxLocals(jvmtiEnv* env,
jmethodID method,
jint* max_ptr)
methodで指定されたメソッドによって使用される局所変数(呼出し時にメソッドにパラメータを渡すために使用される局所変数を含む)のスロット数を返します。
Java™仮想マシン仕様のセクション4.7.3のmax_localsの説明を参照してください。
開始またはライブ段階でしか呼び出せない
いいえ
68
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
max_ptr | jint* |
戻ったとき、局所変数のスロットの最大数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NATIVE_METHOD |
methodはネイティブ・メソッド。
|
JVMTI_ERROR_NULL_POINTER |
max_ptrがNULL。
|
引数のサイズの取得
jvmtiError
GetArgumentsSize(jvmtiEnv* env,
jmethodID method,
jint* size_ptr)
methodで指定されたメソッドの引数によって使用される局所変数のスロット数を、max_ptrを介して返します。 なお、2ワードの引数は、スロットを2つ使用します。
開始またはライブ段階でしか呼び出せない
いいえ
69
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
size_ptr | jint* |
戻ったとき、引数のスロットの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NATIVE_METHOD |
methodはネイティブ・メソッド。
|
JVMTI_ERROR_NULL_POINTER |
size_ptrがNULL。
|
行番号テーブルの取得
typedef struct { jlocation start_location; jint line_number; } jvmtiLineNumberEntry;jvmtiError GetLineNumberTable(jvmtiEnv* env, jmethodID method, jint* entry_count_ptr, jvmtiLineNumberEntry** table_ptr)
methodで指定されたメソッドについて、ソース行番号のエントリから成るテーブルを返します。 テーブルのサイズはentry_count_ptr、テーブル自体はtable_ptrを介して返されます。
開始またはライブ段階でしか呼び出せない
いいえ
70
1.0
| 権限 | 効果 |
|---|---|
can_get_line_numbers | メソッドの行番号テーブルを取得できる |
| フィールド | 型 | 説明 |
|---|---|---|
start_location | jlocation |
行を開始するjlocation
|
line_number | jint | 行番号 |
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
entry_count_ptr | jint* |
戻ったとき、テーブル内のエントリの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
table_ptr | jvmtiLineNumberEntry** |
戻ったとき、行番号テーブルのポインタをポイントする。
エージェントはjvmtiLineNumberEntry*へのポインタを渡す。 戻ったとき、jvmtiLineNumberEntry*は、サイズ*entry_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_line_numbersを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ABSENT_INFORMATION | クラスの情報に行番号が含まれていない。 |
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NATIVE_METHOD |
methodはネイティブ・メソッド。
|
JVMTI_ERROR_NULL_POINTER |
entry_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
table_ptrがNULL。
|
メソッドの配置位置の取得
jvmtiError
GetMethodLocation(jvmtiEnv* env,
jmethodID method,
jlocation* start_location_ptr,
jlocation* end_location_ptr)
methodで指定されたメソッドについて、その開始アドレスと終了アドレスをstart_location_ptrとend_location_ptrを介して返します。 従来のバイトコード・インデックス・スキームでは、start_location_ptrは常にゼロをポイントし、end_location_ptrは常にバイト・コードから1を引いた値をポイントします。
開始またはライブ段階でしか呼び出せない
いいえ
71
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
start_location_ptr | jlocation* |
戻ったとき、最初の位置をポイントする。位置情報が得られない場合は-1をポイントする。 情報が使用可能で、GetJLocationFormatからJVMTI_JLOCATION_JVMBCIが返される場合、これは常にゼロになる。
エージェントはjlocationへのポインタを渡す。 戻ったとき、jlocationが設定されている。 |
end_location_ptr | jlocation* |
戻ったとき、最後の位置をポイントする。位置情報が得られない場合は-1をポイントする。
エージェントはjlocationへのポインタを渡す。 戻ったとき、jlocationが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ABSENT_INFORMATION | クラス情報にメソッドのサイズが含まれていない。 |
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NATIVE_METHOD |
methodはネイティブ・メソッド。
|
JVMTI_ERROR_NULL_POINTER |
start_location_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
end_location_ptrがNULL。
|
局所変数テーブルの取得
局所変数の情報を返します。typedef struct { jlocation start_location; jint length; char* name; char* signature; char* generic_signature; jint slot; } jvmtiLocalVariableEntry;jvmtiError GetLocalVariableTable(jvmtiEnv* env, jmethodID method, jint* entry_count_ptr, jvmtiLocalVariableEntry** table_ptr)
ライブ段階でしか呼び出せない
いいえ
72
1.0
| 権限 | 効果 |
|---|---|
can_access_local_variables | 局所変数を設定し、取得できる |
| フィールド | 型 | 説明 |
|---|---|---|
start_location | jlocation | この局所変数がはじめて有効になるコード配列インデックス(つまり、この局所変数はそこで値を持っていなければならない)。 |
length | jint |
この局所変数の有効部分の長さ。 この局所変数が有効である最後のコード配列インデックスは、start_location+lengthになる。
|
name | char* | 局所変数名。修正UTF-8文字列としてエンコードされる。 |
signature | char* | 局所変数の型のシグネチャ。修正UTF-8文字列としてエンコードされる。 このシグネチャの形式は、Java™仮想マシン仕様の4.3.2章で定義された形式と同じになる。 |
generic_signature | char* |
局所変数のジェネリック・シグネチャ。修正UTF-8文字列としてエンコードされる。 ジェネリック型でないすべての局所変数について、このフィールドの値はNULLになる。
|
slot | jint | 局所変数のスロット。 「局所変数」を参照。 |
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
entry_count_ptr | jint* |
戻ったとき、テーブル内のエントリの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
table_ptr | jvmtiLocalVariableEntry** |
戻ったとき、局所変数テーブルのエントリの配列をポイントする。
エージェントはjvmtiLocalVariableEntry*へのポインタを渡す。 戻ったとき、jvmtiLocalVariableEntry*は、サイズ*entry_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 jvmtiLocalVariableEntryのnameフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiLocalVariableEntryのsignatureフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiLocalVariableEntryのgeneric_signatureフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_access_local_variablesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ABSENT_INFORMATION | クラス情報に局所変数の情報が含まれていない。 |
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NATIVE_METHOD |
methodはネイティブ・メソッド。
|
JVMTI_ERROR_NULL_POINTER |
entry_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
table_ptrがNULL。
|
バイト・コードの取得
jvmtiError
GetBytecodes(jvmtiEnv* env,
jmethodID method,
jint* bytecode_count_ptr,
unsigned char** bytecodes_ptr)
methodによって示されるメソッドの場合、そのメソッドを実装するバイトコードを返します。 バイト・コードの数は、bytecode_count_ptrを介して返されます。 バイトコード自体はbytecodes_ptr経由で返されます。
開始またはライブ段階でしか呼び出せない
いいえ
75
1.0
| 権限 | 効果 |
|---|---|
can_get_bytecodes |
メソッドGetBytecodesのバイト・コードを取得できる
|
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
bytecode_count_ptr | jint* |
戻ったとき、バイトコード配列の長さをポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
bytecodes_ptr | unsigned char** |
戻ったとき、バイト・コードの配列へのポインタをポイントする。
エージェントはunsigned char*へのポインタを渡す。 戻ったとき、unsigned char*は、サイズ*bytecode_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_bytecodesを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NATIVE_METHOD |
methodはネイティブ・メソッド。
|
JVMTI_ERROR_NULL_POINTER |
bytecode_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
bytecodes_ptrがNULL。
|
ネイティブ・メソッドかどうかの検査
jvmtiError
IsMethodNative(jvmtiEnv* env,
jmethodID method,
jboolean* is_native_ptr)
methodで指定されたメソッドがネイティブ・メソッドかどうかを表す値を、is_native_ptrを介して返します。
開始またはライブ段階でしか呼び出せない
いいえ
76
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
is_native_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NULL_POINTER |
is_native_ptrがNULL。
|
合成メソッドかどうかの検査
jvmtiError
IsMethodSynthetic(jvmtiEnv* env,
jmethodID method,
jboolean* is_synthetic_ptr)
methodで指定されたメソッドが合成メソッドかどうかを表す値を、is_synthetic_ptrを介して返します。 合成メソッドは、コンパイラによって生成されますが、元のソース・コード内には存在しません。
開始またはライブ段階でしか呼び出せない
いいえ
77
1.0
| 権限 | 効果 |
|---|---|
can_get_synthetic_attribute |
フィールドまたはメソッドが合成であるかどうかをテストできます - IsFieldSyntheticとIsMethodSynthetic
|
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッド。 |
is_synthetic_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_synthetic_attributeを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NULL_POINTER |
is_synthetic_ptrがNULL。
|
廃棄されたメソッドかどうかの検査
jvmtiError
IsMethodObsolete(jvmtiEnv* env,
jmethodID method,
jboolean* is_obsolete_ptr)
メソッドIDが廃止メソッド・バージョンを参照しているかどうかを判定します。
開始またはライブ段階でしか呼び出せない
いいえ
91
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | 照会するメソッドID。 |
is_obsolete_ptr | jboolean* |
戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_METHODID |
methodがjmethodIDではない。
|
JVMTI_ERROR_NULL_POINTER |
is_obsolete_ptrがNULL。
|
ネイティブ・メソッド接頭辞の設定
jvmtiError
SetNativeMethodPrefix(jvmtiEnv* env,
const char* prefix)
この関数は、名前に接頭辞を適用して再試行できるようにすることにより、ネイティブ・メソッド解決のエラー処理を変更します。 これをClassFileLoadHookイベントと組み合わせて使用すれば、ネイティブ・メソッドの計測が可能になります。
ネイティブ・メソッドはバイト・コードを持たないので、直接計測できません。したがって、計測可能なネイティブでないメソッドでネイティブ・メソッドをラップする必要があります。 たとえば次を考えます。
これが次のようになるように、(ClassFileLoadHookイベントを使って)クラス・ファイルを変換できます。native boolean foo(int x);
boolean foo(int x) {
... record entry to foo ...
return wrapped_foo(x);
}
native boolean wrapped_foo(int x);
ここでfooは、接頭辞「wrapped_」が付加された実際のネイティブ・メソッドのラッパーになっています。 ただし、「wrapped_」は既存のメソッドの名前の一部として使用されている可能性があるため、接頭辞としてはよい選択肢ではありません。「$$$MyAgentWrapped$$$_」のような接頭辞の方が適切ですが、そうするとこの例が読みにくくなってしまいます。
ラッパーによってネイティブ・メソッド呼出しのデータ収集が可能になりますが、次に問題となるのは、ラップされたメソッドとネイティブ実装との関連付けです。 つまり、メソッドwrapped_fooを次のようなネイティブ実装fooに解決する必要があります。
この関数を使えば、接頭辞を指定し、適切な解決が行われるようにできます。 具体的には、標準の解決が失敗した場合に、接頭辞を考慮して再び解決が試みられます。 解決方法は2つあります。JNI関数Java_somePackage_someClass_foo(JNIEnv* env, jint x)
RegisterNativesによる明示的な解決と、通常の自動解決です。 RegisterNativesの場合、VMは次の関連付けを試みます。
これに失敗すると、指定された接頭辞をメソッド名の先頭に追加して解決が再試行され、次のような正しい解決が得られます。method(foo) -> nativeImplementation(foo)
自動解決の場合、VMは次を試みます。method(wrapped_foo) -> nativeImplementation(foo)
これに失敗すると、指定された接頭辞を実装名から削除して解決が再試行され、次の正しい解決が得られます。method(wrapped_foo) -> nativeImplementation(wrapped_foo)
接頭辞が使用されるのは標準の解決が失敗した場合だけなので、ネイティブ・メソッドのラップは選択的に行えます。 各JVM TI環境は独立しており、それぞれが独自のバイト・コード変換を行えるため、複数の層のラッパーが適用される可能性があります。 したがって、環境ごとに異なる接頭辞が必要になります。 変換は順番に適用されるため、接頭辞を適用する場合、接頭辞は変換と同じ順番で適用されます。 変換の適用順については、method(wrapped_foo) -> nativeImplementation(foo)
ClassFileLoadHookイベントを参照してください。 つまり、3つの環境がラッパーを適用した場合、fooは$env3_$env2_$env1_fooのようになります。 しかし、たとえば2番目の環境がfooにラッパーを適用しなかった場合は、単に$env3_$env1_fooとなります。 接頭辞のシーケンスを効率的に決定できるようにするため、途中の接頭辞は、そのネイティブでないラッパーが存在する場合にのみ適用されます。 つまりこの例では、$env1_fooがネイティブ・メソッドでなくても、$env1_fooが存在するため$env1_接頭辞が適用されます。
接頭辞は解決時に使用されますが、その解決はいつでも遅延される可能性があります。したがって、ネイティブ・メソッドの接頭辞は、対応する接頭辞付きのネイティブ・メソッドが存在しているかぎり、設定されたままにしておく必要があります。
どの段階でも呼び出せる
いいえ
73
1.1
| 権限 | 効果 |
|---|---|
can_set_native_method_prefix |
ネイティブ・メソッドを解決できない場合に適用すべき接頭辞を設定できる - SetNativeMethodPrefixおよびSetNativeMethodPrefixes
|
| 名前 | 型 | 説明 |
|---|---|---|
prefix | const char * |
適用する接頭辞。修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。 prefixがNULLの場合、この環境の既存の接頭辞が取り消される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_set_native_method_prefixを持たない。 AddCapabilitiesを使用する。
|
複数のネイティブ・メソッド接頭辞の設定
jvmtiError
SetNativeMethodPrefixes(jvmtiEnv* env,
jint prefix_count,
char** prefixes)
通常のエージェントの場合、SetNativeMethodPrefixが、ネイティブ・メソッドの接頭辞設定に必要とされるすべての機能を提供します。 複数の独立したクラス・ファイル変換を実行するメタエージェント(別の層のエージェントのプロキシとしてのエージェントなど)の場合、この関数を使うと、各変換に独自の接頭辞を割り当てることができます。 プレフィクスは指定された順序で適用され、SetNativeMethodPrefixの複数のJVMTI環境からのプレフィクスの適用で説明されているのと同じ方法で処理されます。
以前の接頭辞はすべて置換されます。 したがって、prefix_countに0を指定してこの関数を呼び出すと、この環境の接頭辞機能が無効になります。
SetNativeMethodPrefixとこの関数が、接頭辞を設定するための2つの方法です。 1つの接頭辞を指定してSetNativeMethodPrefixを呼び出すのは、prefix_countに1を指定してこの関数を呼び出すのと同じです。 NULLを指定してSetNativeMethodPrefixを呼び出すのは、prefix_countに0を指定してこの関数を呼び出すのと同じです。
どの段階でも呼び出せる
いいえ
74
1.1
| 権限 | 効果 |
|---|---|
can_set_native_method_prefix |
ネイティブ・メソッドを解決できない場合に適用すべき接頭辞を設定できる - SetNativeMethodPrefixおよびSetNativeMethodPrefixes
|
| 名前 | 型 | 説明 |
|---|---|---|
prefix_count | jint | 適用する接頭辞の数。 |
prefixes | char ** | この環境で適用する接頭辞。それぞれ修正UTF-8文字列としてエンコードされる。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_set_native_method_prefixを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
prefix_countが0より小さい。
|
JVMTI_ERROR_NULL_POINTER |
prefixesがNULL。
|
rawモニター
rawモニター関数:rawモニターの作成
jvmtiError
CreateRawMonitor(jvmtiEnv* env,
const char* name,
jrawMonitorID* monitor_ptr)
rawモニターを作成します。
OnLoadまたはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
31
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
name | const char* |
モニターを識別する名前。修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。 |
monitor_ptr | jrawMonitorID* |
戻ったとき、作成されたモニターをポイントする。
エージェントはjrawMonitorIDへのポインタを渡す。 戻ったとき、jrawMonitorIDが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
nameがNULL。
|
JVMTI_ERROR_NULL_POINTER |
monitor_ptrがNULL。
|
rawモニターの破棄
jvmtiError
DestroyRawMonitor(jvmtiEnv* env,
jrawMonitorID monitor)
rawモニターを破棄します。 破棄されるモニターがこのスレッドによって入力された場合、破棄される前に終了します。 破棄されるモニターが別のスレッドによって入力された場合、エラーが返され、モニターの破棄は行われません。
OnLoadまたはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
32
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
monitor | jrawMonitorID | モニター |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_MONITOR_OWNER | モニターの所有者ではない。 |
JVMTI_ERROR_INVALID_MONITOR |
monitorがjrawMonitorIDではない。
|
rawモニターの開始
jvmtiError
RawMonitorEnter(jvmtiEnv* env,
jrawMonitorID monitor)
rawモニターの排他的所有権を取得します。 同じスレッドで複数回モニターを入力することができます。 スレッドは、モニターを入力回数分だけ終了する必要があります。 モニターがOnLoad (接続されたスレッドが生成される前)の段階で入力され、接続されたスレッドが生成された時点で終了していない場合、入力はメイン・スレッドで行われたと認識されます。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
33
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
monitor | jrawMonitorID | モニター |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_MONITOR |
monitorがjrawMonitorIDではない。
|
rawモニターの終了
jvmtiError
RawMonitorExit(jvmtiEnv* env,
jrawMonitorID monitor)
rawモニターの排他的所有権を解放します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
34
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
monitor | jrawMonitorID | モニター |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_MONITOR_OWNER | モニターの所有者ではない。 |
JVMTI_ERROR_INVALID_MONITOR |
monitorがjrawMonitorIDではない。
|
rawモニターの待機
jvmtiError
RawMonitorWait(jvmtiEnv* env,
jrawMonitorID monitor,
jlong millis)
rawモニターの通知を待ちます。
別のスレッドが指定されたrawモニターのRawMonitorNotifyまたはRawMonitorNotifyAllを呼び出すか、指定されたtimeoutが経過するまで、現在のスレッドを待機させます。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
35
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
monitor | jrawMonitorID | モニター |
millis | jlong | タイム・アウト(ミリ秒単位)。 タイム・アウトがゼロの場合、実際の時間は考慮されず、スレッドは単に通知されるまで待機する。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_MONITOR_OWNER | モニターの所有者ではない。 |
JVMTI_ERROR_INTERRUPT | 待機中に割込みが発生したため、再試行の必要あり。 |
JVMTI_ERROR_INVALID_MONITOR |
monitorがjrawMonitorIDではない。
|
rawモニターの通知
jvmtiError
RawMonitorNotify(jvmtiEnv* env,
jrawMonitorID monitor)
rawモニターを待機中の1つのスレッドに通知します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
36
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
monitor | jrawMonitorID | モニター |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_MONITOR_OWNER | モニターの所有者ではない。 |
JVMTI_ERROR_INVALID_MONITOR |
monitorがjrawMonitorIDではない。
|
rawモニターの通知(すべて)
jvmtiError
RawMonitorNotifyAll(jvmtiEnv* env,
jrawMonitorID monitor)
rawモニターを待機中のすべてのスレッドに通知します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
37
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
monitor | jrawMonitorID | モニター |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_MONITOR_OWNER | モニターの所有者ではない。 |
JVMTI_ERROR_INVALID_MONITOR |
monitorがjrawMonitorIDではない。
|
JNI関数の遮断
JNI関数の遮断関数: Java Native Interface (JNI)関数テーブルの操作により、JNI関数呼出しの遮断および再送信の機能を提供します。 『Java Native Interface仕様』の「JNI関数」の説明を参照してください。 次に、カウント参照の作成順にJNI呼び出しNewGlobalRefを遮断する例を示します。
JNIEnv original_jni_Functions;
JNIEnv redirected_jni_Functions;
int my_global_ref_count = 0;
jobject
MyNewGlobalRef(JNIEnv *jni_env, jobject lobj) {
++my_global_ref_count;
return originalJNIFunctions->NewGlobalRef(env, lobj);
}
void
myInit() {
jvmtiError err;
err = (*jvmti_env)->GetJNIFunctionTable(jvmti_env, &original_jni_Functions);
if (err != JVMTI_ERROR_NONE) {
die();
}
err = (*jvmti_env)->GetJNIFunctionTable(jvmti_env, &redirected_jni_Functions);
if (err != JVMTI_ERROR_NONE) {
die();
}
redirectedJNIFunctions->NewGlobalRef = MyNewGlobalRef;
err = (*jvmti_env)->SetJNIFunctionTable(jvmti_env, redirected_jni_Functions);
if (err != JVMTI_ERROR_NONE) {
die();
}
}
myInitを呼び出したあと、ユーザーのJNIコードが実行され、新しいグローバル参照を作成する呼出しが行われることがあります。 この呼出しは、通常のJNI実装ではなく、myNewGlobalRefに渡されます。 データの収集後も通常のJNI関数を呼び出せるように、元の関数テーブルのコピーは保持されます。 また、上書きされないJNI関数の動作は、通常どおりです。
JNI関数テーブルの設定
jvmtiError
SetJNIFunctionTable(jvmtiEnv* env,
const jniNativeInterface* function_table)
現在および将来のすべてのJNI環境のJNI関数テーブルを設定します。 このため、将来のJNI呼出しはすべて、指定された関数に渡されます。 この関数に渡す関数テーブルを取得するには、GetJNIFunctionTableを使用します。 この関数を有効にするには、更新された表エントリをJNIクライアントが使用する必要があります。 このテーブルはconstとして定義されるため、コンパイラによっては最適化によってテーブルへのアクセス機能が除去され、その結果、この関数が無効になる可能性があります。 テーブルはコピーされます。テーブルのローカル・コピーを変更しても、何の効果もありません。 この関数の影響を受けるのは関数テーブルのみであり、環境の他の側面はすべて何の影響も受けません。 前述の例を参照してください。
開始またはライブ段階でしか呼び出せない
いいえ
120
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
function_table | const jniNativeInterface * |
新しいJNI関数テーブルをポイントする。
エージェントはjniNativeInterfaceへのポインタを渡す。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
function_tableがNULL。
|
JNI関数テーブルの取得
jvmtiError
GetJNIFunctionTable(jvmtiEnv* env,
jniNativeInterface** function_table)
JNI関数テーブルを取得します。 JNI関数テーブルは、割り当てられたメモリーにコピーされます。 SetJNIFunctionTableが呼び出されていた場合、(元の関数テーブルではなく)変更後の関数テーブルが返されます。 コピーされるのは関数テーブルのみであり、環境の他の側面はコピーされません。 前述の例を参照してください。
開始またはライブ段階でしか呼び出せない
いいえ
121
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
function_table | jniNativeInterface ** |
戻ったとき、*function_tableは新しく割り当てられたJNI関数テーブルのコピーをポイントする。
エージェントはjniNativeInterface*へのポインタを渡す。 戻り時に、jniNativeInterface*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
function_tableがNULL。
|
イベント管理
イベント管理関数: イベント管理の型:-
jvmtiEventMode- イベントの有効化と無効化
イベント・コールバックの設定
jvmtiError
SetEventCallbacks(jvmtiEnv* env,
const jvmtiEventCallbacks* callbacks,
jint size_of_callbacks)
イベントごとに呼び出される関数を設定します。 コールバックを指定するには、置換用の関数テーブルを提供します。 関数テーブルはコピーされます。テーブルのローカル・コピーを変更しても、何の効果もありません。 これはアトミックなアクションであり、一度にすべてのコールバックが設定されます。 この関数を呼び出すまで、イベントは送信されません。 エントリがNULLの場合またはイベントがsize_of_callbacksを超えている場合、イベントは送信されません。 イベントの詳細は、このドキュメントの後のほうで説明します。 イベントが送信されるためには、イベントを有効化し、そのコールバックを登録する必要があります。この関数とSetEventNotificationModeの呼出し順序は、結果に影響を与えません。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
122
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
callbacks | const jvmtiEventCallbacks * |
新しいイベント・コールバック。
エージェントはjvmtiEventCallbacksへのポインタを渡す。 callbacksがNULLの場合、既存のコールバックは削除される。
|
size_of_callbacks | jint |
sizeof(jvmtiEventCallbacks)-- バージョン間の互換性を実現。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
size_of_callbacksが0より小さい。
|
イベント通知モードの設定
イベントの生成を制御します。typedef enum { JVMTI_ENABLE = 1, JVMTI_DISABLE = 0 } jvmtiEventMode;jvmtiError SetEventNotificationMode(jvmtiEnv* env, jvmtiEventMode mode, jvmtiEvent event_type, jthread event_thread, ...)
イベントの有効化と無効化( jvmtiEventMode)定数 値 説明 JVMTI_ENABLE1 modeがJVMTI_ENABLEの場合、イベントevent_typeが有効化されるJVMTI_DISABLE0 modeがJVMTI_DISABLEの場合、イベントevent_typeが無効化される
event_threadがNULLの場合、イベントはグローバルに有効化または無効化されます。それ以外の場合、特定のスレッドに対して有効化または無効化されます。 あるイベントが特定のスレッドで生成されるのは、そのイベントがスレッド・レベル、グローバル・レベルのいずれかで有効化された場合です。
個々のイベントについての情報は、後述する説明を参照してください。
次のイベントは、この関数を使ってスレッド・レベルでは制御できません。
-
VMInit -
VMStart -
VMDeath -
ThreadStart -
VirtualThreadStart -
CompiledMethodLoad -
CompiledMethodUnload -
DynamicCodeGenerated -
DataDumpRequest
OnLoadまたはライブ段階でしか呼び出せない
いいえ
2
1.0
| 名前 | 型 | 説明 |
|---|---|---|
mode | jvmtiEventMode |
JVMTI_ENABLEまたはJVMTI_DISABLE
|
event_type | jvmtiEvent | 制御するイベント |
event_thread | jthread |
制御するスレッド
event_threadがNULLの場合、イベントはグローバル・レベルで制御される。
|
... | ... | 将来の拡張用 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_INVALID_THREAD |
event_threadがNULL以外で、有効なスレッドでない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
event_threadはNULL以外で、(未開始または終了)が有効ではありません。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT | スレッド・レベルの制御が許可されていないイベントで、スレッド・レベルの制御が試行された。 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY | 必要なイベントを有効化する権限を持っていない。 |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
modeがjvmtiEventModeではない。
|
JVMTI_ERROR_INVALID_EVENT_TYPE |
event_typeがjvmtiEventではない。
|
イベントの生成
jvmtiError
GenerateEvents(jvmtiEnv* env,
jvmtiEvent event_type)
VMの現在の状態を表すイベントを生成します。 たとえば、event_typeがJVMTI_EVENT_COMPILED_METHOD_LOADの場合、現在コンパイル済のメソッドごとにCompiledMethodLoadイベントが送信されます。 過去にロードされたが現在はアンロード済であるようなメソッドは、送信されません。 以前に送信されたイベントの履歴は、この関数で送信されるイベントに影響を与えません。たとえば、この関数を呼び出すたびに、現在コンパイル済のすべてのメソッドが送信されます。
エージェントがプログラムの実行開始後に接続されたことにより、イベントが失われた場合は、この関数を使って失われたイベントを生成できます。
Javaプログラミング言語コードまたはJNI関数の実行の試みは、この関数が復帰するまで一時停止される可能性があるので、どちらもイベント送信スレッドから呼び出すべきではありません。 不足するイベントが送信されて処理され、復帰するまで、この関数は復帰しません。 イベントは、発生元のスレッドとは別のスレッド上で送信される場合があります。 SetEventCallbacksでイベントのコールバックを設定し、SetEventNotificationModeでイベントを有効化しないと、イベントは発生しません。 要求されたイベントの一部または全部を生成するための情報がVMにもう残っていない場合、単にイベントが送信されず、エラーも返されません。
サポートされるイベントは次のとおりです。
ライブ段階でしか呼び出せない
いいえ
123
1.0
| 任意の機能 | |
|---|---|
| 権限 | 効果 |
can_generate_compiled_method_load_events | メソッドのコンパイル時またはアンロード時にイベントを生成できる |
| 名前 | 型 | 説明 |
|---|---|---|
event_type | jvmtiEvent | 生成するイベントのタイプ。 次のいずれかとする。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
event_typeがJVMTI_EVENT_COMPILED_METHOD_LOADで、can_generate_compiled_method_load_eventsがfalse。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
event_typeがJVMTI_EVENT_COMPILED_METHOD_LOADでもJVMTI_EVENT_DYNAMIC_CODE_GENERATEDでもない。
|
JVMTI_ERROR_INVALID_EVENT_TYPE |
event_typeがjvmtiEventではない。
|
拡張機能メカニズム
拡張機能メカニズム関数: 拡張機能メカニズムの関数型: 拡張機能メカニズムの型:-
jvmtiParamTypes- 拡張関数/イベント・パラメータの型 -
jvmtiParamKind- 拡張関数/イベント・パラメータの種類 -
jvmtiParamInfo- 拡張関数/イベント・パラメータ情報 -
jvmtiExtensionFunctionInfo- 拡張関数情報 -
jvmtiExtensionEventInfo- 拡張イベント情報
拡張関数/イベント・パラメータの型( jvmtiParamTypes)定数 値 説明 JVMTI_TYPE_JBYTE101 Javaプログラミング言語プリミティブ型 - byte。 JNI型jbyte。JVMTI_TYPE_JCHAR102 Javaプログラミング言語プリミティブ型 - char。 JNI型jchar。JVMTI_TYPE_JSHORT103 Javaプログラミング言語プリミティブ型 - short。 JNI型jshort。JVMTI_TYPE_JINT104 Javaプログラミング言語プリミティブ型 - int。 JNI型jint。JVMTI_TYPE_JLONG105 Javaプログラミング言語プリミティブ型 - long。 JNI型jlong。JVMTI_TYPE_JFLOAT106 Javaプログラミング言語プリミティブ型 - float。 JNI型jfloat。JVMTI_TYPE_JDOUBLE107 Javaプログラミング言語プリミティブ型 - double。 JNI型jdouble。JVMTI_TYPE_JBOOLEAN108 Javaプログラミング言語プリミティブ型 - boolean。 JNI型jboolean。JVMTI_TYPE_JOBJECT109 Javaプログラミング言語オブジェクト型 - java.lang.Object。 JNI型jobject。 戻り値はJNIローカル参照で、管理対象。JVMTI_TYPE_JTHREAD110 Javaプログラミング言語オブジェクト型 - java.lang.Thread。 JVM TI型jthread。 戻り値はJNIローカル参照で、管理対象。JVMTI_TYPE_JCLASS111 Javaプログラミング言語オブジェクト型 - java.lang.Class。 JNI型jclass。 戻り値はJNIローカル参照で、管理対象。JVMTI_TYPE_JVALUE112 すべてのJavaプログラミング言語プリミティブ型およびオブジェクト型の和集合 - JNI型 jvalue。 戻り値は、オブジェクト型がJNIローカル参照であることを表しており、管理対象。JVMTI_TYPE_JFIELDID113 Javaプログラミング言語フィールド識別子 - JNI型 jfieldID。JVMTI_TYPE_JMETHODID114 Javaプログラミング言語メソッド識別子 - JNI型 jmethodID。JVMTI_TYPE_CCHAR115 Cプログラミング言語型 - char。JVMTI_TYPE_CVOID116 Cプログラミング言語型 - void。JVMTI_TYPE_JNIENV117 JNI環境 - JNIEnv。 ポインタ型にするには、適切なjvmtiParamKindとともに使用する必要がある。
拡張関数/イベント・パラメータの種類( jvmtiParamKind)定数 値 説明 JVMTI_KIND_IN91 入力引数 - foo。JVMTI_KIND_IN_PTR92 入力ポインタ引数 - const foo*。JVMTI_KIND_IN_BUF93 入力配列引数 - const foo*。JVMTI_KIND_ALLOC_BUF94 割当て済み出力配列引数 - foo**。Deallocateで解放。JVMTI_KIND_ALLOC_ALLOC_BUF95 割当て済み配列引数の割当て済み出力配列 - foo***。Deallocateで解放。JVMTI_KIND_OUT96 出力引数 - foo*。JVMTI_KIND_OUT_BUF97 出力配列引数(エージェントにより事前に割当て済み) - foo*。Deallocateは不可。
拡張関数/イベント・パラメータ情報
typedef struct { char* name; jvmtiParamKind kind; jvmtiParamTypes base_type; jboolean null_ok; } jvmtiParamInfo;
jvmtiParamInfo- 拡張関数/イベント・パラメータ情報フィールド 型 説明 namechar*パラメータ名。修正UTF-8文字列でエンコードされる kindjvmtiParamKindパラメータの種類 - 型修飾子 base_typejvmtiParamTypesパラメータの基底型 - kindにより変更済みnull_okjbooleanNULL引数を許可するか。 ポインタ型とオブジェクト型のみに適用。
拡張関数
typedef jvmtiError (JNICALL *jvmtiExtensionFunction)
(jvmtiEnv* jvmti_env,
...);
実装固有の拡張関数です。
| 名前 | 型 | 説明 |
|---|---|---|
jvmti_env | jvmtiEnv * | JVM TI環境は、拡張関数の唯一の固定パラメータ。 |
... | ... | 拡張関数固有のパラメータ。 |
拡張関数の取得
拡張関数のセットを返します。typedef struct { jvmtiExtensionFunction func; char* id; char* short_description; jint param_count; jvmtiParamInfo* params; jint error_count; jvmtiError* errors; } jvmtiExtensionFunctionInfo;jvmtiError GetExtensionFunctions(jvmtiEnv* env, jint* extension_count_ptr, jvmtiExtensionFunctionInfo** extensions)
OnLoadまたはライブ段階でしか呼び出せない
いいえ
124
1.0
権限
必要な機能
| フィールド | 型 | 説明 |
|---|---|---|
func | jvmtiExtensionFunction | 呼び出される実際の関数 |
id | char* |
拡張関数の識別子。修正UTF-8文字列としてエンコードされる。 パッケージの命名規則を使用する。 たとえば、com.sun.hotspot.bar
|
short_description | char* | 関数を1文で説明。修正UTF-8文字列でエンコードされる。 |
param_count | jint |
jvmtiEnv *jvmti_envを除くパラメータ数
|
params | jvmtiParamInfo * |
param_countパラメータの配列(jvmtiEnv *jvmti_envは除外)
|
error_count | jint | エラー戻り値の数(汎用エラーを除く) |
errors | jvmtiError * |
error_countのエラーの配列
|
| 名前 | 型 | 説明 |
|---|---|---|
extension_count_ptr | jint* |
戻ったとき、拡張関数の数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
extensions | jvmtiExtensionFunctionInfo** |
拡張関数情報の配列を、関数ごとに1つずつ返す。
エージェントはjvmtiExtensionFunctionInfo*へのポインタを渡す。 戻ったとき、jvmtiExtensionFunctionInfo*は、サイズ*extension_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 jvmtiExtensionFunctionInfoのidフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiExtensionFunctionInfoのshort_descriptionフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiExtensionFunctionInfoのparamsフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiParamInfoのnameフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiExtensionFunctionInfoのerrorsフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
extension_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
extensionsがNULL。
|
拡張イベントの取得
拡張イベントのセットを返します。typedef struct { jint extension_event_index; char* id; char* short_description; jint param_count; jvmtiParamInfo* params; } jvmtiExtensionEventInfo;jvmtiError GetExtensionEvents(jvmtiEnv* env, jint* extension_count_ptr, jvmtiExtensionEventInfo** extensions)
OnLoadまたはライブ段階でしか呼び出せない
いいえ
125
1.0
権限
必要な機能
| フィールド | 型 | 説明 |
|---|---|---|
extension_event_index | jint | イベントを識別するインデックス |
id | char* |
拡張イベントの識別子。修正UTF-8文字列としてエンコードされる。 パッケージの命名規則を使用する。 たとえば、com.sun.hotspot.bar
|
short_description | char* | イベントを1文で説明。修正UTF-8文字列としてエンコードされる。 |
param_count | jint |
jvmtiEnv *jvmti_envを除くパラメータ数
|
params | jvmtiParamInfo * |
param_countパラメータの配列(jvmtiEnv *jvmti_envは除外)
|
| 名前 | 型 | 説明 |
|---|---|---|
extension_count_ptr | jint* |
戻ったとき、拡張イベントの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
extensions | jvmtiExtensionEventInfo** |
拡張イベント情報の配列を、イベントごとに1つずつ返す。
エージェントはjvmtiExtensionEventInfo*へのポインタを渡す。 戻ったとき、jvmtiExtensionEventInfo*は、サイズ*extension_count_ptrの新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 jvmtiExtensionEventInfoのidフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiExtensionEventInfoのshort_descriptionフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiExtensionEventInfoのparamsフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 jvmtiParamInfoのnameフィールドに返されるポインタは、新しく割り当てられた配列。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
extension_count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
extensionsがNULL。
|
拡張イベント
typedef void (JNICALL *jvmtiExtensionEvent)
(jvmtiEnv* jvmti_env,
...);
実装固有のイベントです。 イベント・ハンドラの設定には、SetExtensionEventCallbackを使用します。
拡張イベントのイベント・ハンドラは、この定義に一致するような宣言型の可変引数でなければなりません。 宣言型の可変引数でない場合、一部のプラットフォームで、呼出し規則の不一致や未定義の動作が発生する可能性があります。
たとえば、GetExtensionEventsから返されたjvmtiParamInfoに、jintパラメータの存在が示されている場合、イベント・ハンドラを次のように宣言する必要があります。
void JNICALL myHandler(jvmtiEnv* jvmti_env, ...)
最後の「...」は可変引数を表します。 myHandler内のjint引数は、Cプログラミング言語のva_*構文を使用して抽出する必要があります。
| 名前 | 型 | 説明 |
|---|---|---|
jvmti_env | jvmtiEnv * | JVM TI環境は、拡張イベントの唯一の固定パラメータ。 |
... | ... | 拡張イベント固有のパラメータ |
拡張イベント・コールバックの設定
jvmtiError
SetExtensionEventCallback(jvmtiEnv* env,
jint extension_event_index,
jvmtiExtensionEvent callback)
拡張イベントにコールバック関数を設定し、イベントを有効にします。 コールバックがNULLの場合、イベントを無効にします。 標準イベントとは異なり、コールバックを設定してイベントを有効にする処理は単一の操作です。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
126
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
extension_event_index | jint |
設定するコールバックを識別する。 このインデックスは、jvmtiExtensionEventInfoのextension_event_indexフィールド。
|
callback | jvmtiExtensionEvent |
callbackがNULL以外の場合、callbackをイベント・コールバック関数に設定し、イベントを有効にする。
callbackがNULLの場合、イベントを無効にする。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
extension_event_indexがGetExtensionEventsから返されたextension_event_indexでない。
|
権限
権限関数: 権限の型:-
jvmtiCapabilities- 権限の構造体
- 決して追加してはならない権限がある
-
すべての環境で、ある権限を
OnLoadまたはライブ段階で追加できる -
ある権限を
OnLoad段階でしか追加できない - ある権限を複数の環境で同時に所有することはできない
-
ある権限を複数の環境で同時に所有することはできない。また、
OnLoad段階でしか所有できない - その他。
- あるVMは、バイト・コードをネイティブ・コードにコンパイルすることによってすべてを実行し、ステップ実行命令を生成できなくなっている。 この実装では、権限は追加できない。
- 別のVMは、実行をステップ実行インタプリタにいつでも切り替えられる。 この実装では、権限を所有することでオーバーヘッドは生じず、権限はいつでも追加できる。
-
さらに別のVMは、バイトコード・コンパイル、シングル・ステップ実行可能な解釈実行エンジンのどちらかを起動時に選択できるが、両者間の切替えは行えない。 この実装では、
OnLoad段階(バイトコード実行の開始前)に権限を追加する必要があるほか、シングル・ステップ実行がまったく使用されなくても、権限が実行速度に大きな影響を与える。 -
さらに別のVMは、コンパイル済みバイト・コードまたは生成済みインタプリタに「is single stepping on」チェックを追加できる。 この実装でも、
OnLoad段階で権限を追加する必要があるが、オーバーヘッド(各命令のテストとブランチ)はかなり低くなる。
OnLoad段階で行うべきです。 ほとんどの仮想マシンでは、特定の権限には仮想マシンの特別な設定が必要であり、その設定は、仮想マシンの実行が開始される前にOnLoad段階で行う必要があります。 いったん追加された権限を削除できるのは、環境によって明示的に放棄された場合のみです。
エージェントは、このVMが潜在的に提供できる権限を特定し、使用する権限を追加し、不要になった権限を解放し、現在使用可能な権限を調べることができます。
権限の例
たとえば、OnLoad関数で新規に起動したエージェントで、使用可能なすべての権限を有効にする場合があります。 使用していない機能によってエージェントのパフォーマンスが低減する可能性があるため、一般にこの設定はお勧めしません。 次に、Cで記述したコード例を示します。
jvmtiCapabilities capa;
jvmtiError err;
err = (*jvmti)->GetPotentialCapabilities(jvmti, &capa);
if (err == JVMTI_ERROR_NONE) {
err = (*jvmti)->AddCapabilities(jvmti, &capa);
たとえば、エージェントで、メソッドのバイト・コードを取得できるかどうかチェックする場合(以前にこの権限を追加して、まだ放棄していないかどうかをチェックする場合)、Cで記述したコードは次のようになります。
jvmtiCapabilities capa;
jvmtiError err;
err = (*jvmti)->GetCapabilities(jvmti, &capa);
if (err == JVMTI_ERROR_NONE) {
if (capa.can_get_bytecodes) { ... } }
権限の構造体
このカテゴリに含まれる関数は、次の権限構造体を使用します。この構造体には、各権限に対応するブール型フラグが含まれています。typedef struct { unsigned int can_tag_objects : 1; unsigned int can_generate_field_modification_events : 1; unsigned int can_generate_field_access_events : 1; unsigned int can_get_bytecodes : 1; unsigned int can_get_synthetic_attribute : 1; unsigned int can_get_owned_monitor_info : 1; unsigned int can_get_current_contended_monitor : 1; unsigned int can_get_monitor_info : 1; unsigned int can_pop_frame : 1; unsigned int can_redefine_classes : 1; unsigned int can_signal_thread : 1; unsigned int can_get_source_file_name : 1; unsigned int can_get_line_numbers : 1; unsigned int can_get_source_debug_extension : 1; unsigned int can_access_local_variables : 1; unsigned int can_maintain_original_method_order : 1; unsigned int can_generate_single_step_events : 1; unsigned int can_generate_exception_events : 1; unsigned int can_generate_frame_pop_events : 1; unsigned int can_generate_breakpoint_events : 1; unsigned int can_suspend : 1; unsigned int can_redefine_any_class : 1; unsigned int can_get_current_thread_cpu_time : 1; unsigned int can_get_thread_cpu_time : 1; unsigned int can_generate_method_entry_events : 1; unsigned int can_generate_method_exit_events : 1; unsigned int can_generate_all_class_hook_events : 1; unsigned int can_generate_compiled_method_load_events : 1; unsigned int can_generate_monitor_events : 1; unsigned int can_generate_vm_object_alloc_events : 1; unsigned int can_generate_native_method_bind_events : 1; unsigned int can_generate_garbage_collection_events : 1; unsigned int can_generate_object_free_events : 1; unsigned int can_force_early_return : 1; unsigned int can_get_owned_monitor_stack_depth_info : 1; unsigned int can_get_constant_pool : 1; unsigned int can_set_native_method_prefix : 1; unsigned int can_retransform_classes : 1; unsigned int can_retransform_any_class : 1; unsigned int can_generate_resource_exhaustion_heap_events : 1; unsigned int can_generate_resource_exhaustion_threads_events : 1; unsigned int can_generate_early_vmstart : 1; unsigned int can_generate_early_class_hook_events : 1; unsigned int can_generate_sampled_object_alloc_events : 1; unsigned int can_support_virtual_threads : 1; unsigned int : 3; unsigned int : 16; unsigned int : 16; unsigned int : 16; unsigned int : 16; unsigned int : 16; } jvmtiCapabilities;
jvmtiCapabilities- 権限の構造体すべての型はunsigned int : 1フィールド 説明 導入されたバージョン can_tag_objectsヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。 1.0 can_generate_field_modification_eventsフィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch1.0 can_generate_field_access_eventsフィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch1.0 can_get_bytecodesメソッド GetBytecodesのバイト・コードを取得できる1.0 can_get_synthetic_attributeフィールドまたはメソッドが合成であるかどうかをテストできます - IsFieldSyntheticとIsMethodSynthetic1.0 can_get_owned_monitor_infoモニターの所有に関する情報を取得できる - GetOwnedMonitorInfo1.0 can_get_current_contended_monitorGetCurrentContendedMonitorが可能1.0 can_get_monitor_infoGetObjectMonitorUsageが可能1.0 can_pop_frameスタックからフレームをポップできる - PopFrame1.0 can_redefine_classesRedefineClassesでクラスを再定義できる。1.0 can_signal_threadスレッドに停止または割込み信号を送信できる 1.0 can_get_source_file_nameクラスのソース・ファイルの名前を取得できる 1.0 can_get_line_numbersメソッドの行番号テーブルを取得できる 1.0 can_get_source_debug_extensionクラスのソース・デバッグ拡張機能を取得できる。 1.0 can_access_local_variables局所変数を設定し、取得できる 1.0 can_maintain_original_method_orderクラス・ファイル内に出現する順序でメソッドを返すことができる 1.0 can_generate_single_step_eventsステップ実行イベントを取得できる 1.0 can_generate_exception_events例外スロー・イベントおよび例外キャッチ・イベントを取得できる 1.0 can_generate_frame_pop_eventsFramePopイベントを設定し、取得できる。1.0 can_generate_breakpoint_eventsBreakpointイベントを設定し、取得できる。1.0 can_suspendスレッドを中断し、再開できる。 1.0 can_redefine_any_classRedefineClassesは、変更可能なすべてのクラスでコールできます。IsModifiableClassを参照してください。(can_redefine_classesも設定する必要があります)1.0 can_get_current_thread_cpu_time現在のスレッドのCPU時間を「着く」できます 1.0 can_get_thread_cpu_timeスレッドCPU時間を「着く」できます 1.0 can_generate
_method_entry_eventsメソッドに入るときにメソッド・エントリ・イベントを生成できる 1.0 can_generate
_method_exit_eventsメソッドの終了時にメソッド終了イベントを生成できる。 1.0 can_generate
_all_class_hook_eventsロードされたすべてのクラスに対して、ClassFileLoadHookイベントを生成できる。 1.0 can_generate
_compiled_method_load_eventsメソッドのコンパイル時またはアンロード時にイベントを生成できる 1.0 can_generate
_monitor_eventsモニターの使用率に関するイベントを生成できる。 1.0 can_generate
_vm_object_alloc_eventsオブジェクトのVM割当てに関するイベントを生成できる。 1.0 can_generate
_native_method_bind_eventsネイティブ・メソッドが実装にバインドされているときイベントを生成できる。 1.0 can_generate
_garbage_collection_eventsガベージ・コレクションの開始または終了時にイベントを生成できる。 1.0 can_generate
_object_free_eventsガベージ・コレクタがオブジェクトを解放するときにイベントを生成できる。 1.0 can_force_early_return早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 1.1 can_get_owned_monitor_stack_depth_info所有されているモニターに関する情報とスタックの深さを取得できる - GetOwnedMonitorStackDepthInfo1.1 can_get_constant_poolあるクラスの定数プールを取得できる - GetConstantPool1.1 can_set_native_method_prefixネイティブ・メソッドを解決できない場合に適用すべき接頭辞を設定できる - SetNativeMethodPrefixおよびSetNativeMethodPrefixes1.1 can_retransform_classesRetransformClassesでクラスを再変換できる。 特定の実装によって適用されるこの権限の制限(「権限」セクションを参照)に加え、この権限は、この環境でClassFileLoadHookイベントがはじめて有効化される前に設定する必要がある。ClassFileLoadHookがはじめて有効化された時点でこの権限を所有している環境を「再変換可能」と呼ぶ。ClassFileLoadHookがはじめて有効化された時点でこの権限を所有していない環境を「再変換不可能」と呼ぶ。1.1 can_retransform_any_classRetransformClassesは、変更可能なすべてのクラスでコールできます。IsModifiableClassを参照してください。(can_retransform_classesも設定する必要があります)1.1 can_generate_resource_exhaustion_heap_eventsVMがJavaTMプラットフォーム・ヒープからメモリーを割り当てられない場合にイベントを生成できます。 ResourceExhaustedを参照してください。1.1 can_generate_resource_exhaustion_threads_eventsVMがスレッドを作成できない場合にイベントを生成できます。 ResourceExhaustedを参照してください。1.1 can_generate_early_vmstartVMStartイベントを早期に生成できます。VMStartを参照してください。9 can_generate_early_class_hook_eventsClassFileLoadHookイベントを初期フェーズで生成できます。 この機能およびcan_generate_all_class_hook_eventsが有効になっている場合は、初期フェーズでロードされたクラスに対してClassFileLoadHookイベントをポストできます。ClassFileLoadHookを参照してください。9 can_generate_sampled_object_alloc_eventsサンプリングされた配賦イベントを生成できます。 この機能が有効な場合は、ヒープ・サンプリング・メソッド SetHeapSamplingIntervalをコールでき、SampledObjectAllocイベントを生成できます。11 can_support_virtual_threads仮想スレッドをサポートできます。 この機能を有効にすると、次の関数を呼び出すことができます: SuspendAllVirtualThreads、ResumeAllVirtualThreadsおよび次のイベントを有効にできます:VirtualThreadStart、VirtualThreadEnd。21
潜在的な権限の取得
jvmtiError
GetPotentialCapabilities(jvmtiEnv* env,
jvmtiCapabilities* capabilities_ptr)
この時点でこの環境が所有できる可能性のあるJVM TI機能を、capabilities_ptr経由で返します。 返される権限が、VMに実装された完全な権限セットと異なる場合が2つあります。1つの環境しか所有できない権限を別の環境が所有している場合と、現在の段階がライブであり、OnLoad段階でしか追加できない権限が存在している場合です。 AddCapabilities関数を使えば、これらの権限のいずれかまたはすべてを設定できます。 現在所有されている権限が含まれます。
通常、この関数は、OnLoad関数で使用されます。 一部の仮想マシンでは、ライブ段階で追加できる権限のセットが制限されています。 この場合、潜在的に使用可能な権限のセットが、OnLoad段階のセットとは異なります。
権限の例を参照してください。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
140
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
capabilities_ptr | jvmtiCapabilities* |
戻ったとき、追加可能なJVM TIの権限をポイントする。
エージェントはjvmtiCapabilitiesへのポインタを渡す。 戻ったとき、jvmtiCapabilitiesが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
capabilities_ptrがNULL。
|
権限の追加
jvmtiError
AddCapabilities(jvmtiEnv* env,
const jvmtiCapabilities* capabilities_ptr)
*capabilities_ptr内で値が1に設定されている権限を追加することで、新しい権限を設定します。 以前の権限はすべて保持されます。 通常、この関数は、OnLoad関数で使用されます。 一部の仮想マシンでは、ライブ段階で追加できる権限のセットが制限されています。
権限の例を参照してください。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
142
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
capabilities_ptr | const jvmtiCapabilities* |
追加するJVM TI権限をポイントする。
エージェントはjvmtiCapabilitiesへのポインタを渡す。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_AVAILABLE | 必要な権限が潜在的に使用可能な権限でない。 |
JVMTI_ERROR_NULL_POINTER |
capabilities_ptrがNULL。
|
権限の放棄
jvmtiError
RelinquishCapabilities(jvmtiEnv* env,
const jvmtiCapabilities* capabilities_ptr)
*capabilities_ptr内で値が1に設定されている権限を放棄します。 実装によっては、単一の環境にしか権限の所有が許可されない場合があります(権限の概要を参照)。 この関数は、その他のエージェントが使用できるように、権限を解放します。 その他のすべての権限は保持されます。 権限は、GetCapabilitiesからは失われます。 エージェントが所有していない権限を放棄しようとしても、エラーは発生しません。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
143
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
capabilities_ptr | const jvmtiCapabilities* |
放棄するJVM TI権限をポイントする。
エージェントはjvmtiCapabilitiesへのポインタを渡す。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
capabilities_ptrがNULL。
|
権限の取得
jvmtiError
GetCapabilities(jvmtiEnv* env,
jvmtiCapabilities* capabilities_ptr)
capabilities_ptrを介して、この環境が現在所有している任意のJVM TI機能を返します。 所有している各権限は、権限構造体の対応するフィールドの1によって示されます。 環境は、AddCapabilitiesを使って追加に成功するまで、権限を所有しません。 環境は、RelinquishCapabilitiesを使って放棄しないかぎり、権限を失いません。 したがって、この関数は、AddCapabilities呼び出しとRelinquishCapabilities呼出しの最終結果を返します。
権限の例を参照してください。
どの段階でも呼び出せる
いいえ
89
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
capabilities_ptr | jvmtiCapabilities* |
戻ったとき、JVM TIの権限をポイントする。
エージェントはjvmtiCapabilitiesへのポインタを渡す。 戻ったとき、jvmtiCapabilitiesが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
capabilities_ptrがNULL。
|
タイマー
タイマー関数: タイマーの型:-
jvmtiTimerInfo- タイマー情報 -
jvmtiTimerKind- タイマーの種類
タイマー情報
各タイマーの情報関数は、このデータ構造体を返します。タイマーの種類は次のとおりです。typedef struct { jlong max_value; jboolean may_skip_forward; jboolean may_skip_backward; jvmtiTimerKind kind; jlong reserved1; jlong reserved2; } jvmtiTimerInfo;
jvmtiTimerInfo- タイマー情報フィールド 型 説明 max_valuejlongタイマーが到達できる最大値。 この値に到達すると、タイマーの値はゼロに戻る。 これは符号なしの値である。 jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。 may_skip_forwardjbooleantrueの場合、タイマーは外部で調整され、結果として前へスキップする。 falseの場合、タイマーの値が実際の時間より速く増加することはない。 may_skip_backwardjbooleantrueの場合、タイマーは外部で調整され、結果として後ろへスキップする。 falseの場合、タイマーの値は一定して増加する。 kindjvmtiTimerKindタイマーの種類。 ユーザー・タイムとシステム・タイムを区別しないプラットフォームでは、 JVMTI_TIMER_TOTAL_CPUが返される。reserved1jlong将来の使用のために予約済み。 reserved2jlong将来の使用のために予約済み。
タイマーの種類( jvmtiTimerKind)定数 値 説明 JVMTI_TIMER_USER_CPU30 スレッドがユーザー・モードであるCPU時間。 JVMTI_TIMER_TOTAL_CPU31 スレッドがユーザー・モードまたはシステム・モードであるCPU時間。 JVMTI_TIMER_ELAPSED32 経過時間。
現在のスレッドのCPUタイマー情報を取得
jvmtiError
GetCurrentThreadCpuTimerInfo(jvmtiEnv* env,
jvmtiTimerInfo* info_ptr)
GetCurrentThreadCpuTimeタイマーの情報を取得します。 jvmtiTimerInfo構造体のフィールドに、タイマーの詳細が入ります。 この情報は、プラットフォームとGetCurrentThreadCpuTimeの実装に固有なので、スレッドごとに変化したり、VMの呼出し中に変化することはありません。
GetCurrentThreadCpuTimeとGetThreadCpuTimeの実装は異なることがあり、そのためにGetCurrentThreadCpuTimerInfoとGetThreadCpuTimerInfoによって返される値が異なることがあります。詳細については、GetCurrentThreadCpuTimeを参照してください。
開始またはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
134
1.0
| 権限 | 効果 |
|---|---|
can_get_current_thread_cpu_time | 現在のスレッドCPU時間を取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
info_ptr | jvmtiTimerInfo* |
戻ったとき、GetCurrentThreadCpuTimeによって返される時間を説明する情報が入っている。
エージェントはjvmtiTimerInfoへのポインタを渡す。 戻ったとき、jvmtiTimerInfoが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_current_thread_cpu_timeを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_NULL_POINTER |
info_ptrがNULL。
|
現在のスレッドのCPU時間を取得
jvmtiError
GetCurrentThreadCpuTime(jvmtiEnv* env,
jlong* nanos_ptr)
現在のスレッドによって使用されているCPU時間を返します。
GetThreadCpuTime関数は、現在のスレッドを含むあらゆるスレッドのCPU時間を提供します。 GetCurrentThreadCpuTimeは、現在のスレッドまたは現在のスレッドよりも精密な情報を持つスレッド以外のスレッドのCPU時間を提供できないプラットフォームをサポートします(GetCurrentThreadCpuTimerInfoとGetThreadCpuTimerInfoを参照)。 現在のスレッドが仮想スレッドの場合、この関数をサポートするために実装は必要ありません。この場合、JVMTI_ERROR_UNSUPPORTED_OPERATIONが返されます。 多くのプラットフォームでは、この呼出しは次のコードと同等です。
GetThreadCpuTime(env, NULL, nanos_ptr)
開始またはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
135
1.0
| 権限 | 効果 |
|---|---|
can_get_current_thread_cpu_time |
現在のスレッドCPU時間を取得できる。
この権限がスレッドの開始後に有効になった場合、実装は、権限が有効になった時間以降の任意の時間を、CPU時間の収集を開始するポイントとして選択できる。
この権限は、can_get_thread_cpu_timeを潜在的に使用できるあらゆるプラットフォームで潜在的に使用可能。
|
| 名前 | 型 | 説明 |
|---|---|---|
nanos_ptr | jlong* |
戻ったとき、このスレッドによって使用されるCPU時間(ナノ秒単位)をポイントする。 これは符号なしの値である。 jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。
エージェントはjlongへのポインタを渡す。 戻ったとき、jlongが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_current_thread_cpu_timeを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_UNSUPPORTED_OPERATION | 現在のスレッドは仮想スレッドであり、現在のスレッドが仮想スレッドの場合、実装は現在のスレッドCPU時間の取得をサポートしていません。 |
JVMTI_ERROR_NULL_POINTER |
nanos_ptrがNULL。
|
スレッドのCPUタイマー情報を取得
jvmtiError
GetThreadCpuTimerInfo(jvmtiEnv* env,
jvmtiTimerInfo* info_ptr)
GetThreadCpuTimeタイマーの情報を取得します。 jvmtiTimerInfo構造体のフィールドに、タイマーの詳細が入ります。 この情報は、プラットフォームとGetThreadCpuTimeの実装に固有なので、スレッドごとに変化したり、VMの呼出し中に変化することはありません。
GetCurrentThreadCpuTimeとGetThreadCpuTimeの実装は異なることがあり、そのためにGetCurrentThreadCpuTimerInfoとGetThreadCpuTimerInfoによって返される値が異なることがあります。詳細については、GetCurrentThreadCpuTimeを参照してください。
ライブ段階でしか呼び出せない
いいえ
136
1.0
| 権限 | 効果 |
|---|---|
can_get_thread_cpu_time | スレッドCPU時間を取得できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
info_ptr | jvmtiTimerInfo* |
戻ったとき、GetThreadCpuTimeによって返される時間を説明する情報が入っている。
エージェントはjvmtiTimerInfoへのポインタを渡す。 戻ったとき、jvmtiTimerInfoが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_thread_cpu_timeを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_NULL_POINTER |
info_ptrがNULL。
|
スレッドのCPU時間を取得
jvmtiError
GetThreadCpuTime(jvmtiEnv* env,
jthread thread,
jlong* nanos_ptr)
指定のスレッドによって使用されているCPU時間を返します。
GetThreadCpuTimerInfoにより、このタイマーの情報を取得します。
ライブ段階でしか呼び出せない
いいえ
137
1.0
| 権限 | 効果 |
|---|---|
can_get_thread_cpu_time | スレッドCPU時間を取得できる。 この権限がスレッドの開始後に有効になった場合、実装は、権限が有効になった時間以降の任意の時間を、CPU時間の収集を開始するポイントとして選択できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
thread | jthread |
照会するスレッド。 指定されたスレッドが仮想スレッドの場合、この関数をサポートするために実装は必要ありません。その場合、JVMTI_ERROR_UNSUPPORTED_OPERATIONが返されます。 threadがNULLの場合、現在のスレッドが使用される。
|
nanos_ptr | jlong* |
戻ったとき、指定されたスレッドによって使用されるCPU時間(ナノ秒単位)をポイントする。 これは符号なしの値である。 jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。
エージェントはjlongへのポインタを渡す。 戻ったとき、jlongが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境は権限can_get_thread_cpu_timeを持たない。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_UNSUPPORTED_OPERATION |
threadは仮想スレッドで、実装は仮想スレッドのスレッドCPU時間の取得をサポートしていません。
|
JVMTI_ERROR_INVALID_THREAD |
threadはスレッド・オブジェクトではない。
|
JVMTI_ERROR_THREAD_NOT_ALIVE |
threadはアライブではない (未開始または終了済)。
|
JVMTI_ERROR_NULL_POINTER |
nanos_ptrがNULL。
|
タイマー情報の取得
jvmtiError
GetTimerInfo(jvmtiEnv* env,
jvmtiTimerInfo* info_ptr)
GetTimeタイマーの情報を取得します。 jvmtiTimerInfo構造体のフィールドに、タイマーの詳細が入ります。 この情報は、VMの呼出し中に変更されません。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
138
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
info_ptr | jvmtiTimerInfo* |
戻ったとき、GetTimeによって返される時間を説明する情報が入っている。
エージェントはjvmtiTimerInfoへのポインタを渡す。 戻ったとき、jvmtiTimerInfoが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
info_ptrがNULL。
|
時間の取得
jvmtiError
GetTime(jvmtiEnv* env,
jlong* nanos_ptr)
システム・タイマーの現在の値(ナノ秒単位)を返します。
返される値は、固定された任意の時間からのナノ秒を表します(固定された任意の時間が将来の時間である場合は負の値になる)。 この関数では、ナノ秒単位の精度が提供されますが、必ずしもナノ秒単位の精密度が得られるとはかぎりません。 値の変更頻度は保証されません。
GetTimerInfoにより、このタイマーの情報を取得します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
139
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
nanos_ptr | jlong* |
戻ったとき、ナノ秒単位で時間をポイントする。 これは符号なしの値である。 jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。
エージェントはjlongへのポインタを渡す。 戻ったとき、jlongが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
nanos_ptrがNULL。
|
使用可能なプロセッサの取得
jvmtiError
GetAvailableProcessors(jvmtiEnv* env,
jint* processor_count_ptr)
Java仮想マシンが使用できるプロセッサの数を返します。
この値は、仮想マシンの呼出し中に変更される可能性があります。 このため、使用可能なプロセッサの数に影響を受けるアプリケーションは、ときどきこのプロパティをポーリングする必要があります。
どの段階でも呼び出せる
いいえ
144
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
processor_count_ptr | jint* |
戻ったとき、仮想マシンが使用できる最大プロセッサ数をポイントする(必ず1以上)。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
processor_count_ptrがNULL。
|
クラス・ローダー検索
クラス・ローダー検索の関数: これらの関数を使えば、エージェントは、クラス・ローダーがクラスを検索する際の場所を追加できます。 これは、正しいクラス・ローダーでインストゥルメンテーションをインストールする際に便利です。ブートストラップ・クラス・ローダー検索の追加
jvmtiError
AddToBootstrapClassLoaderSearch(jvmtiEnv* env,
const char* segment)
この関数では、ブートストラップ・クラス・ローダーを使用してインストゥルメンテーション・クラスを定義できます。 Java™仮想マシン仕様のセクション5.3.1を参照してください。 ブートストラップ・クラス・ローダーによるクラスの検索が失敗すると、指定されたプラットフォーム依存の検索パスsegmentも検索されます。 segmentに指定できるセグメントは1つのみです。 この関数を複数回呼び出せば、複数のセグメントを追加できます。セグメントの検索は、この関数が呼び出された順番で行われます。
OnLoad段階でこの関数を使うと、ブートストラップ・クラス・ローダーがクラスの検索に失敗した際に、追加で検索する任意のプラットフォーム依存の検索パス・セグメントを指定できます。 このセグメントは通常、ディレクトリとJARファイルのいずれかになります。
ライブ段階でsegmentを使うと、任意のプラットフォーム依存のJARファイルへのパスを指定できます。 ブートストラップ・クラス・ローダーがインストゥルメンテーション目的で定義するクラスやリソース以外のものがJARファイルに含まれないように、エージェントで確認するようにしてください。
Java™仮想マシン仕様には、Java仮想マシンが以前にシンボリック参照を解決しようとして失敗した場合、その後このシンボリック参照を解決しようとしても、最初に解決しようとした結果としてスローされたエラーと同じエラーで必ず失敗すると記述されています。 したがって、Java仮想マシンが参照を解決できなかったクラスに対応するエントリがJARファイルに含まれる場合、その参照を解決しようとしても最初のエラーと同じエラーで失敗します。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
149
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
segment | const char* |
プラットフォーム依存の検索パス・セグメント、修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
segmentが無効なパス。 ライブ段階では、既存のJARファイル以外はすべて無効なパスとなる。
|
JVMTI_ERROR_NULL_POINTER |
segmentがNULL。
|
システム・クラス・ローダー検索の追加
jvmtiError
AddToSystemClassLoaderSearch(jvmtiEnv* env,
const char* segment)
この関数では、システム・クラス・ローダーを使用してインストゥルメンテーション・クラスを定義できます。 Java™仮想マシン仕様のセクション5.3.2を参照してください。 クラス・ローダーによるクラスの検索が失敗すると、指定されたプラットフォーム依存の検索パスsegmentも検索されます。 segmentに指定できるセグメントは1つのみです。 この関数を複数回呼び出せば、複数のセグメントを追加できます。セグメントの検索は、この関数が呼び出された順番で行われます。
OnLoad段階でこの関数を使うと、システム・クラス・ローダーがクラスの検索に失敗した際に、追加で検索する任意のプラットフォーム依存の検索パス・セグメントを指定できます。 このセグメントは通常、ディレクトリとJARファイルのいずれかになります。
ライブ段階では、segmentは、システム・クラス・ローダーがクラスの検索に失敗した際に、追加で検索するプラットフォーム依存のJARファイルへのパスになります。 システム・クラス・ローダーがインストゥルメンテーション目的で定義するクラスやリソース以外のものがJARファイルに含まれないように、エージェントで確認するようにしてください。
ライブ段階でシステム・クラス・ローダーが検索対象JARファイルの追加をサポートするのは、java.lang.String型の単一パラメータを取るappendToClassPathForInstrumentationという名前のメソッドをシステム・クラス・ローダーが実装している場合です。 このメソッドは、publicアクセスを備えていなくてもかまいません。
Java™仮想マシン仕様には、Java仮想マシンが以前にシンボリック参照を解決しようとして失敗した場合、その後このシンボリック参照を解決しようとしても、最初に解決しようとした結果としてスローされたエラーと同じエラーで必ず失敗すると記述されています。 したがって、Java仮想マシンが参照を解決できなかったクラスに対応するエントリがJARファイルに含まれる場合、その参照を解決しようとしても最初のエラーと同じエラーで失敗します。
OnLoadまたはライブ段階でしか呼び出せない
No
151
1.1
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
segment | const char* |
プラットフォーム依存の検索パス・セグメント、修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
segmentが無効なパス。 ライブ段階では、既存のJARファイル以外はすべて無効なパスとなる。
|
JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED | システム・クラス・ローダーがサポートしない操作。 |
JVMTI_ERROR_NULL_POINTER |
segmentがNULL。
|
システム・プロパティ
システム・プロパティ関数: これらの関数は、システム・プロパティを取得および設定します。システム・プロパティの取得
jvmtiError
GetSystemProperties(jvmtiEnv* env,
jint* count_ptr,
char*** property_ptr)
GetSystemPropertyで使用可能なVMシステム・プロパティ・キーのリストが返されます。 仮想マシンが次のプロパティ・キーを提供するようにすることを強くお勧めします。
-
java.vm.vendor -
java.vm.version -
java.vm.name -
java.vm.info -
java.library.path -
java.class.path
java.lang.System.getProperties内のプロパティ・セットとは異なります。 java.lang.System.getPropertiesのアクセスには、JNIメソッド呼出しを使用できます。
プロパティのセットは、実行中に増えることがあります。
OnLoadまたはライブ段階でしか呼び出せない
No
130
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
count_ptr | jint* |
戻ったとき、返されるプロパティ・キーの数をポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
property_ptr | char*** |
戻ったとき、プロパティ・キーの配列(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar**へのポインタを渡す。 char**は復帰時に、新しく割り当てられたサイズ*count_ptrの配列(各要素も新しく割り当てられる)をポイントしている。 この配列は、Deallocateを使って解放するべき。 各要素はDeallocateで解放すべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
count_ptrがNULL。
|
JVMTI_ERROR_NULL_POINTER |
property_ptrがNULL。
|
システム・プロパティの取得
jvmtiError
GetSystemProperty(jvmtiEnv* env,
const char* property,
char** value_ptr)
プロパティ・キーによって指定されたVMシステム・プロパティの値を返します。
関数GetSystemPropertiesは、使用可能なプロパティ・キーのセットを返します。 取得可能なプロパティは、実行中に増えることがあります。
これはシステム・プロパティのVMビューなので、プロパティの値は、java.lang.System.getProperty(String)によって返されるプロパティの値とは異なります。 通常のVMは、クラスの初期化中に、VMシステム・プロパティの値をjava.lang.Systemに格納されているPropertiesにコピーできます。 その後、SetSystemPropertyを使用してVMシステム・プロパティを変更したり、java.lang.System.setProperty(String,String)を使用してjava.lang.Systemシステム・プロパティを変更したりすると、値が変更されます。 java.lang.System.getProperty(String)のアクセスには、JNIメソッド呼出しを使用できます。
OnLoadまたはライブ段階でしか呼び出せない
No
131
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
property | const char* |
取得されるプロパティのキー。修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。 |
value_ptr | char** |
戻ったとき、プロパティの値(修正UTF-8文字列としてエンコードされる)をポイントする。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_AVAILABLE |
このプロパティを使用できない。 GetSystemPropertiesを使って、使用可能なプロパティを検索する。
|
JVMTI_ERROR_NULL_POINTER |
propertyがNULL。
|
JVMTI_ERROR_NULL_POINTER |
value_ptrがNULL。
|
システム・プロパティの設定
jvmtiError
SetSystemProperty(jvmtiEnv* env,
const char* property,
const char* value_ptr)
VMシステム・プロパティの値を設定します。
関数GetSystemPropertiesは、プロパティ・キーのセットを返します。そのうちのいくつかは設定可能です。 GetSystemPropertyを参照してください。
できるOnLoad段階でしか呼び出せない段階
No
132
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
property | const char* |
プロパティのキー。修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。 |
value_ptr | const char * |
設定するプロパティ値。修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。 value_ptrがNULLの場合は値が設定されないが、プロパティが書込み可能でない場合はJVMTI_ERROR_NOT_AVAILABLEが返される。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NOT_AVAILABLE | このプロパティを使用できない、またはこのプロパティは書込み可能でない。 |
JVMTI_ERROR_NULL_POINTER |
propertyがNULL。
|
全般
全般関数: 全般の型:-
jvmtiPhase- 実行の段階 -
jvmtiVerboseFlag- 冗長フラグの列挙 -
jvmtiJlocationFormat- JLocationの形式の列挙
段階の取得
VM実行の現在の段階を返します。 段階は次の順で進行します。typedef enum { JVMTI_PHASE_ONLOAD = 1, JVMTI_PHASE_PRIMORDIAL = 2, JVMTI_PHASE_START = 6, JVMTI_PHASE_LIVE = 4, JVMTI_PHASE_DEAD = 8 } jvmtiPhase;jvmtiError GetPhase(jvmtiEnv* env, jvmtiPhase* phase_ptr)
起動に失敗した場合、VMは中間の段階を省略して直接デッド段階に進みます。この場合、
実行の段階( jvmtiPhase)定数 値 説明 JVMTI_PHASE_ONLOAD1 OnLoad段階:Agent_OnLoad関数内(静的リンク・エージェントの場合はAgent_OnLoad_<agent-lib-name>関数内)の期間。JVMTI_PHASE_PRIMORDIAL2 初期段階: Agent_OnLoadまたはAgent_OnLoad_<agent-lib-name>から復帰してから、VMStartイベントが開始されるまでの間。JVMTI_PHASE_START6 開始段階: VMStartイベントが送信されてからVMInitイベントが送信されるまで。JVMTI_PHASE_LIVE4 ライブ段階: VMInitイベントが送信されてからVMDeathイベントが返されるまで。JVMTI_PHASE_DEAD8 デッド段階: VMDeathイベントが返されてから、または起動に失敗してから。
VMInitイベントもVMDeathイベントも送信されません。
ほとんどのJVM TI関数は、ライブ段階でしか動作しません。 次の関数は、OnLoad段階でもライブ段階でも動作します。
- CreateRawMonitor
- DestroyRawMonitor
- SetEventCallbacks
- SetEventNotificationMode
- GetExtensionFunctions
- GetExtensionEvents
- SetExtensionEventCallback
- GetPotentialCapabilities
- AddCapabilities
- RelinquishCapabilities
- AddToBootstrapClassLoaderSearch
- AddToSystemClassLoaderSearch
- GetSystemProperties
- GetSystemProperty
- SetHeapSamplingInterval
OnLoad段階でのみ動作します。
次の関数は、開始段階でもライブ段階でも動作します。
- GetCurrentThread
- SetThreadLocalStorage
- GetThreadLocalStorage
- GetTag
- SetTag
- GetClassSignature
- GetClassStatus
- GetSourceFileName
- GetClassModifiers
- GetClassMethods
- GetClassFields
- GetImplementedInterfaces
- GetClassVersionNumbers
- GetConstantPool
- IsInterface
- IsArrayClass
- IsModifiableClass
- GetClassLoader
- GetSourceDebugExtension
- GetObjectSize
- GetObjectHashCode
- GetFieldName
- GetFieldDeclaringClass
- GetFieldModifiers
- IsFieldSynthetic
- GetMethodName
- GetMethodDeclaringClass
- GetMethodModifiers
- GetMaxLocals
- GetArgumentsSize
- GetLineNumberTable
- GetMethodLocation
- GetBytecodes
- IsMethodNative
- IsMethodSynthetic
- IsMethodObsolete
- SetJNIFunctionTable
- GetJNIFunctionTable
- GetCurrentThreadCpuTimerInfo
- GetCurrentThreadCpuTime
- Allocate
- Deallocate
- SetNativeMethodPrefix
- SetNativeMethodPrefixes
- RawMonitorEnter
- RawMonitorExit
- RawMonitorWait
- RawMonitorNotify
- RawMonitorNotifyAll
- GetCapabilities
- GetTimerInfo
- GetTime
- GetAvailableProcessors
- GetPhase
- DisposeEnvironment
- SetEnvironmentLocalStorage
- GetEnvironmentLocalStorage
- GetVersionNumber
- GetErrorName
- SetVerboseFlag
- GetJLocationFormat
- ThreadStart
- ThreadEnd
- VirtualThreadStart
- VirtualThreadEnd
- ClassLoad
- ClassPrepare
- VMStart
- CompiledMethodLoad
- CompiledMethodUnload
どの段階でも呼び出せる
No
133
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
phase_ptr | jvmtiPhase* |
戻ったとき、段階をポイントする。
エージェントはjvmtiPhaseへのポインタを渡す。 戻ったとき、jvmtiPhaseが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
phase_ptrがNULL。
|
環境の破棄
JNIjvmtiError DisposeEnvironment(jvmtiEnv* env)
GetEnvで作成されたJVM TI接続をシャットダウンします(「JVM TI環境」を参照)。 環境が保持していたリソースをすべて破棄します。 この環境によって中断されたスレッドは、この呼出しによって再開されません。これはエージェントが明示的に行う必要があります。 この環境によってJVM TI関数呼出し経由で割り当てられたメモリーは、解放されません。これをエージェントから明示的に行うには、Deallocateを呼び出します。 この環境によって作成されたrawモニターは破棄されません。これをエージェントから明示的に行うには、DestroyRawMonitorを呼び出します。 この環境によって作成されたrawモニター上で待機しているスレッドの状態は、何の影響も受けません。
この環境のネイティブ・メソッド接頭辞はすべて設定解除されます。エージェントは、破棄を呼び出す前に接頭辞付きネイティブ・メソッドをすべて削除しなければなりません。
この環境で保持されている権限はすべて放棄されます。
この環境で有効化されたイベントは送信されなくなりますが、現在実行中のイベント・ハンドラは引き続き実行されます。 環境が破棄されたために実行中に無効になる可能性のあるイベント・ハンドラを設計する際には、十分に注意を払う必要があります。
この環境は、この呼出しのあとは使用できません。 この呼出しは呼出し元に戻ります。
どの段階でも呼び出せる
No
127
1.0
権限
必要な機能
パラメータ
なし
エラー
この関数は、汎用エラーを返します
環境ローカル記憶領域の設定
jvmtiError
SetEnvironmentLocalStorage(jvmtiEnv* env,
const void* data)
VMは、個々の環境に関連付けられているポインタ値を格納します。 このポインタ値を環境ローカルな記憶領域と呼びます。 この関数で設定されない場合、値はNULLになります。 エージェントは、環境固有の情報を格納するため、メモリーを割り当てることができます。 環境ローカルな記憶領域を設定することにより、GetEnvironmentLocalStorageを使ってアクセスできるようになります。
JVM TIの環境ローカルな記憶領域の値を設定するため、エージェントによって呼び出されます。 JVM TIは、エージェントに対して、環境ごとの情報を記録するために利用できる、ポインタ・サイズの環境ローカルな記憶領域を提供します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
148
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
data | const void * |
環境ローカルな記憶領域に入力する値。
エージェントがポインタを渡す。 dataがNULLの場合、値はNULLに設定される。
|
エラー
この関数は、汎用エラーを返します
環境ローカル記憶領域の取得
jvmtiError
GetEnvironmentLocalStorage(jvmtiEnv* env,
void** data_ptr)
JVM TIの環境ローカルな記憶領域の値を取得するため、エージェントによって呼び出されます。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、または
GarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
147
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
data_ptr | void** |
環境ローカルな記憶領域の値を返すポインタ。 環境ローカルな記憶領域がSetEnvironmentLocalStorageで設定されていない場合、返されるポインタはNULL。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
data_ptrがNULL。
|
バージョン番号の取得
jvmtiError
GetVersionNumber(jvmtiEnv* env,
jint* version_ptr)
JVM TIのバージョンがversion_ptrによって返されます。 戻り値はバージョン識別子です。 バージョン識別子には、インタフェースの型と、メジャー・バージョン番号、マイナー・バージョン番号、マイクロ・バージョン番号が含まれます。
バージョンのインタフェースの型 定数 値 説明 JVMTI_VERSION_INTERFACE_JNI0x00000000 JNIの JVMTI_VERSION_MASK_INTERFACE_TYPEの値。JVMTI_VERSION_INTERFACE_JVMTI0x30000000 JVM TIの JVMTI_VERSION_MASK_INTERFACE_TYPEの値。
バージョン・マスク 定数 値 説明 JVMTI_VERSION_MASK_INTERFACE_TYPE0x70000000 マスクにより、インタフェースの型を抽出する。 これはJVM TI関数なので、 JVMTI_VERSION_MASK_INTERFACE_TYPEでマスクされた、この関数によって返されるバージョンの値は、常にJVMTI_VERSION_INTERFACE_JVMTI。JVMTI_VERSION_MASK_MAJOR0x0FFF0000 マスクにより、メジャー・バージョン番号を抽出する。 JVMTI_VERSION_MASK_MINOR0x0000FF00 マスクにより、マイナー・バージョン番号を抽出する。 JVMTI_VERSION_MASK_MICRO0x000000FF マスクにより、マイクロ・バージョン番号を抽出する。
バージョン・シフト 定数 値 説明 JVMTI_VERSION_SHIFT_MAJOR16 シフトにより、メジャー・バージョン番号を抽出する。 JVMTI_VERSION_SHIFT_MINOR8 シフトにより、マイナー・バージョン番号を抽出する。 JVMTI_VERSION_SHIFT_MICRO0 シフトにより、マイクロ・バージョン番号を抽出する。
どの段階でも呼び出せる
No
88
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
version_ptr | jint* |
戻ったとき、JVM TIのバージョンをポイントする。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
version_ptrがNULL。
|
エラー名の取得
jvmtiError
GetErrorName(jvmtiEnv* env,
jvmtiError error,
char** name_ptr)
エラー・コードのシンボリック名を返します。
たとえば、GetErrorName(env, JVMTI_ERROR_NONE,&err_name)は、err_nameに文字列"JVMTI_ERROR_NONE"を返します。
どの段階でも呼び出せる
No
128
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
error | jvmtiError | エラー・コード。 |
name_ptr | char** |
戻ったとき、エラー名をポイントする。 名前は、修正UTF-8文字列としてエンコードされるが、ASCIIサブセットに制限される。
エージェントはchar*へのポインタを渡す。 戻り時に、char*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
errorがjvmtiErrorではない。
|
JVMTI_ERROR_NULL_POINTER |
name_ptrがNULL。
|
冗長フラグの設定
typedef enum { JVMTI_VERBOSE_OTHER = 0, JVMTI_VERBOSE_GC = 1, JVMTI_VERBOSE_CLASS = 2, JVMTI_VERBOSE_JNI = 4 } jvmtiVerboseFlag;jvmtiError SetVerboseFlag(jvmtiEnv* env, jvmtiVerboseFlag flag, jboolean value)
冗長出力を制御します。 これは、通常
冗長フラグの列挙( jvmtiVerboseFlag)定数 値 説明 JVMTI_VERBOSE_OTHER0 冗長出力(以下を除く)。 JVMTI_VERBOSE_GC1 冗長ガベージ・コレクタ出力( -verbose:gcで指定されたものと同様)。JVMTI_VERBOSE_CLASS2 冗長クラス・ロード出力( -verbose:classで指定されたものと同様)。JVMTI_VERBOSE_JNI4 冗長JNI出力( -verbose:jniで指定されたものと同様)。
stderrに送信される出力です。
どの段階でも呼び出せる
No
150
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
flag | jvmtiVerboseFlag | どの冗長フラグを設定するか。 |
value | jboolean | フラグの新しい値。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
flagはjvmtiVerboseFlagではない。
|
JLocation形式の取得
仮想マシンのバイト・コード・インデックスを参照する位置情報から最大の機能が得られますが、typedef enum { JVMTI_JLOCATION_JVMBCI = 1, JVMTI_JLOCATION_MACHINEPC = 2, JVMTI_JLOCATION_OTHER = 0 } jvmtiJlocationFormat;jvmtiError GetJLocationFormat(jvmtiEnv* env, jvmtiJlocationFormat* format_ptr)
jlocationの定義は、この情報を持たないVM実装を許可するため、意図的に制約を受けていません。
この関数は、このVMで使用されるjlocationの表現を説明します。 返される形式がJVMTI_JLOCATION_JVMBCIの場合、jlocationを、GetBytecodesから返される配列のインデックスとして使用できます。
JLocationの形式の列挙( jvmtiJlocationFormat)定数 値 説明 JVMTI_JLOCATION_JVMBCI1 jlocationの値は、仮想マシンのバイト・コード・インデックスを表す。つまり、メソッドの仮想マシン・コードのオフセット。JVMTI_JLOCATION_MACHINEPC2 jlocationの値は、ネイティブ・マシンのプログラム・カウンタ値を表す。JVMTI_JLOCATION_OTHER0 jlocationの値は、その他の表現を持つ。
どの段階でも呼び出せる
No
129
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
format_ptr | jvmtiJlocationFormat* |
戻ったとき、jlocation値の形式識別子をポイントする。
エージェントはjvmtiJlocationFormatへのポインタを渡す。 戻ったとき、jvmtiJlocationFormatが設定されている。 |
| エラー | 説明 |
|---|---|
JVMTI_ERROR_NULL_POINTER |
format_ptrがNULL。
|
ヒープ・モニタリング
ヒープ・モニタリング関数:ヒープ・サンプリング間隔の設定
jvmtiError
SetHeapSamplingInterval(jvmtiEnv* env,
jint sampling_interval)
オブジェクトが割り当てられたときにSampledObjectAllocイベントを生成します。 各スレッドは、割り当てられたバイトのカウンタを保持します。 このイベントは、最後のサンプル以降にそのカウンタがsampling_intervalの平均を超える場合にのみ生成されます。
sampling_intervalを0に設定すると、新しい間隔が考慮されたときに、システムでサポートされている各割当てによってイベントが生成されます。
新しいサンプリング間隔の更新には、様々な数の割当てを行い、内部データ構造の更新を呼び出します。 そのため、サンプリング間隔を平均とみなすことが重要です。 これには間隔0が含まれ、各割当てに対してイベントがすぐに生成されない可能性があります。
OnLoadまたはライブ段階でしか呼び出せない
No
156
11
| 権限 | 効果 |
|---|---|
can_generate_sampled_object_alloc_events |
サンプリングされた配賦イベントを生成できます。 この機能が有効な場合は、ヒープ・サンプリング・メソッドSetHeapSamplingIntervalをコールでき、SampledObjectAllocイベントを生成できます。
|
| 名前 | 型 | 説明 |
|---|---|---|
sampling_interval | jint |
サンプリング間隔(バイト)。 Samplerは統計アプローチを使用して、特定のスレッドによって割り当てられた各sampling_intervalバイトに対して1回、平均イベントを生成します。
新しいサンプリング間隔が考慮されると、サンプリング間隔として0では、割当てごとにサンプルが生成されます。
ノート: この機能のオーバーヘッドは、サンプリング間隔と直接相関しています。 1024バイトなどの高いサンプリング間隔では、高いオーバーヘッドが発生します。 1024 Kbなどの間隔が短いと、オーバーヘッドは大幅に減少します。 サンプリングは、パフォーマンスに影響を与える可能性があることを理解したうえでのみ使用してください。
|
| エラー | 説明 |
|---|---|
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
環境に権限can_generate_sampled_object_alloc_eventsがありません。 AddCapabilitiesを使用する。
|
JVMTI_ERROR_ILLEGAL_ARGUMENT |
sampling_intervalがゼロ未満です。
|
エラー
JVM TI関数はすべて、jvmtiErrorエラー・コードを返します。
エージェントは、有効なパラメータを持つJVM TI関数を、適切なコンテキスト(たとえば、呼出し側スレッドが接続されていて、段階が適切)で呼び出します。 実装によって、一部のエラー条件の検出が困難であったり、非効率的であったり、不可能であったりします。 実装は、「関数固有の必須エラー」に一覧されているエラーを検出する必要があります。 その他のエラーは、エラー条件に対する推奨されている応答を表します。
汎用エラー
次のエラーは、どの関数からも返される可能性があるエラーです。-
JVMTI_ERROR_NONE (0) - エラーは発生しなかった。 関数の実行が正常に終了したときに返されるエラー・コード。
-
JVMTI_ERROR_NULL_POINTER (100) -
ポインタが
NULL。 -
JVMTI_ERROR_OUT_OF_MEMORY (110) - 関数でメモリーの割当てが試行されたが、これ以上割り当てられるメモリーがなかった。
-
JVMTI_ERROR_ACCESS_DENIED (111) - この仮想マシンでは必要な機能が有効になっていない。
-
JVMTI_ERROR_UNATTACHED_THREAD (115) -
この関数の呼出しに使われているスレッドが、仮想マシンに接続されていない。 呼出しは、接続されたスレッドから行う必要がある。 JNI呼び出しAPIの
AttachCurrentThreadを参照。 -
JVMTI_ERROR_INVALID_ENVIRONMENT (116) - 指定されたJVM TI環境はもう接続されていない、または環境ではない。
-
JVMTI_ERROR_WRONG_PHASE (112) - 現在の段階では、必要な機能を使用できない。 仮想マシンが実行を完了している場合、常に返される。
-
JVMTI_ERROR_INTERNAL (113) - 予期しない内部エラーが発生した。
関数固有の必須エラー
一部のJVM TI関数は、次のエラーを返します。これらのエラーは、条件が満たされたとき、実装によって返される必要があります。-
JVMTI_ERROR_INVALID_PRIORITY (12) - 無効な優先順位。
-
JVMTI_ERROR_THREAD_NOT_SUSPENDED (13) - スレッドは中断されていない。
-
JVMTI_ERROR_THREAD_SUSPENDED (14) - スレッドはすでに中断されている。
-
JVMTI_ERROR_THREAD_NOT_ALIVE (15) - この演算では、スレッドが有効である必要があります。つまり、スレッドを開始してまだ終了していない必要があります。
-
JVMTI_ERROR_CLASS_NOT_PREPARED (22) - クラスがロードされているが、まだ準備されていない。
-
JVMTI_ERROR_NO_MORE_FRAMES (31) - 指定された深さに、Javaプログラミング言語またはJNIスタック・フレームが存在しない。
-
JVMTI_ERROR_OPAQUE_FRAME (32) - フレームに関する情報が (例:ネイティブ・フレームの場合)を使用できないか、スレッドの現在のフレームで関数を実行できません。
-
JVMTI_ERROR_DUPLICATE (40) - すでに設定された項目。
-
JVMTI_ERROR_NOT_FOUND (41) - 目的の要素(フィールドやブレークポイントなど)が見つからない。
-
JVMTI_ERROR_NOT_MONITOR_OWNER (51) - このスレッドはrawモニターを所有していない。
-
JVMTI_ERROR_INTERRUPT (52) - 呼出しの完了前に割り込まれた。
-
JVMTI_ERROR_UNMODIFIABLE_CLASS (79) - クラスは変更できない。
-
JVMTI_ERROR_UNMODIFIABLE_MODULE (80) - モジュールを変更できません。
-
JVMTI_ERROR_NOT_AVAILABLE (98) - この機能はこの仮想マシンでは使用できない。
-
JVMTI_ERROR_ABSENT_INFORMATION (101) - 要求された情報が入手できない。
-
JVMTI_ERROR_INVALID_EVENT_TYPE (102) - 指定されたイベント・タイプのIDが認識されない。
-
JVMTI_ERROR_NATIVE_METHOD (104) - 要求された情報がネイティブ・メソッドで使用できない。
-
JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED (106) - クラス・ローダーがこの操作をサポートしない。
関数固有のエージェント・エラー
次のエラーは、一部のJVM TI関数から返される可能性があるエラーです。 これらのエラーは、エージェントによって無効なパラメータが渡された場合や、無効なコンテキストで使用された場合に返されます。 これらのエラーは、実装なしで検出できます。-
JVMTI_ERROR_INVALID_THREAD (10) - 渡されたスレッドは有効なスレッドではない。
-
JVMTI_ERROR_INVALID_FIELDID (25) - 無効なフィールド。
-
JVMTI_ERROR_INVALID_MODULE (26) - モジュールが無効です。
-
JVMTI_ERROR_INVALID_METHODID (23) - 無効なメソッド。
-
JVMTI_ERROR_INVALID_LOCATION (24) - 無効な位置。
-
JVMTI_ERROR_INVALID_OBJECT (20) - 無効なオブジェクト。
-
JVMTI_ERROR_INVALID_CLASS (21) - 無効なクラス。
-
JVMTI_ERROR_TYPE_MISMATCH (34) - 使用した関数と変数の型が合わない。
-
JVMTI_ERROR_INVALID_SLOT (35) - 無効なスロット。
-
JVMTI_ERROR_MUST_POSSESS_CAPABILITY (99) - この環境で使用される権限がfalse。
-
JVMTI_ERROR_INVALID_THREAD_GROUP (11) - スレッド・グループが無効。
-
JVMTI_ERROR_INVALID_MONITOR (50) - 無効なrawモニター。
-
JVMTI_ERROR_ILLEGAL_ARGUMENT (103) - 不正な引数。
-
JVMTI_ERROR_INVALID_TYPESTATE (65) - スレッドの状態が変更されたため、不整合が生じている。
-
JVMTI_ERROR_UNSUPPORTED_VERSION (68) - 新しいクラス・ファイルのバージョンがこのVMでサポートされていない。
-
JVMTI_ERROR_INVALID_CLASS_FORMAT (60) -
新しいクラス・ファイルの形式が正しくない(VMは
ClassFormatErrorを返す)。 -
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION (61) -
新しいクラス・ファイルの定義が循環定義になる(VMは
ClassCircularityErrorを返す)。 -
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED (63) - 新しいクラス・ファイルでメソッドの追加が必要。
-
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED (64) - 新しいクラスのバージョンによってフィールドが変更される。
-
JVMTI_ERROR_FAILS_VERIFICATION (62) - クラス・バイトが検証に失敗する。
-
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED (66) - 新しいクラスのバージョンの直接スーパー・クラスが異なる、または直接実装されているインタフェースが異なる。
-
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED (67) - 新しいクラスのバージョンでは旧クラスのバージョンで宣言したメソッドを宣言しない。
-
JVMTI_ERROR_NAMES_DONT_MATCH (69) - 新しいクラス・ファイル内で定義されたクラス名が、旧クラス・オブジェクト内の名前と異なる。
-
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED (70) - 新しいクラスのバージョンの修飾子が異なる。
-
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED (71) - 新しいクラスのバージョンのメソッドの修飾子が旧クラスのバージョンの修飾子と異なる。
-
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGED (72) - 新しいクラス・バージョンに、クラス属性でサポートされていない相違があります。
-
JVMTI_ERROR_UNSUPPORTED_OPERATION (73) - この実装では機能はサポートされていません。
データ型
JVM TIは、JNIによって定義されたデータ型を拡張します。| 型 | 説明 |
|---|---|
jboolean | |
jchar | |
jint | |
jlong | |
jfloat | |
jdouble | |
jobject | |
jclass | |
jvalue | |
jfieldID | |
jmethodID | |
JNIEnv |
| 型 | 説明 |
|---|---|
jvmtiEnv | |
jthread |
スレッドを保持する
jobjectのサブタイプ。
typedef jobject jthread; |
jthreadGroup |
スレッド・グループを保持する
jobjectのサブタイプ。
typedef jobject jthreadGroup; |
jlocation |
メソッド内の単調に増加する実行可能位置を表す64ビット値。
-1はネイティブ・メソッドを示す。 ある特定のVMでの形式については、GetJLocationFormatを参照。
typedef jlong jlocation; |
jrawMonitorID |
struct _jrawMonitorID; typedef struct _jrawMonitorID *jrawMonitorID; |
jvmtiError |
戻りエラー・コードを保持する。 可能な値については、「エラー」を参照。
|
jvmtiEvent |
イベント・タイプの識別子。 可能な値については、「イベント」を参照。 この仕様の将来のバージョンでは、イベント・タイプ識別子としてゼロが割り当てられないことが保証される。
|
jvmtiEventCallbacks |
イベント用コールバック。
完全な構造については「イベント・コールバック」を参照。
たとえば、VM初期化コールバックは次のように定義される。
コールバック関数の定義については個々のイベントを参照。
|
jniNativeInterface |
JNI仕様で定義されたJNI関数テーブル
JNINativeInterfaceの型識別子。 JNI参照実装では、下線付きで定義される。
typedef struct JNINativeInterface_ jniNativeInterface; |
| 型 | 説明 |
|---|---|
jvmtiAddrLocationMap | 位置エントリのネイティブ・アドレス |
jvmtiCapabilities | 権限の構造体 |
jvmtiClassDefinition | クラスの再定義の説明 |
jvmtiExtensionEventInfo | 拡張イベント情報 |
jvmtiExtensionFunctionInfo | 拡張関数情報 |
jvmtiFrameInfo | スタック・フレーム情報構造体 |
jvmtiHeapCallbacks | ヒープ・コールバック関数構造体 |
jvmtiHeapReferenceInfo | 参照情報構造体 |
jvmtiHeapReferenceInfoArray | 配列参照用の参照情報構造体 |
jvmtiHeapReferenceInfoConstantPool | 定数プール参照用の参照情報構造体 |
jvmtiHeapReferenceInfoField | フィールド参照用の参照情報構造体 |
jvmtiHeapReferenceInfoJniLocal | JNIローカル参照用の参照情報構造体 |
jvmtiHeapReferenceInfoReserved | その他の参照用の参照情報構造体 |
jvmtiHeapReferenceInfoStackLocal | 局所変数参照用の参照情報構造体 |
jvmtiLineNumberEntry | 行番号テーブルのエントリ |
jvmtiLocalVariableEntry | 局所変数テーブルのエントリ |
jvmtiMonitorStackDepthInfo | モニター・スタック深さ情報構造体 |
jvmtiMonitorUsage | オブジェクト・モニターの使用情報 |
jvmtiParamInfo | 拡張関数/イベント・パラメータ情報 |
jvmtiStackInfo | スタック情報構造体 |
jvmtiThreadGroupInfo | スレッド・グループ情報構造体 |
jvmtiThreadInfo | スレッド情報構造体 |
jvmtiTimerInfo | タイマー情報 |
| 型 | 説明 |
|---|---|
jvmtiArrayPrimitiveValueCallback | 配列プリミティブ値コールバック |
jvmtiExtensionEvent | 拡張イベント |
jvmtiExtensionFunction | 拡張関数 |
jvmtiHeapIterationCallback | ヒープ反復コールバック |
jvmtiHeapObjectCallback | ヒープ・オブジェクトのコールバック |
jvmtiHeapReferenceCallback | ヒープ参照コールバック |
jvmtiHeapRootCallback | ヒープ・ルート・オブジェクトのコールバック |
jvmtiObjectReferenceCallback | オブジェクト参照のコールバック |
jvmtiPrimitiveFieldCallback | プリミティブ・フィールド・コールバック |
jvmtiReservedCallback | 将来使用するために予約されたコールバック |
jvmtiStackReferenceCallback | スタック参照オブジェクトのコールバック |
jvmtiStartFunction | エージェント起動関数 |
jvmtiStringPrimitiveValueCallback | 文字列プリミティブ値コールバック |
| 型 | 説明 |
|---|---|
jvmtiEventMode | イベントの有効化と無効化 |
jvmtiHeapObjectFilter | ヒープ・オブジェクトのフィルタの列挙 |
jvmtiHeapReferenceKind | ヒープ参照の列挙 |
jvmtiHeapRootKind | ヒープ・ルートの種類の列挙 |
jvmtiIterationControl | 反復制御の列挙 |
jvmtiJlocationFormat | JLocationの形式の列挙 |
jvmtiObjectReferenceKind | オブジェクト参照の列挙 |
jvmtiParamKind | 拡張関数/イベント・パラメータの種類 |
jvmtiParamTypes | 拡張関数/イベント・パラメータの型 |
jvmtiPhase | 実行の段階 |
jvmtiPrimitiveType | プリミティブ型の列挙 |
jvmtiTimerKind | タイマーの種類 |
jvmtiVerboseFlag | 冗長フラグの列挙 |
| 位置 | 機能 | 宣言 |
|---|---|---|
| 1 | 予約済み |
void *reserved1; |
| 2 | イベント通知モードの設定 |
jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env,
jvmtiEventMode mode,
jvmtiEvent event_type,
jthread event_thread,
...);
|
| 3 | すべてのモジュールを取得 |
jvmtiError (JNICALL *GetAllModules) (jvmtiEnv* env,
jint* module_count_ptr,
jobject** modules_ptr);
|
| 4 | すべてのスレッドの取得 |
jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env,
jint* threads_count_ptr,
jthread** threads_ptr);
|
| 5 | スレッドの中断 |
jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env,
jthread thread);
|
| 6 | スレッドの再開 |
jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env,
jthread thread);
|
| 7 | スレッドの停止 |
jvmtiError (JNICALL *StopThread) (jvmtiEnv* env,
jthread thread,
jobject exception);
|
| 8 | スレッドの割り込み |
jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env,
jthread thread);
|
| 9 | スレッド情報の取得 |
jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env,
jthread thread,
jvmtiThreadInfo* info_ptr);
|
| 10 | 所有モニター情報の取得 |
jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env,
jthread thread,
jint* owned_monitor_count_ptr,
jobject** owned_monitors_ptr);
|
| 11 | 現在競合しているモニターの取得 |
jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env,
jthread thread,
jobject* monitor_ptr);
|
| 12 | エージェント・スレッドの実行 |
jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env,
jthread thread,
jvmtiStartFunction proc,
const void* arg,
jint priority);
|
| 13 | トップ・レベルのスレッド・グループの取得 |
jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env,
jint* group_count_ptr,
jthreadGroup** groups_ptr);
|
| 14 | スレッド・グループ情報の取得 |
jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env,
jthreadGroup group,
jvmtiThreadGroupInfo* info_ptr);
|
| 15 | 子スレッド・グループの取得 |
jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env,
jthreadGroup group,
jint* thread_count_ptr,
jthread** threads_ptr,
jint* group_count_ptr,
jthreadGroup** groups_ptr);
|
| 16 | フレーム・カウントの取得 |
jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env,
jthread thread,
jint* count_ptr);
|
| 17 | スレッド状態の取得 |
jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env,
jthread thread,
jint* thread_state_ptr);
|
| 18 | 現在のスレッドの取得 |
jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env,
jthread* thread_ptr);
|
| 19 | フレームの位置の取得 |
jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env,
jthread thread,
jint depth,
jmethodID* method_ptr,
jlocation* location_ptr);
|
| 20 | フレームのポップの通知 |
jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env,
jthread thread,
jint depth);
|
| 21 | 局所変数の取得 - オブジェクト型 |
jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jobject* value_ptr);
|
| 22 | 局所変数の取得 - 整数型 |
jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jint* value_ptr);
|
| 23 | 局所変数の取得 - 長整数型 |
jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jlong* value_ptr);
|
| 24 | 局所変数の取得 - 浮動小数点数型 |
jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jfloat* value_ptr);
|
| 25 | 局所変数の取得 - 倍精度浮動小数点数型 |
jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jdouble* value_ptr);
|
| 26 | 局所変数の設定 - オブジェクト型 |
jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jobject value);
|
| 27 | 局所変数の設定 - 整数型 |
jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jint value);
|
| 28 | 局所変数の設定 - 長整数型 |
jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jlong value);
|
| 29 | 局所変数の設定 - 浮動小数点数型 |
jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jfloat value);
|
| 30 | 局所変数の設定 - 倍精度浮動小数点数型 |
jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env,
jthread thread,
jint depth,
jint slot,
jdouble value);
|
| 31 | rawモニターの作成 |
jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env,
const char* name,
jrawMonitorID* monitor_ptr);
|
| 32 | rawモニターの破棄 |
jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env,
jrawMonitorID monitor);
|
| 33 | rawモニターの開始 |
jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env,
jrawMonitorID monitor);
|
| 34 | rawモニターの終了 |
jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env,
jrawMonitorID monitor);
|
| 35 | rawモニターの待機 |
jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env,
jrawMonitorID monitor,
jlong millis);
|
| 36 | rawモニターの通知 |
jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env,
jrawMonitorID monitor);
|
| 37 | rawモニターの通知(すべて) |
jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env,
jrawMonitorID monitor);
|
| 38 | ブレークポイントの設定 |
jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env,
jmethodID method,
jlocation location);
|
| 39 | ブレークポイントのクリア |
jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env,
jmethodID method,
jlocation location);
|
| 40 | 名前付きモジュールを取得 |
jvmtiError (JNICALL *GetNamedModule) (jvmtiEnv* env,
jobject class_loader,
const char* package_name,
jobject* module_ptr);
|
| 41 | フィールド・アクセスの監視の設定 |
jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env,
jclass klass,
jfieldID field);
|
| 42 | フィールド・アクセスの監視のクリア |
jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env,
jclass klass,
jfieldID field);
|
| 43 | フィールド変更の監視の設定 |
jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env,
jclass klass,
jfieldID field);
|
| 44 | フィールド変更の監視のクリア |
jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env,
jclass klass,
jfieldID field);
|
| 45 | 変更可能クラスかどうかの検査 |
jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env,
jclass klass,
jboolean* is_modifiable_class_ptr);
|
| 46 | Allocate |
jvmtiError (JNICALL *Allocate) (jvmtiEnv* env,
jlong size,
unsigned char** mem_ptr);
|
| 47 | Deallocate |
jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env,
unsigned char* mem);
|
| 48 | クラスのシグニチャの取得 |
jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env,
jclass klass,
char** signature_ptr,
char** generic_ptr);
|
| 49 | クラスのステータスの取得 |
jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env,
jclass klass,
jint* status_ptr);
|
| 50 | ソース・ファイル名の取得 |
jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env,
jclass klass,
char** source_name_ptr);
|
| 51 | クラスの修飾子の取得 |
jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env,
jclass klass,
jint* modifiers_ptr);
|
| 52 | クラスのメソッドの取得 |
jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env,
jclass klass,
jint* method_count_ptr,
jmethodID** methods_ptr);
|
| 53 | クラスのフィールドの取得 |
jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env,
jclass klass,
jint* field_count_ptr,
jfieldID** fields_ptr);
|
| 54 | 実装されたインタフェースの取得 |
jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env,
jclass klass,
jint* interface_count_ptr,
jclass** interfaces_ptr);
|
| 55 | インタフェースかどうかの検査 |
jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env,
jclass klass,
jboolean* is_interface_ptr);
|
| 56 | 配列クラスかどうかの検査 |
jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env,
jclass klass,
jboolean* is_array_class_ptr);
|
| 57 | クラス・ローダーの取得 |
jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env,
jclass klass,
jobject* classloader_ptr);
|
| 58 | オブジェクトのハッシュ・コードの取得 |
jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env,
jobject object,
jint* hash_code_ptr);
|
| 59 | オブジェクトのモニターの利用情報を取得 |
jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env,
jobject object,
jvmtiMonitorUsage* info_ptr);
|
| 60 | フィールドの名前とシグニチャの取得 |
jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env,
jclass klass,
jfieldID field,
char** name_ptr,
char** signature_ptr,
char** generic_ptr);
|
| 61 | フィールドの宣言クラスの取得 |
jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env,
jclass klass,
jfieldID field,
jclass* declaring_class_ptr);
|
| 62 | フィールドの修飾子の取得 |
jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env,
jclass klass,
jfieldID field,
jint* modifiers_ptr);
|
| 63 | 合成フィールドかどうかの検査 |
jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env,
jclass klass,
jfieldID field,
jboolean* is_synthetic_ptr);
|
| 64 | メソッドの名前とシグニチャの取得 |
jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env,
jmethodID method,
char** name_ptr,
char** signature_ptr,
char** generic_ptr);
|
| 65 | メソッドの宣言クラスの取得 |
jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env,
jmethodID method,
jclass* declaring_class_ptr);
|
| 66 | メソッドの修飾子の取得 |
jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env,
jmethodID method,
jint* modifiers_ptr);
|
| 67 | 予約済み |
void *reserved67; |
| 68 | 局所変数の取得 |
jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env,
jmethodID method,
jint* max_ptr);
|
| 69 | 引数のサイズの取得 |
jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env,
jmethodID method,
jint* size_ptr);
|
| 70 | 行番号テーブルの取得 |
jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env,
jmethodID method,
jint* entry_count_ptr,
jvmtiLineNumberEntry** table_ptr);
|
| 71 | メソッドの配置位置の取得 |
jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env,
jmethodID method,
jlocation* start_location_ptr,
jlocation* end_location_ptr);
|
| 72 | 局所変数テーブルの取得 |
jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env,
jmethodID method,
jint* entry_count_ptr,
jvmtiLocalVariableEntry** table_ptr);
|
| 73 | ネイティブ・メソッド接頭辞の設定 |
jvmtiError (JNICALL *SetNativeMethodPrefix) (jvmtiEnv* env,
const char* prefix);
|
| 74 | 複数のネイティブ・メソッド接頭辞の設定 |
jvmtiError (JNICALL *SetNativeMethodPrefixes) (jvmtiEnv* env,
jint prefix_count,
char** prefixes);
|
| 75 | バイト・コードの取得 |
jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env,
jmethodID method,
jint* bytecode_count_ptr,
unsigned char** bytecodes_ptr);
|
| 76 | ネイティブ・メソッドかどうかの検査 |
jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env,
jmethodID method,
jboolean* is_native_ptr);
|
| 77 | 合成メソッドかどうかの検査 |
jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env,
jmethodID method,
jboolean* is_synthetic_ptr);
|
| 78 | ロード済みクラスの取得 |
jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env,
jint* class_count_ptr,
jclass** classes_ptr);
|
| 79 | クラス・ローダー・クラスの取得 |
jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env,
jobject initiating_loader,
jint* class_count_ptr,
jclass** classes_ptr);
|
| 80 | フレームのポップ |
jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env,
jthread thread);
|
| 81 | 早期復帰の強制 - オブジェクト型 |
jvmtiError (JNICALL *ForceEarlyReturnObject) (jvmtiEnv* env,
jthread thread,
jobject value);
|
| 82 | 早期復帰の強制 - 整数型 |
jvmtiError (JNICALL *ForceEarlyReturnInt) (jvmtiEnv* env,
jthread thread,
jint value);
|
| 83 | 早期復帰の強制 - 長整数型 |
jvmtiError (JNICALL *ForceEarlyReturnLong) (jvmtiEnv* env,
jthread thread,
jlong value);
|
| 84 | 早期復帰の強制 - 浮動小数点数型 |
jvmtiError (JNICALL *ForceEarlyReturnFloat) (jvmtiEnv* env,
jthread thread,
jfloat value);
|
| 85 | 早期復帰の強制 - 倍精度浮動小数点数型 |
jvmtiError (JNICALL *ForceEarlyReturnDouble) (jvmtiEnv* env,
jthread thread,
jdouble value);
|
| 86 | 早期復帰の強制 - void型 |
jvmtiError (JNICALL *ForceEarlyReturnVoid) (jvmtiEnv* env,
jthread thread);
|
| 87 | クラスの再定義 |
jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env,
jint class_count,
const jvmtiClassDefinition* class_definitions);
|
| 88 | バージョン番号の取得 |
jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env,
jint* version_ptr);
|
| 89 | 権限の取得 |
jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env,
jvmtiCapabilities* capabilities_ptr);
|
| 90 | ソース・デバッグ拡張機能の取得 |
jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env,
jclass klass,
char** source_debug_extension_ptr);
|
| 91 | 廃棄されたメソッドかどうかの検査 |
jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env,
jmethodID method,
jboolean* is_obsolete_ptr);
|
| 92 | スレッド・リストの中断 |
jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env,
jint request_count,
const jthread* request_list,
jvmtiError* results);
|
| 93 | スレッド・リストの再開 |
jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env,
jint request_count,
const jthread* request_list,
jvmtiError* results);
|
| 94 | モジュールの読み込みを追加 |
jvmtiError (JNICALL *AddModuleReads) (jvmtiEnv* env,
jobject module,
jobject to_module);
|
| 95 | モジュールのエクスポートを追加 |
jvmtiError (JNICALL *AddModuleExports) (jvmtiEnv* env,
jobject module,
const char* pkg_name,
jobject to_module);
|
| 96 | モジュールのオープンの追加 |
jvmtiError (JNICALL *AddModuleOpens) (jvmtiEnv* env,
jobject module,
const char* pkg_name,
jobject to_module);
|
| 97 | モジュール使用を追加 |
jvmtiError (JNICALL *AddModuleUses) (jvmtiEnv* env,
jobject module,
jclass service);
|
| 98 | モジュール提供を追加 |
jvmtiError (JNICALL *AddModuleProvides) (jvmtiEnv* env,
jobject module,
jclass service,
jclass impl_class);
|
| 99 | 変更可能モジュールか |
jvmtiError (JNICALL *IsModifiableModule) (jvmtiEnv* env,
jobject module,
jboolean* is_modifiable_module_ptr);
|
| 100 | すべてのスタック・トレースの取得 |
jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env,
jint max_frame_count,
jvmtiStackInfo** stack_info_ptr,
jint* thread_count_ptr);
|
| 101 | スレッド・リストのスタック・トレースの取得 |
jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env,
jint thread_count,
const jthread* thread_list,
jint max_frame_count,
jvmtiStackInfo** stack_info_ptr);
|
| 102 | スレッド・ローカルな記憶領域の取得 |
jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env,
jthread thread,
void** data_ptr);
|
| 103 | スレッド・ローカルな記憶領域の設定 |
jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env,
jthread thread,
const void* data);
|
| 104 | スタック・トレースの取得 |
jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env,
jthread thread,
jint start_depth,
jint max_frame_count,
jvmtiFrameInfo* frame_buffer,
jint* count_ptr);
|
| 105 | 予約済み |
void *reserved105; |
| 106 | タグの取得 |
jvmtiError (JNICALL *GetTag) (jvmtiEnv* env,
jobject object,
jlong* tag_ptr);
|
| 107 | タグの設定 |
jvmtiError (JNICALL *SetTag) (jvmtiEnv* env,
jobject object,
jlong tag);
|
| 108 | ガベージ・コレクションの強制 |
jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env); |
| 109 | オブジェクトから到達可能なオブジェクトの反復 |
jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env,
jobject object,
jvmtiObjectReferenceCallback object_reference_callback,
const void* user_data);
|
| 110 | 到達可能なオブジェクトの反復 |
jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env,
jvmtiHeapRootCallback heap_root_callback,
jvmtiStackReferenceCallback stack_ref_callback,
jvmtiObjectReferenceCallback object_ref_callback,
const void* user_data);
|
| 111 | ヒープの反復 |
jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env,
jvmtiHeapObjectFilter object_filter,
jvmtiHeapObjectCallback heap_object_callback,
const void* user_data);
|
| 112 | クラスのインスタンスの反復 |
jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env,
jclass klass,
jvmtiHeapObjectFilter object_filter,
jvmtiHeapObjectCallback heap_object_callback,
const void* user_data);
|
| 113 | 予約済み |
void *reserved113; |
| 114 | タグを使ったオブジェクトの取得 |
jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env,
jint tag_count,
const jlong* tags,
jint* count_ptr,
jobject** object_result_ptr,
jlong** tag_result_ptr);
|
| 115 | 参照の追跡 |
jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env,
jint heap_filter,
jclass klass,
jobject initial_object,
const jvmtiHeapCallbacks* callbacks,
const void* user_data);
|
| 116 | ヒープ内での反復 |
jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env,
jint heap_filter,
jclass klass,
const jvmtiHeapCallbacks* callbacks,
const void* user_data);
|
| 117 | 予約済み |
void *reserved117; |
| 118 | すべての仮想スレッドの一時停止 |
jvmtiError (JNICALL *SuspendAllVirtualThreads) (jvmtiEnv* env,
jint except_count,
const jthread* except_list);
|
| 119 | すべての仮想スレッドを再開 |
jvmtiError (JNICALL *ResumeAllVirtualThreads) (jvmtiEnv* env,
jint except_count,
const jthread* except_list);
|
| 120 | JNI関数テーブルの設定 |
jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env,
const jniNativeInterface* function_table);
|
| 121 | JNI関数テーブルの取得 |
jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env,
jniNativeInterface** function_table);
|
| 122 | イベント・コールバックの設定 |
jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env,
const jvmtiEventCallbacks* callbacks,
jint size_of_callbacks);
|
| 123 | イベントの生成 |
jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env,
jvmtiEvent event_type);
|
| 124 | 拡張関数の取得 |
jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env,
jint* extension_count_ptr,
jvmtiExtensionFunctionInfo** extensions);
|
| 125 | 拡張イベントの取得 |
jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env,
jint* extension_count_ptr,
jvmtiExtensionEventInfo** extensions);
|
| 126 | 拡張イベント・コールバックの設定 |
jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env,
jint extension_event_index,
jvmtiExtensionEvent callback);
|
| 127 | 環境の破棄 |
jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env); |
| 128 | エラー名の取得 |
jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env,
jvmtiError error,
char** name_ptr);
|
| 129 | JLocation形式の取得 |
jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env,
jvmtiJlocationFormat* format_ptr);
|
| 130 | システム・プロパティの取得 |
jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env,
jint* count_ptr,
char*** property_ptr);
|
| 131 | システム・プロパティの取得 |
jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env,
const char* property,
char** value_ptr);
|
| 132 | システム・プロパティの設定 |
jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env,
const char* property,
const char* value_ptr);
|
| 133 | 段階の取得 |
jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env,
jvmtiPhase* phase_ptr);
|
| 134 | 現在のスレッドのCPUタイマー情報を取得 |
jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env,
jvmtiTimerInfo* info_ptr);
|
| 135 | 現在のスレッドのCPU時間を取得 |
jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env,
jlong* nanos_ptr);
|
| 136 | スレッドのCPUタイマー情報を取得 |
jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env,
jvmtiTimerInfo* info_ptr);
|
| 137 | スレッドのCPU時間を取得 |
jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env,
jthread thread,
jlong* nanos_ptr);
|
| 138 | タイマー情報の取得 |
jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env,
jvmtiTimerInfo* info_ptr);
|
| 139 | 時間の取得 |
jvmtiError (JNICALL *GetTime) (jvmtiEnv* env,
jlong* nanos_ptr);
|
| 140 | 潜在的な権限の取得 |
jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env,
jvmtiCapabilities* capabilities_ptr);
|
| 141 | 予約済み |
void *reserved141; |
| 142 | 権限の追加 |
jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env,
const jvmtiCapabilities* capabilities_ptr);
|
| 143 | 権限の放棄 |
jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env,
const jvmtiCapabilities* capabilities_ptr);
|
| 144 | 使用可能なプロセッサの取得 |
jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env,
jint* processor_count_ptr);
|
| 145 | クラス・バージョン番号の取得 |
jvmtiError (JNICALL *GetClassVersionNumbers) (jvmtiEnv* env,
jclass klass,
jint* minor_version_ptr,
jint* major_version_ptr);
|
| 146 | 定数プールの取得 |
jvmtiError (JNICALL *GetConstantPool) (jvmtiEnv* env,
jclass klass,
jint* constant_pool_count_ptr,
jint* constant_pool_byte_count_ptr,
unsigned char** constant_pool_bytes_ptr);
|
| 147 | 環境ローカル記憶領域の取得 |
jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env,
void** data_ptr);
|
| 148 | 環境ローカル記憶領域の設定 |
jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env,
const void* data);
|
| 149 | ブートストラップ・クラス・ローダー検索の追加 |
jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env,
const char* segment);
|
| 150 | 冗長フラグの設定 |
jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env,
jvmtiVerboseFlag flag,
jboolean value);
|
| 151 | システム・クラス・ローダー検索の追加 |
jvmtiError (JNICALL *AddToSystemClassLoaderSearch) (jvmtiEnv* env,
const char* segment);
|
| 152 | クラスの再変換 |
jvmtiError (JNICALL *RetransformClasses) (jvmtiEnv* env,
jint class_count,
const jclass* classes);
|
| 153 | 所有モニターのスタックの深さ情報の取得 |
jvmtiError (JNICALL *GetOwnedMonitorStackDepthInfo) (jvmtiEnv* env,
jthread thread,
jint* monitor_info_count_ptr,
jvmtiMonitorStackDepthInfo** monitor_info_ptr);
|
| 154 | オブジェクト・サイズの取得 |
jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env,
jobject object,
jlong* size_ptr);
|
| 155 | 局所インスタンスの取得 |
jvmtiError (JNICALL *GetLocalInstance) (jvmtiEnv* env,
jthread thread,
jint depth,
jobject* value_ptr);
|
| 156 | ヒープ・サンプリング間隔の設定 |
jvmtiError (JNICALL *SetHeapSamplingInterval) (jvmtiEnv* env,
jint sampling_interval);
|
イベント
イベントの処理
エージェントは、アプリケーション・プログラム内で発生する多くのイベントについての通知を受けることができます。 イベントを処理するには、SetEventCallbacksを使ってコールバック関数のセットを指定します。 イベントごとに、対応するコールバック関数が呼び出されます。 コールバック関数の引数は、イベントに関する追加情報を提供します。
コールバック関数は通常、アプリケーション・スレッド内から呼び出されます。 JVM TI実装がイベントをキューに入れることは、決してありません。 これは、イベントのコールバック関数を注意深く記述する必要があることを意味しています。 このあと、一般的なガイドラインを説明します。 さらに詳しい提案については、個々のイベントの説明を参照してください。
- イベント・コールバック関数の実行中にスローされた例外は、現在のアプリケーション・スレッド内で現在保留中の例外を上書きできてしまいます。 したがって、例外を生成する可能性のあるJNI呼出しをイベント・コールバック関数から実行する場合は、保留中の例外を保存するように気を付けなければなりません。
- イベント・コールバック関数は、再入可能でなければなりません。 JVM TI実装は、イベントをキューに入れません。 エージェントが複数のイベントを一度に1つずつ処理する必要がある場合は、イベント・コールバック関数の内部でrawモニターを使うと、イベントの処理を直列化できます。
- JNIのFindClass関数を実行してクラスをロードするイベント・コールバック関数では、FindClassは現在のネイティブ・メソッドに関連付けられたクラス・ローダーを見つける、という点に注意する必要があります。 クラスのロードの目的とする場合、コールバックのパラメータとしてJNI環境を含むイベント・コールバックは、それがネイティブ呼出しであるかのように扱われます(そのネイティブ・メソッドは、イベント・スレッドの現在のフレームのクラス内に存在する)。
SuspendThreadでスレッドを明示的に中断するのは、エージェントの責任となります。
複数の環境で有効になっているイベントは、これらの環境が作成された順に、各エージェントに送信されます。
イベントの有効化
すべてのイベントは、初期段階では無効になっています。 イベントを受信するには、次のようにします。-
イベントが権限を必要とする場合、
AddCapabilitiesを使ってその権限を追加する必要がある。 -
SetEventCallbacksを使って、イベントのコールバックを設定する必要がある。 -
SetEventNotificationModeを使って、イベントを有効にする必要がある。
同じ位置で発生する複数のイベント
多くの状況で、1つのスレッド内の同じ位置で複数のイベントが発生する可能性があります。 そのような状況では、このセクションで説明する順序で、イベント・コールバックによりすべてのイベントがレポートされます。 現在位置がメソッドのエントリ・ポイントである場合は、同一スレッド内の現在位置で発生したほかのすべてのイベントより前に、MethodEntryイベントがレポートされます。
現在位置で例外のキャッチが検出された場合(catch節の先頭の場合か、未処理の例外をクリアしたネイティブ・メソッドが復帰した位置の場合)は、同一スレッド内の現在位置で発生したほかのすべてのイベントより前に、exceptionCatchイベントがレポートされます。
singleStepイベントまたはbreakpointイベントが現在位置でトリガーされる場合、そのイベントは、現在位置のコードが実行される直前に発生するものと定義されています。 これらのイベントは、同一スレッド内の現在位置にあるコードの実行によりトリガーされるどのイベント(特に、exception、fieldAccess、およびfieldModification)よりも前にレポートされます。 ステップ・イベントとブレークポイント・イベントの両方が同一のスレッドおよび場所でトリガーされた場合は、ステップ・イベントがブレークポイント・イベントより前にレポートされます。
現在位置がメソッドの終了ポイント(つまり、呼出し側に復帰する前の最後の位置)である場合、MethodExitイベントおよびFramePopイベント(要求されている場合)は、同一スレッド内の現在位置で発生するほかのすべてのイベントのあとにレポートされます。 これら2つのイベントについては、レポートされる順序は特に指定されていません。
あるイベントをエージェントが処理している最中に、同じスレッド内の同じ位置で別の(共通位置)イベントがトリガーされる可能性があります。 x型のイベントの処理中にそのようなy型のイベントがトリガーされ、かつ上で規定した順序付けに基づいてxがyよりも先である場合、現在のスレッドと位置に対して共通位置イベントyが報告されます。 xがyよりも先でない場合、yは現在のスレッドと位置に対して報告されません。 たとえば、SingleStepの処理中に現在位置でブレークポイントが設定された場合、そのブレークポイントは、スレッドが現在位置を離れる前に報告されます。
以下のイベントは、ほかのイベントと同じ位置で発生したと見なされることがありません。
-
VMStart -
VMInit -
VMDeath -
ThreadStart -
ThreadEnd -
VirtualThreadStart -
VirtualThreadEnd -
ClassLoad -
ClassPrepare
イベント・コールバック
以下のイベント・コールバック構造体では、イベントのハンドラ関数を指定できます。 これは、SetEventCallbacks関数で設定されます。
typedef struct {
jvmtiEventVMInit VMInit;
jvmtiEventVMDeath VMDeath;
jvmtiEventThreadStart ThreadStart;
jvmtiEventThreadEnd ThreadEnd;
jvmtiEventClassFileLoadHook ClassFileLoadHook;
jvmtiEventClassLoad ClassLoad;
jvmtiEventClassPrepare ClassPrepare;
jvmtiEventVMStart VMStart;
jvmtiEventException Exception;
jvmtiEventExceptionCatch ExceptionCatch;
jvmtiEventSingleStep SingleStep;
jvmtiEventFramePop FramePop;
jvmtiEventBreakpoint Breakpoint;
jvmtiEventFieldAccess FieldAccess;
jvmtiEventFieldModification FieldModification;
jvmtiEventMethodEntry MethodEntry;
jvmtiEventMethodExit MethodExit;
jvmtiEventNativeMethodBind NativeMethodBind;
jvmtiEventCompiledMethodLoad CompiledMethodLoad;
jvmtiEventCompiledMethodUnload CompiledMethodUnload;
jvmtiEventDynamicCodeGenerated DynamicCodeGenerated;
jvmtiEventDataDumpRequest DataDumpRequest;
jvmtiEventReserved reserved72;
jvmtiEventMonitorWait MonitorWait;
jvmtiEventMonitorWaited MonitorWaited;
jvmtiEventMonitorContendedEnter MonitorContendedEnter;
jvmtiEventMonitorContendedEntered MonitorContendedEntered;
jvmtiEventReserved reserved77;
jvmtiEventReserved reserved78;
jvmtiEventReserved reserved79;
jvmtiEventResourceExhausted ResourceExhausted;
jvmtiEventGarbageCollectionStart GarbageCollectionStart;
jvmtiEventGarbageCollectionFinish GarbageCollectionFinish;
jvmtiEventObjectFree ObjectFree;
jvmtiEventVMObjectAlloc VMObjectAlloc;
jvmtiEventReserved reserved85;
jvmtiEventSampledObjectAlloc SampledObjectAlloc;
jvmtiEventVirtualThreadStart VirtualThreadStart;
jvmtiEventVirtualThreadEnd VirtualThreadEnd;
} jvmtiEventCallbacks;
イベントの索引
- ブレークポイント
- クラス・ファイル・ロードフック
- クラスのロード
- クラスの準備
- コンパイル済みメソッドのロード
- コンパイル済みメソッドのアンロード
- データ・ダンプ要求
- 動的コード生成
- 例外
- 例外キャッチ
- フィールド・アクセス
- フィールドの変更
- フレームのポップ
- ガベージ・コレクションの完了
- ガベージ・コレクションの開始
- メソッド・エントリ
- メソッド終了
- 競合するモニター開始
- 競合するモニター開始済み
- モニター待機
- モニター待機終了
- ネイティブ・メソッドのバインド
- オブジェクトの解放
- リソース不足
- サンプル・オブジェクト割当
- ステップ実行
- スレッドの終了
- スレッドの開始
- 仮想スレッドの終了
- 仮想スレッド開始
- VM終了イベント
- VM初期化イベント
- VMオブジェクト割当て
- VM開始イベント
ステップ実行
void JNICALL
SingleStep(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jlocation location)
ステップ実行イベントを利用すると、エージェントは、VMで可能な最小の単位でスレッドの実行を追跡できます。 ステップ実行イベントは、スレッドが新しい位置に達するたびに生成されます。 通常、ステップ実行イベントは、Java™仮想マシン仕様に定義されているように、1つのVM命令が完了したことを示します。 ただし、位置の定義が異なる実装もあります。 いずれにしても、methodおよびlocationパラメータによって現在の位置を一意に識別できるため、この情報があればソース・ファイルと行番号へのマッピングが可能です。
ネイティブ・メソッド内からは、ステップ実行イベントは生成されません。
ライブ段階でしか送信されない
JVMTI_EVENT_SINGLE_STEP
60
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_SINGLE_STEP, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_single_step_events | ステップ実行イベントを取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | 新しい命令を実行しようとしているスレッド |
method | jmethodID | 新しい命令を実行しようとしているメソッド |
location | jlocation | 新しい命令の位置 |
ブレークポイント
void JNICALL
Breakpoint(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jlocation location)
ブレークポイント・イベントは、SetBreakpointを使ってブレークポイントとして指定された位置にスレッドが達した時点で生成されます。 methodおよびlocationパラメータは、現在の位置を一意に識別し、ソース・ファイルと行番号(その情報が入手できる場合)にマッピングできます。
ライブ段階でしか送信されない
JVMTI_EVENT_BREAKPOINT
62
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_BREAKPOINT, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_breakpoint_events |
Breakpointイベントを設定し、取得できる。
|
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
thread | jthread | ブレークポイントに達したスレッド |
method | jmethodID | ブレークポイントに達したメソッド |
location | jlocation | ブレークポイントの位置 |
フィールド・アクセス
void JNICALL
FieldAccess(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jlocation location,
jclass field_klass,
jobject object,
jfieldID field)
フィールド・アクセス・イベントは、SetFieldAccessWatchを使ってウォッチポイントとして指定されたフィールドにスレッドがアクセスした時点で生成されます。 methodおよびlocationパラメータは、現在の位置を一意に識別し、ソース・ファイルと行番号(その情報が入手できる場合)にマッピングできます。
ライブ段階でしか送信されない
JVMTI_EVENT_FIELD_ACCESS
63
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_ACCESS, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_field_access_events |
フィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch
|
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | フィールドにアクセスするスレッド |
method | jmethodID | アクセスが発生しているメソッド |
location | jlocation | アクセスが発生している位置 |
field_klass | jclass | アクセスされるフィールドのクラス |
object | jobject |
フィールドがインスタンス・フィールドの場合はアクセスされているフィールドを持つオブジェクト、それ以外の場合はNULL
|
field | jfieldID | アクセスされているフィールド |
フィールドの変更
void JNICALL
FieldModification(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jlocation location,
jclass field_klass,
jobject object,
jfieldID field,
char signature_type,
jvalue new_value)
フィールドの変更イベントは、SetFieldModificationWatchを使ってウォッチポイントとして指定されたフィールドをスレッドが変更した時点で生成されます。 methodおよびlocationパラメータは、現在の位置を一意に識別し、ソース・ファイルと行番号(その情報が入手できる場合)にマッピングできます。
ライブ段階でしか送信されない
JVMTI_EVENT_FIELD_MODIFICATION
64
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_MODIFICATION, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_field_modification_events |
フィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch
|
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | フィールドを変更するスレッド |
method | jmethodID | 変更が発生しているメソッド |
location | jlocation | 変更が発生している位置 |
field_klass | jclass | 変更されているフィールドのクラス |
object | jobject |
フィールドがインスタンス・フィールドの場合は変更されているフィールドを持つオブジェクト、それ以外の場合はNULL
|
field | jfieldID | 変更されているフィールド |
signature_type | char | 新しい値のシグニチャの型 |
new_value | jvalue | 新しい値 |
フレームのポップ
void JNICALL
FramePop(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jboolean was_popped_by_exception)
フレーム・ポップ・イベントは、NotifyFramePopの呼出しで指定された単一のフレーム内の単一のメソッドから出る時点で生成されます。 これは、戻り命令の実行または呼出し側への例外のスローによって終了された場合、trueとなります(was_popped_by_exceptionを参照)。 ただし、PopFrame関数によるフレームのポップはレポートされません。
深さ0についてGetFrameLocationによって報告されるロケーションは、リターン・メソッド内の実行可能なロケーションを、リターン直前に識別します。
ライブ段階でしか送信されない
JVMTI_EVENT_FRAME_POP
61
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FRAME_POP, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_frame_pop_events |
FramePopイベントを設定し、取得できる。
|
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | フレームをポップするスレッド |
method | jmethodID | ポップされるメソッド |
was_popped_by_exception | jboolean | フレームが例外のスローによってポップされた場合はtrue。 メソッドが戻り命令によって終了した場合はfalse。 |
メソッド・エントリ
void JNICALL
MethodEntry(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method)
メソッド・エントリ・イベントは、Javaプログラミング言語メソッド(ネイティブ・メソッドを含む)に入る時点で生成されます。
深さ0についてGetFrameLocationによって報告されるロケーションは、メソッド内の初期実行可能ファイルのロケーションを識別します。
多くのプラットフォームでは、メソッド・エントリ・イベントまたはメソッド終了イベントを有効にすると、パフォーマンスが大幅に低下します。したがって、プロ・ファイリングなど、パフォーマンスを重視する処理での使用はお薦めしません。 これらの場合には、バイトコード・インストゥルメンテーションを使用すべきです。
ライブ段階でしか送信されない
JVMTI_EVENT_METHOD_ENTRY
65
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_ENTRY, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_method_entry_events | メソッドに入るときにメソッド・エントリ・イベントを生成できる |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | メソッドに入るスレッド |
method | jmethodID | 入る先のメソッド |
メソッド終了
void JNICALL
MethodExit(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jboolean was_popped_by_exception,
jvalue return_value)
メソッド終了イベントは、Javaプログラミング言語メソッドおよびネイティブ・メソッドから終了する時点で生成されます。 これは、戻り命令の実行または呼出し側への例外のスローによって終了された場合、trueとなります(was_popped_by_exceptionを参照)。
深さ0についてGetFrameLocationによって報告されるロケーションは、リターン・メソッド内の実行可能ファイルのロケーションを、リターン直前に識別します。
多くのプラットフォームでは、メソッド・エントリ・イベントまたはメソッド終了イベントを有効にすると、パフォーマンスが大幅に低下します。したがって、プロ・ファイリングなど、パフォーマンスを重視する処理での使用はお薦めしません。 これらの場合には、バイトコード・インストゥルメンテーションを使用すべきです。
ライブ段階でしか送信されない
JVMTI_EVENT_METHOD_EXIT
66
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_EXIT, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_method_exit_events | メソッドの終了時にメソッド終了イベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | メソッドを終了するスレッド |
method | jmethodID | 終了されるメソッド |
was_popped_by_exception | jboolean | フレームが例外のスローによってポップされた場合はtrue。 メソッドが戻り命令によって終了した場合はfalse。 |
return_value | jvalue |
終了されるメソッドの戻り値。 was_popped_by_exceptionがtrueの場合、未定義で、使用すべきでない。
|
ネイティブ・メソッドのバインド
void JNICALL
NativeMethodBind(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
void* address,
void** new_address_ptr)
ネイティブ・メソッド・バインド・イベントは、VMがJavaプログラミング言語のネイティブ・メソッドを、そのネイティブ・メソッドを実装する関数のアドレスにバインドした時点で送信されます。 これは、ネイティブ・メソッドの初回呼出し時に発生しますが、JNI関数RegisterNativesの呼出し時にも発生します。 このイベントを使えば、エージェントが指定するプロキシ関数にバインドをリダイレクトできます。 このイベントは、ネイティブ・メソッドがバインド解除された場合には送信されません。 通常、このプロキシ関数は特定のメソッドに固有であるか、あるいは一般的な場合に対応できるように自動生成されたアセンブリ・コードでなければいけません。インストゥルメンテーション・コードが実行された後、通常は元のバインディング・アドレスにある関数が呼び出されるからです。 元のバインディングを復元したり、リダイレクションを変更したりするには、JNI関数RegisterNativesを使用します。 一部のイベントは初期段階で送信可能です。この時点ではJNIや大部分のJVM TIは使用不可能ですが、メソッドやアドレスを後で使用するために保存しておくことはできます。
初期段階、開始段階、およびライブ段階で送信される
JVMTI_EVENT_NATIVE_METHOD_BIND
67
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_NATIVE_METHOD_BIND, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_native_method_bind_events | ネイティブ・メソッドが実装にバインドされているときイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * |
イベントの現在のスレッドのJNI環境は、初期段階中に送信されるとNULLになる。
|
thread | jthread | バインドを要求するスレッド |
method | jmethodID | バインドされるネイティブ・メソッド |
address | void* | VMのバインド先のアドレス(ネイティブ・メソッドの実装アドレス) |
new_address_ptr | void** |
参照アドレスが変更された場合(つまり、*new_address_ptrが設定された場合)、代わりに、提供されたアドレスへのバインドが行われる。
|
例外
void JNICALL
Exception(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jlocation location,
jobject exception,
jmethodID catch_method,
jlocation catch_location)
例外イベントは、Javaプログラミング言語メソッド内で例外が初めて検出されるたびに生成されます。 ここで、「例外」は任意のjava.lang.Throwableを意味します。 例外は、Javaプログラミング言語メソッド、ネイティブ・メソッドのいずれかによってスローされる可能性がありますが、ネイティブ・メソッドの場合には、その例外がJavaプログラミング言語メソッド内で初めて認識されるまで、イベントは生成されません。 ネイティブ・メソッド内で例外が設定された後クリアされた場合(したがって、例外が一度もJavaプログラミング言語コードから可視状態にならなかった場合)、例外イベントは生成されません。
methodおよびlocationパラメータは、現在の位置(例外が検出された位置)を一意に識別し、ソース・ファイルと行番号(その情報が入手できる場合)にマッピングできます。 exceptionフィールドは、スローされた例外オブジェクトを識別します。 catch_methodとcatch_locationは、スローされた例外を処理するcatch節が存在する場合に、その位置を識別します。 そのようなcatch節が存在しない場合、各フィールドは0に設定されます。 スレッドがこのcatch節に到達するという保証はありません。 呼出しスタック上で、スロー位置とcatch節の間にネイティブ・メソッドが存在していれば、それらのネイティブ・メソッドのいずれかによって例外がリセットされる可能性があります。 同様に、非キャッチとして報告された例外(catch_klassなどが0に設定された例外)は、実際にはネイティブ・メソッドによってキャッチされる可能性があります。 エージェントからこれらの発生をチェックするには、ExceptionCatchイベントを監視します。 finally節は、キャッチ/再スローとして実装される点に注意してください。 したがって、それらはキャッチ位置で報告されます。
ライブ段階でしか送信されない
JVMTI_EVENT_EXCEPTION
58
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_exception_events | 例外スロー・イベントおよび例外キャッチ・イベントを取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | 例外を生成するスレッド |
method | jmethodID | 例外を生成するメソッド |
location | jlocation | 例外が発生した位置 |
exception | jobject | スローされる例外 |
catch_method | jmethodID |
例外をキャッチするメソッド。既知のキャッチがない場合はNULL
|
catch_location | jlocation | 例外をキャッチする位置。既知のキャッチがない場合はゼロ |
例外キャッチ
void JNICALL
ExceptionCatch(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jmethodID method,
jlocation location,
jobject exception)
例外キャッチ・イベントは、スローされた例外がキャッチされた時点で生成されます。 ここで、「例外」は任意のjava.lang.Throwableを意味します。 例外がJavaプログラミング言語メソッド内でキャッチされた場合は、catch節に到達した時点でこのイベントが生成されます。 例外がネイティブ・メソッド内でキャッチされた場合は、Javaプログラミング言語メソッドに制御が戻った直後にこのイベントが生成されます。 例外キャッチ・イベントは、Javaプログラミング言語メソッド内でスローが検出された例外に対して生成されます。 finally節は、キャッチ/再スローとして実装される点に注意してください。 このため、これらは例外キャッチ・イベントを生成します。
methodおよびlocationパラメータは、現在の位置を一意に識別し、ソース・ファイルと行番号(その情報が入手できる場合)にマッピングできます。 Javaプログラミング言語メソッド内でキャッチされた例外の場合は、exceptionオブジェクトが例外オブジェクトを識別します。 ネイティブ・メソッド内でキャッチされた例外は、例外のキャッチがレポートされた時点で入手可能とはかぎらないので、exceptionフィールドはNULLに設定されます。
ライブ段階でしか送信されない
JVMTI_EVENT_EXCEPTION_CATCH
59
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION_CATCH, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_exception_events | 例外スロー・イベントおよび例外キャッチ・イベントを取得できる |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | 例外をキャッチするスレッド |
method | jmethodID | 例外をキャッチするメソッド |
location | jlocation | 例外がキャッチされる位置 |
exception | jobject | キャッチされる例外 |
スレッドの開始
void JNICALL
ThreadStart(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread)
スレッド開始イベントは、その初期メソッドが実行される前に新しいスレッドによって生成されます。
このイベントはプラットフォーム・スレッドによって生成されます。 仮想スレッドでは生成されません。
can_support_virtual_threads機能を持つエージェントは、新しく起動された仮想スレッドによってVirtualThreadStartイベントに通知できるようにすることができます。
プラットフォーム・スレッドは、スレッド開始イベントが生成される前にGetAllThreadsによって戻される配列にリストされます。 また、スレッド開始イベントの前に、その他のイベントがスレッド上に生成される可能性があります。
イベントは新しく開始されたthreadに送信されます。
開始段階とライブ段階で送信される
JVMTI_EVENT_THREAD_START
52
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
thread | jthread | 開始するスレッド |
スレッドの終了
void JNICALL
ThreadEnd(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread)
スレッド終了イベントは、最初のメソッドの実行が終了した後に終了スレッドによって生成されます。
このイベントはプラットフォーム・スレッドによって生成されます。 仮想スレッドでは生成されません。
can_support_virtual_threads機能を持つエージェントは、仮想スレッドを終了することで、VirtualThreadEndイベントに通知できるようにすることができます。
プラットフォーム・スレッドは、スレッド終了イベントの生成後にGetAllThreadsによって返される配列にリストされます。 スレッド終了イベントのあと、スレッド上にイベントは生成されません。
イベントは終了threadに送信されます。
開始段階とライブ段階で送信される
JVMTI_EVENT_THREAD_END
53
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_END, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
thread | jthread | 終了するスレッド |
仮想スレッド開始
void JNICALL
VirtualThreadStart(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread virtual_thread)
仮想スレッド開始イベントは、初期メソッドが実行される前に生成されます。
新しく起動したvirtual_threadでイベントが送信されます。
開始段階とライブ段階で送信される
JVMTI_EVENT_VIRTUAL_THREAD_START
87
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VIRTUAL_THREAD_START, NULL)
21
| 権限 | 効果 |
|---|---|
can_support_virtual_threads | 仮想スレッドをサポートできる |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
virtual_thread | jthread | 仮想スレッドの実行が開始されました。 |
仮想スレッドの終了
void JNICALL
VirtualThreadEnd(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread virtual_thread)
仮想スレッド終了イベントは、初期メソッドの実行が終了した後に生成されます。
イベントは終了virtual_threadに送信されます。
開始段階とライブ段階で送信される
JVMTI_EVENT_VIRTUAL_THREAD_END
88
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VIRTUAL_THREAD_END, NULL)
21
| 権限 | 効果 |
|---|---|
can_support_virtual_threads | 仮想スレッドをサポートできる |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
virtual_thread | jthread | 終了中の仮想スレッド。 |
クラスのロード
void JNICALL
ClassLoad(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jclass klass)
クラス・ロード・イベントが「クラスまたはインタフェースの作成時。」で生成されます。
配列クラスの作成では、クラス・ロード・イベントは生成されません。 プリミティブ・クラス(java.lang.Integer.TYPEなど)の作成では、クラス・ロード・イベントは生成されません。
特定のスレッドによって生成されるクラス・ロード・イベントの順序は、そのスレッド内でのクラス・ロードの順序と一致することが保証されます。
このイベントは、クラスのロードの早い段階で送信されます。 このため、クラスは慎重に使用する必要があります。 たとえば、メソッドやフィールドがまだロードされていないため、メソッド、フィールド、サブクラスなどへの照会で、正しい結果が得られません。 Java言語仕様のクラスとインタフェースのロードを参照してください。 ほとんどの場合、ClassPrepareの方が有効です。
開始段階とライブ段階で送信される
JVMTI_EVENT_CLASS_LOAD
55
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_LOAD, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | クラスをロードするスレッド |
klass | jclass | ロードされるクラス |
クラスの準備
void JNICALL
ClassPrepare(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jclass klass)
クラス準備イベントは、クラスの準備が完了した時点で生成されます。 この時点では、クラスのフィールド、メソッド、および実装されたインタフェースが利用可能ですが、クラスのコードはまだ何も実行されていません。 配列クラスは、フィールドやメソッドを持つことがないため、配列クラスについてクラス準備イベントが生成されることはありません。 プリミティブ・クラス(たとえば、java.lang.Integer.TYPE)についても、クラス準備イベントは生成されません。
開始段階とライブ段階で送信される
JVMTI_EVENT_CLASS_PREPARE
56
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_PREPARE, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | クラス準備イベントを生成するスレッド |
klass | jclass | 準備されるクラス |
クラス・ファイル・ロードフック
void JNICALL
ClassFileLoadHook(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jclass class_being_redefined,
jobject loader,
const char* name,
jobject protection_domain,
jint class_data_len,
const unsigned char* class_data,
jint* new_class_data_len,
unsigned char** new_class_data)
このイベントは、VMがクラス・ファイル・データを取得したとき、そのクラスのメモリー内部表現を構築する前の時点で送信されます。 また、このイベントは、任意のJVM TI環境内から呼び出されたRetransformClasses関数またはRedefineClasses関数によってクラスが変更されようとしているときにも送信されます。 エージェントは、VMによって送信された既存のクラス・ファイル・データを実装して、プロ・ファイリング\/デバッグ・フックを含めることができます。 使用方法については、バイト・コード・インストゥルメンテーションの説明を参照してください。
機能can_generate_early_class_hook_eventsおよびcan_generate_all_class_hook_eventsが有効な場合、このイベントは初期フェーズで送信されます。 それ以外の場合、このイベントは、VMが(スタートphase)を初期化する前に送信されます。 一部のクラスは、関数(例、ROMizedクラスまたは実装定義クラス)と互換性がない可能性があり、これらのクラスに対してこのイベントは生成されません。
エージェントは、メモリー割当て関数Allocateを使用して、修正したクラス・ファイル・データのバッファ用の領域を割り当てる必要があります。新しいクラス・ファイル・データのバッファを解放する処理は、VMにより、Deallocateを使用して実行されるからです。
エージェントは、クラス・ファイルを変更する場合、新しく実装されたクラス・ファイル・データ・バッファをポイントするようにnew_class_dataを設定し、この呼び出しから戻る前に、new_class_data_lenにそのバッファの長さを設定する必要があります。 変更が不要な場合、エージェントはnew_class_dataを設定しません。 複数のエージェントがこのイベントを有効にしている場合、結果はチェーンになります。 つまり、new_class_dataが設定されている場合は、これが次のエージェントのclass_dataになります。
ライブ・フェーズでクラス・ロードを処理する場合、GetNamedModuleファンクションを使用して、クラス・ローダーおよびパッケージ名をモジュールにマップできます。 クラスが再定義または再変換される場合、class_being_redefinedはNULLではないため、JNI GetModule関数を使用してモジュールを取得することもできます。
このイベントが各環境に送信される順番は、ほかのイベントの場合とは異なります。 このイベントは次の順番で環境に送信されます。
このイベントがRetransformClassesによって起動された場合、再変換可能な環境だけにこのイベントが送信されます。
初期段階、開始段階、およびライブ段階で送信される
JVMTI_EVENT_CLASS_FILE_LOAD_HOOK
54
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)
1.0
| 任意の機能 | |
|---|---|
| 権限 | 効果 |
can_generate_all_class_hook_events | ロードされたすべてのクラスに対して、ClassFileLoadHookイベントを生成できる。 |
can_generate_early_class_hook_events |
ClassFileLoadHookイベントを初期フェーズで生成できます。 この機能およびcan_generate_all_class_hook_eventsが有効になっている場合は、初期フェーズでロードされたクラスに対してClassFileLoadHookイベントをポストできます。 ClassFileLoadHookを参照してください。
|
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
class_being_redefined | jclass |
再定義または再変換されるクラス。 クラスのロードによって送信された場合はNULL。
|
loader | jobject |
クラスをロードするクラス・ローダー。 ブートストラップ・クラス・ローダーの場合はNULL。
|
name | const char* |
ロード対象クラスの名前。VM内部修飾名(「java/util/List」など)。modified UTF-8文字列としてエンコードされる。 ノート: クラスの定義時にNULL名が使用されたか名前が指定されなかった場合、nameはNULLになる。
|
protection_domain | jobject |
クラスのProtectionDomain。
|
class_data_len | jint | 現在のクラス・ファイル・データのバッファの長さ。 |
class_data | const unsigned char* | 現在のクラス・ファイル・データのバッファのポインタ。 |
new_class_data_len | jint* | 新しいクラス・ファイル・データのバッファの長さのポインタ。 |
new_class_data | unsigned char** | 実装済みクラス・ファイル・データのバッファのポインタへのポインタ。 |
VM開始イベント
void JNICALL
VMStart(jvmtiEnv *jvmti_env,
JNIEnv* jni_env)
VM起動イベントは、VMの開始を示します。 この時点で、JNIはライブ状態になっていますが、VMはまだ完全に初期化されていません。 このイベントが生成されたら、エージェントは任意のJNI関数を自由に呼び出せます。 このイベントは開始段階の始まりを示します。開始段階で許可されたJVM TI関数を呼び出せます。
このイベントのタイミングは、エージェントがcan_generate_early_vmstart機能を追加したかどうかによって異なる場合があります。 機能が追加されている場合、VMはできるだけ早くイベントをポストします。 VMはバイトコードを実行できますが、java.base以外のモジュール、またはjava.baseの任意のクラスでもクラスをロードできるポイントに初期化されていない可能性があります。 このフェーズでロード時インストゥルメンテーションを実行するエージェントは、このフェーズで実行される可能性があるコードをインストゥルメントするときに十分に注意する必要があります。 また、JNI FindClassではクラスをロードできない可能性があり、そうしようとすると予期しない動作が発生し、一部のVM実装で安定性の問題が発生する可能性があるため、十分に注意する必要があります。 機能が追加されていない場合、VMは、java.base以外のモジュールでクラスをロードできるか、VMの初期化が完了するまで、このイベントのポストを遅延します。 複数のJVM TI環境を作成するエージェント。この機能は、一部の環境には追加されていますが、機能を備えたJVM TI環境で開始する前に開始フェーズで開始することもできます。
VMの起動に失敗した場合、このイベントは送信されません。
開始段階とライブ段階で送信される
JVMTI_EVENT_VM_START
57
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_START, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
VM初期化イベント
void JNICALL
VMInit(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread)
VM初期化イベントはVM初期化の完了を示します。 このイベントが生成されたら、エージェントは任意のJNI関数またはJVM TI関数を自由に呼び出せます。 VM初期化イベントと同時かそれより先に発生するイベントが存在する可能性がありますが、先行イベントが存在する場合、その処理は慎重に行うべきです。VMの初期化が完了していないからです。 メイン・アプリケーション・スレッドのスレッド開始イベントは、VM初期化イベントのハンドラが復帰するまで発生しないことが保証されています。
VMの起動に失敗した場合、このイベントは送信されません。
ライブ段階でしか送信されない
JVMTI_EVENT_VM_INIT
50
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
thread | jthread | 初期スレッド |
VM終了イベント
void JNICALL
VMDeath(jvmtiEnv *jvmti_env,
JNIEnv* jni_env)
VM終了イベントは、VMの終了をエージェントに通知します。 VMDeathイベントのあとは、イベントは発生しません。
VMの起動に失敗した場合、このイベントは送信されません。 こうした場合、Agent_OnUnloadは呼び出される点に注意してください。
ライブ段階でしか送信されない
JVMTI_EVENT_VM_DEATH
51
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
コンパイル済みメソッドのロード
メソッドがVMによってコンパイルされ、メモリー内にロードされる時点で送信されます。 アンロードされた場合、typedef struct { const void* start_address; jlocation location; } jvmtiAddrLocationMap;void JNICALL CompiledMethodLoad(jvmtiEnv *jvmti_env, jmethodID method, jint code_size, const void* code_addr, jint map_length, const jvmtiAddrLocationMap* map, const void* compile_info)
CompiledMethodUnloadイベントが送信されます。 移動した場合、新しいCompiledMethodLoadイベントに続いて、CompiledMethodUnloadイベントが送信されます。 単一のメソッドが複数の形式でコンパイルされることがあり、このイベントがその形式ごとに送信される点に注意してください。 また、複数のメソッドが単一のアドレス範囲にインラインされることがあり、このイベントが各メソッドごとに送信される点にも注意してください。
これらのイベントは、最初の発生のあと、GenerateEventsによって送信できます。
開始段階とライブ段階で送信される
JVMTI_EVENT_COMPILED_METHOD_LOAD
68
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_LOAD, NULL)
1.0
| フィールド | 型 | 説明 |
|---|---|---|
start_address | const void* | 位置に対応するコードの開始ネイティブ・アドレス |
location | jlocation |
対応する位置。 位置の意味については、GetJLocationFormatを参照。
|
| 権限 | 効果 |
|---|---|
can_generate_compiled_method_load_events | メソッドのコンパイル時またはアンロード時にイベントを生成できる |
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | コンパイルおよびロードされているメソッド |
code_size | jint | コンパイルされたコードのサイズ |
code_addr | const void* | コンパイルされたメソッド・コードがロードされるアドレス |
map_length | jint |
アドレス・マップ内のjvmtiAddrLocationMapエントリの数。 マッピング情報が提供されない場合はゼロ。
|
map | const jvmtiAddrLocationMap* |
ネイティブ・アドレスと位置のマッピング。 各エントリのネイティブ・アドレス範囲は、start_addressから次のエントリのstart_address-1まで。 マッピング情報が提供されない場合はNULL。
|
compile_info | const void* | VM固有のコンパイル情報。 参照されるコンパイル情報は、VMによって管理され、収集のためにエージェントに依存していてはならない。 この情報の内容と寿命は、VM実装によって定義される。 |
コンパイル済みメソッドのアンロード
void JNICALL
CompiledMethodUnload(jvmtiEnv *jvmti_env,
jmethodID method,
const void* code_addr)
コンパイル済メソッドがメモリーからアンロードされた時点で送信されます。 このイベントは、アンロードを実行したスレッド上で送信されない可能性があります。 このイベントは、アンロード発生後少し経ってから送信される可能性がありますが、新しく生成されたコンパイル済メソッドによってメモリーが再利用される前に送信されます。 このイベントは、クラスのアンロード後に送信される可能性があります。
開始段階とライブ段階で送信される
JVMTI_EVENT_COMPILED_METHOD_UNLOAD
69
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_UNLOAD, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_compiled_method_load_events | メソッドのコンパイル時またはアンロード時にイベントを生成できる |
| 名前 | 型 | 説明 |
|---|---|---|
method | jmethodID | アンロード対象のコンパイル済メソッド。 コンパイル済メソッドの識別専用。クラスはアンロードされるため、メソッドを以後のJNIまたはJVM TI関数の引数として使用できない。 |
code_addr | const void* | コンパイルされたメソッド・コードがロードされたアドレス。 コンパイル済メソッドの識別専用。領域が回収済の可能性がある。 |
動的コード生成
void JNICALL
DynamicCodeGenerated(jvmtiEnv *jvmti_env,
const char* name,
const void* address,
jint length)
仮想マシンのコンポーネントが動的に生成された時点で送信されます。 これは、コンパイル済のJavaプログラミング言語コードには対応しません。CompiledMethodLoadを参照してください。 これは、コマンド行オプションに応じて異なる内容で生成されるインタープリタなどの、ネイティブ・コード用です。
このイベントには、制御権限はありません。 VMは、これらのイベントを生成できない場合、何も送信しません。
これらのイベントは、最初の発生のあと、GenerateEventsによって送信できます。
初期段階、開始段階、およびライブ段階で送信される
JVMTI_EVENT_DYNAMIC_CODE_GENERATED
70
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_DYNAMIC_CODE_GENERATED, NULL)
1.0
権限
必要な機能
| 名前 | 型 | 説明 |
|---|---|---|
name | const char* | コードの名前。修正UTF-8文字列としてエンコードされる。 エンドユーザーへの表示用。 名前は一意でない可能性がある。 |
address | const void* | コードのネイティブ・アドレス |
length | jint | コードの長さ(バイト単位) |
データ・ダンプ要求
VMによって送信され、エージェントにデータをダンプするよう要求します。 これは単に示唆しているだけであり、エージェントはこのイベントに必ずしも反応する必要はありません。 これは、ユーザーからのコマンド行シグナルを処理する場合に便利です。 たとえば、Java 2 SDKでは、Win32上のCTRL-BreakとLinux上のCTRL-\を使用すると、VMはこのイベントをエージェントに送信します。void JNICALL DataDumpRequest(jvmtiEnv *jvmti_env)
ライブ段階でしか送信されない
JVMTI_EVENT_DATA_DUMP_REQUEST
71
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_DATA_DUMP_REQUEST, NULL)
1.0
権限
必要な機能
パラメータ
なし
競合するモニター開始
void JNICALL
MonitorContendedEnter(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jobject object)
スレッドがJavaプログラミング言語モニターに入ろうとしたとき、そのモニターがすでに別のスレッドによって獲得されている場合に送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_CONTENDED_ENTER
75
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_monitor_events | モニターの使用率に関するイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | モニターに入ろうとするスレッドのJNIローカル参照 |
object | jobject | モニターのJNIローカル参照 |
競合するモニター開始済み
void JNICALL
MonitorContendedEntered(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jobject object)
別のスレッドがJavaプログラミング言語モニターを解放するのを待ったあとで、スレッドがそのJavaモニターに入るときに送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_CONTENDED_ENTERED
76
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_monitor_events | モニターの使用率に関するイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | モニターに入るスレッドのJNIローカル参照 |
object | jobject | モニターのJNIローカル参照 |
モニター待機
void JNICALL
MonitorWait(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jobject object,
jlong timeout)
スレッドがオブジェクトを待機しようとしているときに送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_WAIT
73
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAIT, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_monitor_events | モニターの使用率に関するイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | 待機しようとするスレッドのJNIローカル参照 |
object | jobject | モニターのJNIローカル参照 |
timeout | jlong | スレッドが待機する時間(単位はミリ秒)。 |
モニター待機終了
void JNICALL
MonitorWaited(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jobject object,
jboolean timed_out)
スレッドがオブジェクトの待機を終了するときに送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_WAITED
74
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAITED, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_monitor_events | モニターの使用率に関するイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | 待機を終了したスレッドのJNIローカル参照 |
object | jobject | モニターのJNIローカル参照。 |
timed_out | jboolean | モニターがタイム・アウトになった場合true |
リソース不足
void JNICALL
ResourceExhausted(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jint flags,
const void* reserved,
const char* description)
実行中のアプリケーションが必要とするVMリソースが使い果たされたときに送信されます。 任意の権限によって必要とされるものを除けば、不足を報告するリソース・セットは実装に依存します。
次のビット・フラグは、リソース不足のプロパティを定義します。
リソース不足フラグ 定数 値 説明 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR0x0001 このイベントが返されたあと、VMは java.lang.OutOfMemoryErrorをスローする。JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP0x0002 VMが、JavaTMプラットフォームのヒープからメモリーを割り当てることができなかった。 ヒープとは、すべてのクラス・インスタンスおよび配列のメモリーの割当て元となる実行時データ領域のことである。 JVMTI_RESOURCE_EXHAUSTED_THREADS0x0004 VMがスレッドを作成できなかった。
ライブ段階でしか送信されない
JVMTI_EVENT_RESOURCE_EXHAUSTED
80
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_RESOURCE_EXHAUSTED, NULL)
1.1
| 任意の機能 | |
|---|---|
| 権限 | 効果 |
can_generate_resource_exhaustion_heap_events | VMがヒープからメモリーの割り当てを行えない場合に、イベントを生成できる。 |
can_generate_resource_exhaustion_threads_events | VMがスレッドを作成できない場合にイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
flags | jint | リソース不足フラグで指定される、リソース不足のプロパティを定義するフラグ。 |
reserved | const void* | 予約済み。 |
description | const char* | リソース不足の説明。修正UTF-8文字列としてエンコードされる。 |
VMオブジェクト割当て
void JNICALL
VMObjectAlloc(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jobject object,
jclass object_klass,
jlong size)
メソッドによって仮想マシンが、Javaプログラミング言語コードに対して可視のオブジェクトを直接割り当てる場合に送信されます。 通常、オブジェクトの割当ては、割り当てるメソッドのバイト・コードを実装することによって検出されます。 JNI関数呼出しにより、ネイティブ・コードで生成されたオブジェクト割当ては、JNI関数の遮断によって検出されます。 バイト・コードに関連付けられておらず、ネイティブでないメソッドは、VMによって直接実行されます。 このイベントは、これらのメソッドによって送信されます。 仮想マシンが、これらのメソッドの一部またはすべてに対してバイト・コードを実装できない場合、このイベントが送信されることがあります。 SampledObjectAllocイベントは、バイトコード・メソッドの実行、JNIメソッドの実行、およびVMメソッドによる直接の割当てなど、すべてのJavaオブジェクトの割当てに対してトリガーされることに注意してください。
次に、このイベントが送信される典型的な事例を示します。
-
リフレクション -- たとえば、
java.lang.Class.newInstance() - バイト・コードで表されていないメソッド -- たとえば、VMの組込みメソッドとJ2MEプリロード・クラス
-
バイト・コードによる割り当て -- たとえば、
newおよびnewarrayVM命令 -
JNI関数呼出しによる割り当て -- たとえば、
AllocObject - VM初期化中の割当て
- VM内部オブジェクト
ライブ段階でしか送信されない
JVMTI_EVENT_VM_OBJECT_ALLOC
84
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_vm_object_alloc_events | オブジェクトのVM割当てに関するイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境 |
thread | jthread | オブジェクトを割り当てるスレッド。 |
object | jobject | 割り当てられたオブジェクトのJNIローカル参照 |
object_klass | jclass | オブジェクトのクラスのJNIローカル参照 |
size | jlong |
オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
サンプル・オブジェクト割当
void JNICALL
SampledObjectAlloc(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jobject object,
jclass object_klass,
jlong size)
割当済オブジェクトがサンプリングされたときに送信されます。 デフォルトでは、サンプリング間隔は512KBに設定されています。 サンプリングは、パターン・ベースのバイアスを回避するために半ランダムであり、長期間のサンプリングに対して全体の平均間隔を概算にします。
各スレッドは、最後のイベント送信以降に割り当てられたバイト数を追跡します。 バイト数がサンプリング間隔を超えると、別のイベントが送信されます。 つまり、平均では、最後のサンプル以降、スレッドが512KBバイトを割り当てるたびに1つのオブジェクトがサンプリングされます。
Samplerが擬似乱数であることに注意してください: 512KBごとに正確にサンプリングするわけではありません。 この目的は、固定パターン(つまり、同じオブジェクト・セットが512KBごとに割り当てられます。)で割当てが行われても高品質なサンプリングを保証することです。
別のサンプリング間隔が必要な場合、ユーザーは新しいサンプリング間隔を表す厳密な正の整数値でSetHeapSamplingIntervalをコールできます。
このイベントは、サンプリングされた割当てが実行された後に送信されます。 これによって、オブジェクト、割当てのスタック・トレース、スレッド割当て、割当てサイズおよびオブジェクト・クラスが提供されます。
このシステムの一般的なユースケースは、ヒープ割当ての発生場所を決定することです。 弱い参照および関数GetStackTraceと組み合せると、ユーザーはどのスタック・トレースから割り当てられ、プログラムの実行中に有効なオブジェクトであるかを追跡できます。
ライブ段階でしか送信されない
JVMTI_EVENT_SAMPLED_OBJECT_ALLOC
86
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, NULL)
11
| 権限 | 効果 |
|---|---|
can_generate_sampled_object_alloc_events |
サンプリングされた配賦イベントを生成できます。 この機能が有効な場合は、ヒープ・サンプリング・メソッドSetHeapSamplingIntervalをコールでき、SampledObjectAllocイベントを生成できます。
|
| 名前 | 型 | 説明 |
|---|---|---|
jni_env | JNIEnv * | イベントの現在のスレッドのJNI環境。 |
thread | jthread | オブジェクトを割り当てるスレッド。 |
object | jobject | 割り当てられたオブジェクトのJNIローカル参照 |
object_klass | jclass | オブジェクトのクラスのJNIローカル参照 |
size | jlong |
オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。
|
オブジェクトの解放
void JNICALL
ObjectFree(jvmtiEnv *jvmti_env,
jlong tag)
オブジェクトの解放イベントは、ガベージ・コレクタがオブジェクトを解放した時点で送信されます。 イベントは、タグ付きオブジェクトの場合にのみ送信されます(「ヒープ関数」を参照)。
イベント・ハンドラは、特別に使用が許可されているJVM TI関数以外の関数およびJNI関数を使用できません(rawモニター関数、メモリー管理関数、環境ローカル記憶領域関数を参照)。
ライブ段階でしか送信されない
JVMTI_EVENT_OBJECT_FREE
83
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_object_free_events | ガベージ・コレクタがオブジェクトを解放するときにイベントを生成できる。 |
| 名前 | 型 | 説明 |
|---|---|---|
tag | jlong | 解放されるオブジェクトのタグ |
ガベージ・コレクションの開始
ガベージ・コレクションの開始イベントは、ガベージ・コレクションによる一時停止が開始されたとき送信されます。 処理を停止する(stop-the-world)コレクション、つまりすべてのスレッドがJava仮想マシンのステータスの変更を終了している間に収集されるコレクションだけがレポートされます。 このため、コレクタによっては、これらのイベントを生成しません。 このイベントは、VMがまだ停止している間に送信されるので、イベント・ハンドラは、JNI関数、およびJVM TI関数(特別にそのような使用が許可されているものを除く)を使用してはいけません(rawモニター、メモリー管理、および環境ローカル記憶領域関数を参照)。 このイベントは、常にvoid JNICALL GarbageCollectionStart(jvmtiEnv *jvmti_env)
GarbageCollectionFinishと一致するペア(どちらのイベントも有効と見なされる)として送信され、これらの間に、ガベージ・コレクション・イベントは発生しません。
ライブ段階でしか送信されない
JVMTI_EVENT_GARBAGE_COLLECTION_START
81
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_START, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_garbage_collection_events | ガベージ・コレクションの開始または終了時にイベントを生成できる。 |
パラメータ
なし
ガベージ・コレクションの完了
ガベージ・コレクションの終了イベントは、ガベージ・コレクションによる一時停止が終了したとき送信されます。 このイベントは、VMがまだ停止している間に送信されるので、イベント・ハンドラは、JNI関数、およびJVM TI関数(特別にそのような使用が許可されているものを除く)を使用してはいけません(rawモニター、メモリー管理、および環境ローカル記憶領域関数を参照)。 一部のエージェントは、許可されていないJVM TIまたはJNI関数を使用する必要のある、ガベージ・コレクション後の操作を行う必要があります。 そのような場合、rawモニターで待機するエージェント・スレッドを作成でき、ガベージ・コレクションの終了イベントでは、単にrawモニターに通知します。 このイベントは、常にvoid JNICALL GarbageCollectionFinish(jvmtiEnv *jvmti_env)
GarbageCollectionStartと一致するペア(どちらのイベントも有効と見なされる)として送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_GARBAGE_COLLECTION_FINISH
82
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL)
1.0
| 権限 | 効果 |
|---|---|
can_generate_garbage_collection_events | ガベージ・コレクションの開始または終了時にイベントを生成できる。 |
パラメータ
なし
定数の索引
JVMTI_CLASS_STATUS_ARRAY
JVMTI_CLASS_STATUS_ERROR
JVMTI_CLASS_STATUS_INITIALIZED
JVMTI_CLASS_STATUS_PREPARED
JVMTI_CLASS_STATUS_PRIMITIVE
JVMTI_CLASS_STATUS_VERIFIED
JVMTI_DISABLE
JVMTI_ENABLE
JVMTI_HEAP_FILTER_CLASS_TAGGED
JVMTI_HEAP_FILTER_CLASS_UNTAGGED
JVMTI_HEAP_FILTER_TAGGED
JVMTI_HEAP_FILTER_UNTAGGED
JVMTI_HEAP_OBJECT_EITHER
JVMTI_HEAP_OBJECT_TAGGED
JVMTI_HEAP_OBJECT_UNTAGGED
JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT
JVMTI_HEAP_REFERENCE_CLASS
JVMTI_HEAP_REFERENCE_CLASS_LOADER
JVMTI_HEAP_REFERENCE_CONSTANT_POOL
JVMTI_HEAP_REFERENCE_FIELD
JVMTI_HEAP_REFERENCE_INTERFACE
JVMTI_HEAP_REFERENCE_JNI_GLOBAL
JVMTI_HEAP_REFERENCE_JNI_LOCAL
JVMTI_HEAP_REFERENCE_MONITOR
JVMTI_HEAP_REFERENCE_OTHER
JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN
JVMTI_HEAP_REFERENCE_SIGNERS
JVMTI_HEAP_REFERENCE_STACK_LOCAL
JVMTI_HEAP_REFERENCE_STATIC_FIELD
JVMTI_HEAP_REFERENCE_SUPERCLASS
JVMTI_HEAP_REFERENCE_SYSTEM_CLASS
JVMTI_HEAP_REFERENCE_THREAD
JVMTI_HEAP_ROOT_JNI_GLOBAL
JVMTI_HEAP_ROOT_JNI_LOCAL
JVMTI_HEAP_ROOT_MONITOR
JVMTI_HEAP_ROOT_OTHER
JVMTI_HEAP_ROOT_STACK_LOCAL
JVMTI_HEAP_ROOT_SYSTEM_CLASS
JVMTI_HEAP_ROOT_THREAD
JVMTI_ITERATION_ABORT
JVMTI_ITERATION_CONTINUE
JVMTI_ITERATION_IGNORE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_MASK
JVMTI_JAVA_LANG_THREAD_STATE_NEW
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING
JVMTI_JAVA_LANG_THREAD_STATE_WAITING
JVMTI_JLOCATION_JVMBCI
JVMTI_JLOCATION_MACHINEPC
JVMTI_JLOCATION_OTHER
JVMTI_KIND_ALLOC_ALLOC_BUF
JVMTI_KIND_ALLOC_BUF
JVMTI_KIND_IN
JVMTI_KIND_IN_BUF
JVMTI_KIND_IN_PTR
JVMTI_KIND_OUT
JVMTI_KIND_OUT_BUF
JVMTI_PHASE_DEAD
JVMTI_PHASE_LIVE
JVMTI_PHASE_ONLOAD
JVMTI_PHASE_PRIMORDIAL
JVMTI_PHASE_START
JVMTI_PRIMITIVE_TYPE_BOOLEAN
JVMTI_PRIMITIVE_TYPE_BYTE
JVMTI_PRIMITIVE_TYPE_CHAR
JVMTI_PRIMITIVE_TYPE_DOUBLE
JVMTI_PRIMITIVE_TYPE_FLOAT
JVMTI_PRIMITIVE_TYPE_INT
JVMTI_PRIMITIVE_TYPE_LONG
JVMTI_PRIMITIVE_TYPE_SHORT
JVMTI_REFERENCE_ARRAY_ELEMENT
JVMTI_REFERENCE_CLASS
JVMTI_REFERENCE_CLASS_LOADER
JVMTI_REFERENCE_CONSTANT_POOL
JVMTI_REFERENCE_FIELD
JVMTI_REFERENCE_INTERFACE
JVMTI_REFERENCE_PROTECTION_DOMAIN
JVMTI_REFERENCE_SIGNERS
JVMTI_REFERENCE_STATIC_FIELD
JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR
JVMTI_RESOURCE_EXHAUSTED_THREADS
JVMTI_THREAD_MAX_PRIORITY
JVMTI_THREAD_MIN_PRIORITY
JVMTI_THREAD_NORM_PRIORITY
JVMTI_THREAD_STATE_ALIVE
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
JVMTI_THREAD_STATE_IN_NATIVE
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
JVMTI_THREAD_STATE_INTERRUPTED
JVMTI_THREAD_STATE_PARKED
JVMTI_THREAD_STATE_RUNNABLE
JVMTI_THREAD_STATE_SLEEPING
JVMTI_THREAD_STATE_SUSPENDED
JVMTI_THREAD_STATE_TERMINATED
JVMTI_THREAD_STATE_VENDOR_1
JVMTI_THREAD_STATE_VENDOR_2
JVMTI_THREAD_STATE_VENDOR_3
JVMTI_THREAD_STATE_WAITING
JVMTI_THREAD_STATE_WAITING_INDEFINITELY
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
JVMTI_TIMER_ELAPSED
JVMTI_TIMER_TOTAL_CPU
JVMTI_TIMER_USER_CPU
JVMTI_TYPE_CCHAR
JVMTI_TYPE_CVOID
JVMTI_TYPE_JBOOLEAN
JVMTI_TYPE_JBYTE
JVMTI_TYPE_JCHAR
JVMTI_TYPE_JCLASS
JVMTI_TYPE_JDOUBLE
JVMTI_TYPE_JFIELDID
JVMTI_TYPE_JFLOAT
JVMTI_TYPE_JINT
JVMTI_TYPE_JLONG
JVMTI_TYPE_JMETHODID
JVMTI_TYPE_JNIENV
JVMTI_TYPE_JOBJECT
JVMTI_TYPE_JSHORT
JVMTI_TYPE_JTHREAD
JVMTI_TYPE_JVALUE
JVMTI_VERBOSE_CLASS
JVMTI_VERBOSE_GC
JVMTI_VERBOSE_JNI
JVMTI_VERBOSE_OTHER
JVMTI_VERSION_INTERFACE_JNI
JVMTI_VERSION_INTERFACE_JVMTI
JVMTI_VERSION_MASK_INTERFACE_TYPE
JVMTI_VERSION_MASK_MAJOR
JVMTI_VERSION_MASK_MICRO
JVMTI_VERSION_MASK_MINOR
JVMTI_VERSION_SHIFT_MAJOR
JVMTI_VERSION_SHIFT_MICRO
JVMTI_VERSION_SHIFT_MINOR
JVMTI_VISIT_ABORT
JVMTI_VISIT_OBJECTS
変更履歴
最終更新日: 09/05/07バージョン: 21.0.0 JVM TI仕様は発展中のドキュメントであり、メジャー、マイナー、マイクロの各バージョン番号を持ちます。 リリース版の仕様はメジャー・バージョンとマイナー・バージョンで一意に識別されます。 この仕様に含まれる関数、イベント、権限には「導入されたバージョン」値が示されていますが、これは、その機能が導入されたメジャー・バージョンとマイナー・バージョンです。 VMが実装する仕様のバージョンを実行時に取得するには、
GetVersionNumber関数を使用します。
| 「バージョン」 Date | Changes |
|---|---|
| 2002年11月14日 | XML文書に変換。 |
| 2002年11月14日 | ヒープ・ダンプ関数の記述に誤りがあったため、一時的に内容を削除。 |
| 2002年11月18日 | 詳しいスループットを追加。 |
| 2002年11月18日 | JVMTI_THREAD_STATUS_RUNNINGをJVMTI_THREAD_STATUS_RUNNABLEに変更。 |
| 2002年11月19日 | AsyncGetStackTraceを追加。 |
| 2002年11月19日 | GetStackTraceの戻り値jframeIDを追加。 |
| 2002年11月19日 | GetCurrentFrame関数とGetCallingFrame関数の記述にGetStackTraceと重複する点があったため、一時的に内容を削除。 |
| 2002年11月19日 | 重複したClearAllBreakpointsを削除。 |
| 2002年11月19日 | GetSystemPropertiesを追加。 |
| 2002年11月19日 | スレッド・ローカルな記憶領域関数がjthreadを使用するように変更。 |
| 2002年11月20日 | GetJLocationFormatを追加。 |
| 2002年11月22日 | イベントと概要のテキストを追加。 |
| 2002年11月22日 | 型と定数の定義のクロス・リファレンスを追加。 |
| 2002年11月24日 | DTDを追加。 |
| 2002年11月24日 | 権限関数のセクションを追加。 |
| 2002年11月29日 | 各関数およびイベントに権限を割当て。 |
| 2002年11月29日 | JNI遮断関数を追加。 |
| 2002年11月30日 | SetEventNotificationMode権限を自動生成。 |
| 2002年11月30日 |
VMObjectAllocイベントを追加。
|
| 2002年11月30日 |
DynamicCodeGeneratedイベントを追加。
|
| 2002年11月30日 | 宣言の定数を追加。 |
| 2002年11月30日 | メソッドの終了とフレーム・ポップが例外を送信するように変更。 |
| 2002年12月1日 | ForceGarbageCollectionを追加。 |
| 2002年12月2日 | Xrunセクションの改訂: GetStackTraceの説明をわかりやすく変更し、例を追加。幅の問題を修正。「エージェント」を矛盾なく使用。 |
| 2002年12月8日 | 以前の概要情報を削除。 「JVM TI環境」セクションを追加。 |
| 2002年12月8日 |
DisposeEnvironmentを追加します。
|
| 2002年12月9日 | 多数の細かい更新。 |
| 2002年12月15日 | ヒープ・プロファイリング関数を追加: 注釈の取得/設定、ライブ・オブジェクト/ヒープの反復処理。 ヒープ・プロファイリング関数のプレースホルダーを追加: ヒープ・ルート。 ヒープ・プロファイリング・イベントを追加: オブジェクトの解放。 ヒープ・プロファイリング・イベントを再設計: VMオブジェクト割当て。 ヒープ・プロファイリング・イベントのプレースホルダーを追加: ガベージ・コレクションの開始/終了。 ネイティブ・メソッド・バインド・イベントを追加。 |
| 2002年12月19日 | 関数の中断/再開の説明を改訂。 jvmdiタグ付きの元の情報を追加。 その他の修正。 |
| 2002年12月24日 | 型にセマンティックスを追加。 |
| 2002年12月27日 | ローカル参照のセクションを追加。 型からパラメータの説明を自動生成。 |
| 2002年12月28日 | RunAgentThreadがthreadStartを送信することを文書化。 |
| 2002年12月29日 | 重複したローカル参照と割当て解除の警告を削除。 GetRawMonitorNameを割当て済みバッファに変換。 GenerateEventsを追加。 |
| 2002年12月30日 | rawモニターを型に変更し、名前をjrawMonitorIDに変更。 |
| 2003年1月1日 | 元の情報を追加。 JVMDIの問題の参照を整理。 Deallocateの警告が自動生成されるようになったので削除。 |
| 2003年1月2日 | jthreadの表現の問題を修正。 |
| 2003年1月3日 | 権限を64ビットにバッファ・アウト(自動処理)。 |
| 2003年1月4日 | 列挙の定数を列挙型に変更。 パラメータは列挙型。 型のセクションを整理し、索引を作成。 残っているデータ定義エンティティをコールバックで置換え。 |
| 2003年1月7日 | GenerateEventsの説明を修正。 より多くの内部セマンティックスを有効化。 |
| 2003年1月9日 | 以前のGetSystemPropertiesを、固定情報ではなく割り当てられた情報を使用する2つの関数で置換え。 SetSystemPropertyを追加。 より多くの内部セマンティックスを有効化。 |
| 2003年1月12日 | SetEventNotificationModeの末尾に可変引数を追加。 |
| 2003年1月20日 | 割当てサイズがjlongであることを反映するように仕様を修正。 |
| 2003年1月22日 | RunAgentThreadの引数としてNULLを許可。 |
| 2003年1月22日 | 標準命名規則Removed AsyncGetStackTraceの名前を修正。 |
| 2003年1月29日 | jthreadを使用するためGetThreadを削除。 |
| 2003年1月31日 | GetMethodNameと同様にNULLを許可するようにGetFieldNameを変更。 |
| v40 2003年2月29日 | 概要のテキストを書き直し、起動、環境、およびバイト・コード・インストゥルメンテーションに関するセクションを追加。 EGディスカッションに従ってコマンド行引数を変更。 権限のセクションに概要情報を追加。 拡張メカニズムのカテゴリと関数を追加。 SuspendAllThreadsの削除を指定(説明を改訂)。 IterateOverLiveObjectsの名前をIterateOverReachableObjectsに変更し、この変更に応じてテキストも変更。 IterateOverHeapの説明を改訂。 CompiledMethodLoadの説明を改訂。 関数呼出しの必要条件について検討。 SetAllocationHooksの説明を改訂。 全体にわたって「解決予定」として問題を追加。 その他。 |
| v41 2003年3月6日 | GetOwnedMonitorInfoの呼出しから構造体を削除。 大部分のエラー・ドキュメントを自動生成。手書きの(不規則な)エラー・ドキュメントを削除。 権限の使用に関する説明を改善(空の初期セット)。 jintパラメータに最小値を追加。 権限can_access_thread_local_storageを削除。 エラーJVMTI_ERROR_NOT_IMPLEMENTEDをJVMTI_ERROR_MUST_POSSESS_CAPABILITYに名称変更。*NOT_IMPLEMENTEDについても同様。 説明を修正。 |
| v42 2003年3月8日 | GetClassSignatureの名前をGetClassNameに変更。 IterateOverClassObjectsの名前をIterateOverInstancesOfClassに変更。 GetMaxStackを削除(オペランド・スタックはJVM TIでは使用されない)。 説明を修正: 起動時間の定義、PopFrameからのネイティブ・フレーム・ポップの削除、その他の改訂。 |
| v43 2003年3月8日 | 細かい編集上の問題を修正。 |
| v44 2003年3月10日 | 段階の情報を追加。 イベント番号を再マップ(コンパクト化)。 |
| v45 2003年3月11日 | 段階の情報をさらに追加 -「すべて」を許可。 rawモニターの照会およびイベントを削除。 説明の細かい修正。 |
| v46 2003年3月12日 | GetPhaseを追加。 文書全体で「段階」を使用。 GetRawMonitorNameを削除。 GetObjectMonitorsを削除。 |
| v47 2003年3月12日 | リンク、XML、スペル・チェックによる修正。 コールバック構造体を自動生成。 |
| v48 2003年3月13日 | 1文字のXMLを修正。 |
| v49 2003年3月13日 | イベント・パラメータ名と対応するように関数パラメータ名を変更(fooBarBazをfoo_bar_bazに変更)。 |
| v50 2003年3月14日 | 壊れたリンクを修正。 スレッド・マーカーを修正。 |
| v51 2003年3月14日 | コンパイラの問題を回避するため、128より小さくなるように定数を変更。 |
| v52 2003年3月23日 | 権限について全面的に見直し。 GetStackTraceをGetStackTraceとGetStackFramesに分割。 |
| v54 2003年4月8日 | フレームの参照に、jframeIDではなく深さを使用。 不適切になったGetCurrentFrame、GetCallerFrame、およびGetStackFramesを削除。 イベントからフレーム引数を削除。 |
| v55 2003年4月9日 | テストではバッファ・アプローチがより効率的に表示されるため、GetObjectWithAnnotationを削除します。 GetObjectsWithAnnotationsにannotation_countを追加 |
| v56 2003年4月10日 | GetObjectsWithAnnotationsに挿入されたあいまいな記述を削除 |
| v58 2003年4月13日 | メソッドのjclass/jmethodIDという表現を単なるjmethodIDで置換え。すべてのイベントの第1引数としてJvmtiEnv*を渡す。不適切な箇所からJNIEnv*を削除。 can_access_framesをcan_access_local_variablesで置換え。純粋なスタック・アクセスから削除。 can_get_synthetic_attributeを使用。説明を修正。 長さゼロの配列は割当て解除する必要があることを明記。 RelinquishCapabilitiesの説明を明確化。 JVMTI_ERROR_VM_DEADをJVMTI_ERROR_WRONG_PHASEに一般化。 |
| v59 2003年4月27日 | OBSOLETE_METHOD_IDの不要な間接参照を削除。 |
| v60 2003年5月4日 | OnLoad時のDestroyRawMonitorを許可。 |
| v61 2003年5月7日 | DestroyRawMonitorにモニターの所有者でない場合に返されるエラーを追加。 |
| v62 2003年5月13日 |
rawモニターのセマンティックスを改訂。 GetThreadStatusのフラグを変更。 GetClassLoaderは、ブートストラップ・クラス・ローダーの場合NULLを返す。 GetClassNameの問題を追加。 局所変数シグニチャを定義。 GetObjectsWithAnnotationsの注釈配列内のゼロを禁止。 GetObjectsWithAnnotationsの仕様を削除。 SetAllocationHooksを削除します。 SuspendAllThreadsを削除します。
|
| v63 2003年5月14日 |
データ型jvmtiEventCallbacksを定義。 ゼロ長の割当てはNULLを返す。 SetAllocationHooksはJVMDIでは保持されるがJVM TIからは削除。 JVMTI_THREAD_STATUS_FLAG_INTERRUPTEDを追加。
|
| v64 2003年5月15日 | レビューにより表現を変更。 |
| v65 2003年5月15日 | 最初のアルファ版。 jmethodIDとjfieldIDを一意に変更。jclassは使用しない。 |
| v66 2003年5月27日 | 細かいXSLTエラーを修正。 |
| v67 2003年6月13日 | jfieldIDの一意化を取り消し(jmethodIDはそのまま)。 |
| v68 2003年6月17日 | 6月11日のExpert Groupミーティングによる変更 -- ヒープ関数の見直し: シングル・コールバック、GetHeapRootsの削除、到達可能なイテレータの追加、「注釈」の名前を「タグ」に変更。 ほとんどの関数で、NULLスレッド・パラメータは現在のスレッド。 タイマーを追加。 ForceExitを削除。 GetEnvironmentLocalStorageを追加。 冗長フラグおよびイベントを追加。 AddToBootstrapClassLoaderSearchを追加。 ClassFileLoadHookを更新。 |
| v69 2003年6月18日 | 問題点のセクションを改訂。 GetClassNameの名前をGetClassSignatureに戻し、説明を修正。 GetClassSignature、GetFieldSignature、GetMethodSignature、およびGetLocalVariableTableにジェネリック・シグニチャを追加。 EstimateCostOfCapabilitiesを削除。 システム・プロパティ関数がシステム・プロパティのVMビューで動作することを明示。 Agent_OnLoadの説明を改訂。 イベントのJNIEnv*から定数を削除。 メタデータ・アクセサを追加。 |
| v70 2003年6月18日 | GetStackTraceにstart_depthを追加。 システム・プロパティを新しいカテゴリに移動。 GetObjectSizeを追加。 コマンド行フラグからXを削除。 XML、HTML、スペル・チェックによる修正。 |
| v71 2003年6月19日 | JVMTI_HEAP_ROOT_THREADを6に修正。 各説明が関数名に一致するように変更。 あいまいな表現を修正。 |
| v72 2003年6月26日 | SetThreadLocalStorageとSetEnvironmentLocalStorageでは、値をNULLに設定できなければならない。 NotifyFramePop、GetFrameLocationm、およびフレームについて記述する必要があるすべての局所変数の操作を修正。 全体にわたって、文法を修正し、説明を明瞭化する必要がある。 大文字と小文字の区別、および句読点に一貫性を持たせる必要がある。 マイクロ・バージョン番号と、メジャー、マイナー、およびマイクロ・バージョン番号にアクセスするマスクが必要。 エラー・コード・リストに、実装によって返されるエラー・コードを示す必要がある。 コマンド行プロパティをプロパティ関数内で可視にする必要がある。 現在のスレッドからのポップを禁止。 ポップできないとき、実装が不透明なフレーム・エラーを返すことを許可。 NativeMethodBindイベントは、どの段階でも送信できなければならない。 DynamicCodeGeneratedイベントは、どの段階でも送信できなければならない。 VMInitの前に、次の関数の実行が許可されなければならない: Set/GetEnvironmentLocalStorage GetMethodDeclaringClass GetClassSignature GetClassModifiers IsInterface IsArrayClass GetMethodName GetMethodModifiers GetMaxLocals GetArgumentsSize GetLineNumberTable GetMethodLocation IsMethodNative IsMethodSynthetic。 XSLに対するその他の変更: 引数の説明で、ポインタの前ではなく後ろにアスタリスクを表示する必要がある。 NotifyFramePop、GetFrameLocationm、およびその他の局所変数の操作にNO_MORE_FRAMESエラーを追加する必要がある。 活動状態でないスレッドは、無効なスレッドとは異なったエラーを返す必要がある。 |
| v73 2003年7月7日 | VerboseOutputイベントがメッセージ・パラメータを検出しなかった。 細かい修正。 |
| v74 2003年7月14日 | Technical Publications Departmentによる修正。 スレッド・ローカルおよび環境ローカルな記憶領域にNULLを設定することを許可。 |
| v75 2003年7月23日 | オーバーロードされたJVM_OnLoadの代わりに新しいAgent_OnLoadを使用。 コールバックにJNICALLを追加(XSL)。 イベントとコールバックの両方についてJNICALLの要件を文書化(XSL)。 RedefineClassesをメソッドと属性に限定。 VerboseOutputイベントを削除。 VMObjectAlloc: イベント送信時に制限し、メソッド・パラメータを削除。 Tech Pubsによる編集に対する対応を完了。 |
| v76 2003年7月24日 | ClassFileLoadHookイベントが再定義のブール型ではなくクラスを送信するように変更。 |
| v77 2003年7月24日 | XMLファイル。 テキストの細かい部分の改訂と修正。 |
| v78 2003年7月24日 | JVM TIからGetExceptionHandlerTableとGetThrownExceptionsを削除。 スタック・フレームがJVM仕様のフレームであることを明記。 can_get_source_infoをcan_get_source_file_name、can_get_line_numbers、およびcan_get_source_debug_extensionに分割。 PopFrameはネイティブ呼出しメソッドを持つことができない。 GetClassloaderClassesから正確でない記述を削除(Java™仮想マシン仕様のセクション4.4を参照)。 |
| v79 2003年7月24日 | XMLおよびテキストを修正。 スタック・フレームの説明をスタック・フレーム・カテゴリに移動。 |
| v80 2003年7月26日 | GetClassloaderClassesにNULL (ブートストラップ・ローダー)を許可。 クラスからの参照に新しいヒープ参照の種類を追加。 タイマー情報の構造体とクエリー関数を追加。 AvailableProcessorsを追加。 GetOtherThreadCpuTimeの名前をGetThreadCpuTimeに変更。 SetEventNotificationモードにJVMTI_ERROR_INVALID_THREADとJVMTI_ERROR_THREAD_NOT_ALIVEを明示的に追加。 VM_INITイベントに初期スレッドを追加。 AddToBootstrapClassLoaderSearchからプラットフォームの仮定条件を削除。 |
| v81 2003年7月26日 | レビューにより、文法と表現を変更。 |
| v82 2003年7月27日 | レビューにより、文法と表現をさらに変更。 Agent_OnUnloadを追加。 |
| v83 2003年7月28日 | Agent_OnUnloadの戻り型をvoidに変更。 |
| v84 2003年7月28日 | JVMTI_REFERENCE_ARRAYの名前をJVMTI_REFERENCE_ARRAY_ELEMENTに変更。 |
| v85 2003年7月28日 | AvailableProcessors()のjava.lang.Runtime.availableProcessors()の表現を借用。 イベントIDがゼロにならないことを保証。 解決された問題を削除。 レビューにより、タイマー情報関数の名前を変更、説明を補足。 |
| v86 2003年7月29日 | XMLで制御される実装に対して、仕様に影響のない変更を追加: SetThreadLocalStorageはVMモードで実行する必要がある。 |
| 0.1.87 5 2003年8月 | GetErrorNameを追加。 jvmtiExtensionEventに可変引数の警告を追加。 jvmtiExtensionEventのjvmtiEnv*から定数を削除。 使用されないcan_get_exception_info権限を削除。 jvmtiStartFunctionにjvmtiEnv*とJNIEnv*を渡す。 jvmtiExtensionFunctionInfo.funcの宣言型を修正。 拡張関数はエラー・コードを返す。 バージョン番号付け方式を新規化。 |
| 0.2.88 5 2003年8月 | ClassUnloadイベントを削除。 |
| 0.2.89 8 2003年8月 | ヒープ参照イテレータのコールバックは、出力オブジェクト参照の無視を許可する列挙型を返す。 JNIEnvを拡張イベント/拡張関数のパラメータ型として許可。 |
| 0.2.90 15 2003年8月 | タイプ・ミスを修正。 |
| 0.2.91 2 2003年9月 | すべてのメタデータ関数を削除: GetClassMetadata、GetFieldMetadata、およびGetMethodMetadata。 |
| 0.2.92 1 2003年10月 | 関数Allocateにマーク付け。 Deallocate、RawMonitor*、SetEnvironmentLocalStorage、およびGetEnvironmentLocalStorageをヒープ・コールバックおよびGCイベント内で安全に使用できるものとする。 |
| 0.2.93 24 2003年11月 | ヒープ反復関数およびコールバックにパススルーが不透明なユーザー・データ・ポインタを追加。 CompiledMethodUnloadイベントで、コード・アドレスを送信する。 GarbageCollectionOccurredイベントを追加。 定数プール参照の種類を追加。 関数CreateRawMonitorおよびDestroyRawMonitorをヒープ・コールバックおよびGCイベント内で安全に使用できるものとする。 説明を改訂: VMDeath、GetCurrentThreadCpuTimerInfo、GetThreadCpuTimerInfo、IterateOverReachableObjects、IterateOverObjectsReachableFromObject、GetTime、およびJVMTI_ERROR_NULL_POINTER。 欠落していたエラーを追加: GenerateEventsおよびAddToBootstrapClassLoaderSearch。 ClassFileLoadHook名前パラメータの説明を修正。 ヒープ・コールバックおよびGC/ObjectFreeイベント内で、明示的に許可された関数しか呼び出せないように指定。 コールバック中、GetCurrentThreadCpuTimerInfo、GetCurrentThreadCpuTime、GetTimerInfo、およびGetTimeを許可。 OnLoad段階でのSetTag/GetTagの呼出しを許可。 SetEventNotificationModeに追加: 不適切なスレッド・レベルでの制御を試行した場合のエラー。 jvmtiExceptionHandlerEntryを削除。 スタックのネイティブ・メソッドの処理を修正 -- GetFrameLocationのlocation_ptrパラメータ、GetFrameLocation、jvmtiFrameInfo.location、およびjlocationからJVMTI_ERROR_OPAQUE_FRAMEを削除。 スリープ時にMonitorWaitedイベントが送信されるという意味になってしまっているタイプ・ミスを削除(JVMPIより)。 |
| 0.2.94 25 2003年11月 | 説明の改訂とタイプ・ミスの修正。 |
| 0.2.95 3 2003年12月 | ヒープ・イテレータでのNULL user_dataを許可。 |
| 0.2.97 28 2004年1月 | GetThreadStateを追加し、GetThreadStatusを非推奨にする。 |
| 0.2.98 29 2004年1月 | INVALID_SLOTおよびTYPE_MISMATCHエラーはオプションにしなければならない。 |
| 0.2.102 12 2004年2月 | MonitorContendedExitを削除。 JNIEnvパラメータをVMObjectAllocに追加。 ヒープ・コールバックのclass_tagおよびreferrer_indexパラメータを明示的に定義。 |
| 0.2.103 16 2004年2月 | JAVA_TOOL_OPTIONSのドキュメント化。 |
| 0.2.105 17 2004年2月 | 開始段階を初期段階と開始段階とに分割。 関数やイベントのVMStartイベント変更段階関連を追加。 |
| 0.3.6 18 2004年2月 | 非推奨になっていたGetThreadStatusを削除。 マイナー・バージョンを上げ、マイクロ・バージョンから100を引く |
| 0.3.7 18 2004年2月 | タイマーのナノ秒値が符号なしであることをドキュメント化。 ネイティブ・メソッドに関連するテキストを改訂。 |
| 0.3.8 19 2004年2月 | タイプ・ミスを修正。 削除した非推奨のGetThreadStatusを削除。 |
| 0.3.9 23 2004年2月 | 中断したスレッドでNotifyFramePopを実行しなければならない。 |
| 0.3.10 24 2004年2月 |
一部のクラスを変更できないように、権限(can_redefine_any_classおよびcan_generate_all_class_hook_events)およびエラー(JVMTI_ERROR_UNMODIFIABLE_CLASS)を追加。
|
| 0.3.11 28 2004年2月 | JVMTI_ERROR_MUST_POSSESS_CAPABILITYをSetEventNotificationModeに追加。 |
| 0.3.12 8 2004年3月 | CompiledMethodUnloadを明確にし、クラスのアンロード後にイベントがポストされる場合があることを明示。 |
| 0.3.13 5 2004年3月 | VMObjectAllocのsizeパラメータをjlongに変更し、GetObjectSizeに合わせる。 |
| 0.3.14 13 2004年3月 | JNI FindClass関数をイベント・コールバック関数で使用するためのガイドラインを追加。 |
| 0.3.15 15 2004年3月 | GetAllStackTracesおよびGetThreadListStackTracesを追加。 |
| 0.3.16 19 2004年3月 | ClassLoadおよびClassPrepareイベントは、開始段階中にポストできる。 |
| 0.3.17 25 2004年3月 | JVMTI_ERROR_NATIVE_METHODをGetLineNumberTable、GetLocalVariableTable、GetMaxLocals、GetArgumentsSize、GetMethodLocation、GetBytecodesに追加。 |
| 0.3.18 29 2004年3月 | タイマー情報構造体のタイマーの種類を返す。 |
| 0.3.19 31 2004年3月 | 仕様の明確化: JVMTI_THREAD_STATE_IN_NATIVEにはJNIまたはJVM TIを含まない。 ForceGarbageCollectionはファイナライザを実行しない。 仕様のコンテキストはJavaプラットフォーム。 以前のインストゥルメンテーションを警告。 |
| 0.3.20 1 2004年4月 | 上記で明確化した箇所の改善、およびAgent_OnLoadが返したエラーでVMが終了する。 |
| 0.3.21 1 2004年4月 | 配列クラスの作成では、クラス・ロード・イベントは生成されません。 |
| 0.3.22 7 2004年4月 | スレッド状態の階層をよりjava.lang.Thread.Stateにそろえる。 |
| 0.3.23 12 2004年4月 | スレッド状態について明確にした。 |
| 0.3.24 19 2004年4月 | エージェントによって実行できるため、GarbageCollectionOccurredイベントを削除。 |
| 0.3.25 22 2004年4月 | 「コマンド行オプション」を定義。 |
| 0.3.26 29 2004年4月 | バイト・コード・インストゥルメンテーションの意図された使用方法を記述。 拡張イベントの第1パラメータの説明を修正。 |
| 0.3.27 30 2004年4月 | 説明の改訂とタイプ・ミスの修正。 |
| 0.3.28 18 2004年5月 | DataDumpRequestイベントを削除。 |
| 0.3.29 18 2004年5月 | ゼロ・タイムアウトのRawMonitorWaitを明確化。 RunAgentThreadのあとのスレッド状態を明確化。 |
| 0.3.30 24 2004年5月 | クリーンアップ: 誤ったリンクや古いリンクの修正など。 |
| 0.3.31 30 2004年5月 | 以下を含む明確化: すべての文字列が修正UTF-8。 エージェント・スレッドの可視性。 廃止メソッド・バージョンの意味。 スレッド呼出ヒープのコールバック |
| 1.0.32 1 2004年6月 | major.minorバージョン番号を"1.0"に変更。 |
| 1.0.33 2 2004年6月 | ForceGarbageCollectionとObjectFreeの相互作用を明確化。 |
| 1.0.34 6 2004年6月 | AddToBootstrapClassLoaderSearchとSetSystemPropertyをOnLoadフェーズのみに制限。 |
| 1.0.35 11 2004年6月 | SetTagのタイプ・ミスを修正。 |
| 1.0.36 18 2004年6月 | 商標を修正。 GetThreadStateの使用法の例にパラメータを追加。 |
| 1.0.37 4 2004年8月 | 著作権の更新。 |
| 1.0.38 5 2004年11月 | 欠落していた関数テーブル・レイアウトを追加。 欠落していた、関数のC++メンバー関数形式の説明を追加。 CFLHの名前がNULLになる可能性があることを明確化。 J2SETM 5.0の一部としてリリース。 |
| 1.1.47 24 2005年4月 | major.minorバージョン番号を"1.1"に変更。 ForceEarlyReturn*関数群を追加。 GetOwnedMonitorStackDepthInfo関数を追加。 GetCurrentThread関数を追加。 「導入されたバージョン」というバージョン・マーカーを追加。 AddToSystemClassLoaderSearchを追加。 AddToBootstrapClassLoaderSearchのライブ段階での使用を許可。 IterateOverHeapおよびIterateOverInstancesOfClass関数のheap_object_callbackパラメータの説明に含まれていた歴史的な不要情報を整理。このパラメータでのNULLの使用を禁止。 明確化、修正、一貫性の向上: PopFrameでの現在のスレッド、不透明なフレーム、および不十分な数のフレームに関する表現。 「最上位」ではなく「現在のフレーム」を一貫して使用。 GetLocal*およびSetLocal*でのJVMTI_ERROR_TYPE_MISMATCHエラーを明確化するため、それらをForceEarlyReturn*での記述と互換性のあるものに変更。 他の多くの明確化や表現のクリーン・アップ。 |
| 1.1.48 25 2005年4月 | GetConstantPoolの追加。 VM仕様の第1版への参照を第2版への参照に切替え。 |
| 1.1.49 26 2005年4月 | GetConstantPoolでのマイナー/メジャー・バージョンの順番を明確化。 |
| 1.1.50 26 2005年4月 | SetNativeMethodPrefixとSetNativeMethodPrefixesの追加。 GetOwnedMonitorStackDepthInfoを位置153に再割当て。 「クラス・ローダー検索」を独立したドキュメント・カテゴリとして分離。 XMLソース内の長すぎる行を処理。 |
| 1.1.51 29 2005年4月 | ライブ段階でのエージェントの起動を許可。 エージェントの配備に関する段落を追加。 |
| 1.1.52 30 2005年4月 | SetNativeMethodPrefix(es)に仕様の説明を追加。 GetConstantPoolの条件の定義を改善。 |
| 1.1.53 30 2005年4月 | GetConstantPoolからGetClassVersionNumber関数を分離。 VM仕様への参照をクリーンアップ。 |
| 1.1.54 1 2005年5月 | SetNativeMethodPrefix(es)の使用を任意の段階で許可。 GetConstantPoolへの再定義の影響に関する説明を追加。 |
| 1.1.56 2 2005年5月 | SetNativeMethodPrefix(es)に関するさまざまな明確化。 |
| 1.1.57 2 2005年5月 | 欠落していたパフォーマンス警告をメソッド・エントリ・イベントに追加。 |
| 1.1.58 5 2005年5月 | 内部的なJVMDIサポートを削除。 |
| 1.1.59 8 2005年5月 |
RetransformClassesを追加します。 バイト・コード・インストゥルメンテーションのドキュメントを再編。 IsMethodObsoleteがcan_redefine_classes権限を必要としないという記述に変更。
|
| 1.1.63 11 2005年5月 | 再変換の明確化。 |
| 1.1.64 11 2005年5月 | レビューに基づく再変換の明確化。 クラス・ロード有効時の「再変換可能(不可能)」を固定。 |
| 1.1.67 4 2005年6月 | プリミティブ値の報告をサポートし、参照側のタグ設定を可能にし、より強力なフィルタ・リング機能を備えた、新しいヒープ機能を追加: FollowReferences、IterateThroughHeap、およびそれらに関連するコールバック、構造体、列挙、および定数。 |
| 1.1.68 4 2005年6月 | 明確化。 |
| 1.1.69 6 2005年6月 | FollowReferences、IterateThroughHeap: コールバックを構造体内に配置、欠落していたエラー・コードを追加、ビジット制御フラグのビットを低減。 |
| 1.1.70 14 2005年6月 | 新ヒープ機能に関する追加作業: レビューに基づく仕様の整理。 |
| 1.1.71 15 2005年6月 | 新ヒープ機能に関する追加作業: 旧ヒープ・セクションの名前を「ヒープ(1.0)」に変更。 |
| 1.1.72 21 2005年6月 | タイプ・ミスを修正。 |
| 1.1.73 27 2005年6月 | 参照側情報構造体を共用体に変更。 |
| 1.1.74 9 2005年9月 | 新規ヒープ関数群: 欠落していた参照の種類「スーパー・クラス」を追加。 フィールド・インデックスの計算に単一の方式を使用。 古くなった構造体ベース参照側情報への参照を削除。 |
| 1.1.75 12 2005年9月 | FollowReferences中に、あまり重要でないjava.lang.Objectスーパー・クラス上でコールバックを発生させない。 |
| 1.1.76 13 2005年9月 | 文字列プリミティブ・コールバックで、長さをUnicode長に変更。 配列プリミティブ・コールバックと文字列プリミティブ・コールバックで、値を「const」に変更。 JNI関数テーブルの設定時のコンパイラの潜在的な影響についての注を追加。 |
| 1.1.77 13 2005年9月 | GetClassVersionNumbers()とGetConstantPool()は、配列またはプリミティブ・クラスの場合にエラーを返すようにする。 |
| 1.1.78 14 2005年9月 | 文法に関する修正。 |
| 1.1.79 26 2005年9月 | IsModifiableClassクエリーを追加。 |
| 1.1.81 9 2006年2月 | jvmtiHeapReferenceCallbackにreferrer_class_tagパラメータを追加。 |
| 1.1.82 13 2006年2月 | ドキュメント修正: can_redefine_any_classに再変換が含まれるように更新。 例外イベントがすべてのThrowableをカバーすることを明記。 GetStackTraceでstart_depthがゼロの場合、大きすぎるstart_depthのテストが行われない。プリミティブ・フィールド・コールバックで報告されるフィールドを明確化 -- staticとインスタンス。 わかりにくいヒープの型の名前を、コールバック名も含めて修正。 スレッド起動メソッドのインタフェースで、スタックの深さの一貫した使用を要求。 JVM TIのメモリー管理が他のシステムと非互換であることを述べたノートを追加。 |
| 1.1.85 14 2006年2月 | タイプ・ミスの修正、名前の変更。 |
| 1.1.86 13 2006年3月 | jmethodIDとjfieldIDが保存可能であることを明確化。 「クラスのインスタンスの反復」にサブクラスが含まれることを明確化。 |
| 1.1.87 14 2006年3月 | 表現の修正。 |
| 1.1.88 16 2006年3月 | オブジェクト参照コールバック内のstaticフィールドのreferrer_indexが、リファレンス実装(および他のすべての既知の実装)に一致するように変更。つまり、インスタンス・フィールドの定義に一致するように変更。 GetThreadListStackTracesで、JVMTI_ERROR_INVALID_THREADを追加してリスト内の無効なスレッドをカバーするようにするとともに、起動されていないスレッドからは空のスタックが返されることを規定。 |
| 1.1.89 17 2006年3月 | タイプ・ミス。 |
| 1.1.90 25 2006年3月 | タイプ・ミス。 |
| 1.1.91 6 2006年4月 | AddToBootstrapClassLoaderSearchとAddToSystemClassLoaderSearchに関する制限を削除。 |
| 1.1.93 1 2006年5月 | スタック深さを決定できない実装のモニター・スタックの深さに対して -1を返すように仕様を変更。 |
| 1.1.94 3 2006年5月 | IBMのAlan Pratt氏に従って読みやすさと正確さを高めるための修正を実施。 FollowReferencesで報告されるオブジェクトの関係を記載。 |
| 1.1.95 5 2006年5月 | FollowReferencesで報告されるオブジェクトの関係を明確化。 |
| 1.1.98 28 2006年6月 | DisposeEnvironmentの明確化、警告を追加。 SetLocalXXXでのタイプ・ミスを修正(「retrieve」=>「set」)。 ネイティブ・メソッド接頭辞の使用中は、その接頭辞の設定状態を保つ必要があることを明確化。 エージェントごとに厳密に1つのAgent_OnXXXが呼び出されることを明確化。 ライブラリのロードは起動に依存しないことを明確化。 Agent_OnUnload仕様内でのAgent_OnLoadへのあいまいな参照を削除。 |
| 1.1.99 31 2006年7月 | 関数と例外との相互作用を明確化。 フィールド・インデックスの明確化と具体例の追加。 わかりにくい「つまり(That is)」の文を、MonitorWaitおよびMonitorWaitedイベントから削除。 Java 6をポイントするようにリンクを更新。 |
| 1.1.102 6 2006年8月 | ResourceExhaustedイベントを追加。 |
| 1.2.2 11 2012年10月 | LinkCheckツールから報告された「HTTP」および「Missing Anchor」のエラーを修正。 |
| 1.2.3 19 2013年6月 | 静的リンク・エージェントのサポートを追加。 |
| 9.0.0 13 2016年10月 | モジュールのサポート: メジャー・バージョンは現在9です。 ClassFileLoadHookイベントは、もはや初期段階では送信されません。 開始フェーズでCompiledMethodLoadイベントを許可します。 新しい機能を追加: can_generate_early_vmstart, can_generate_early_class_hook_events. 新しい機能を追加: GetAllModules, AddModuleReads, AddModuleExports, AddModuleOpens, AddModuleUses, AddModuleProvides, IsModifiableModule. can_redefine_any_classes、can_retransform_any_classesおよびIsModifiableClass APIを明確にして、実装で定義された一部のクラスを許可しないようにします。 |
| 9.0.0 12 2017年2月 | GetCurrentThread関数のマイナー・アップデート: can_generate_early_vmstart機能が有効な場合、この関数は開始フェーズでNULLを返すことがあります。 |
| 11.0.0 7 2018年2月 | 新しいクラス・ファイルのNestHost属性およびNestMembers属性のマイナー更新: RedefineClassesおよびRetransformClassesでクラス・ファイルのNestHostおよびNestMembers属性を変更できないことを指定します。RedefineClassesおよびRetransformClassesで返すことができる新しいエラーJVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGEDを追加します。 |
| 11.0.0 15 2018年6月 | 低オーバーヘッド・ヒープ・サンプリングのサポート: 新機能の追加: can_generate_sampled_object_alloc_events. 新しい関数を追加: SetHeapSamplingInterval. 新規イベント・タイプの追加: JVMTI_EVENT_SAMPLED_OBJECT_ALLOC. |
| 13.0.0 20 2019年5月 | キャパシティ"can_redefine_any_class"のマイナー仕様の更新。 次のようになります: "RedefineClassesは、変更可能な任意のクラスでコールできます。" IsModifiableClassを参照してください。(can_redefine_classesも設定する必要があります) |
| 13.0.0 5 2019年6月 | マイナーPopFrame仕様更新: 指定されたスレッドは中断されているか、現在のスレッドである必要があります。 (以前の現在のスレッドになることは許可されていませんでした。) |
| 14.0.0 10 2019年10月 | 新規クラス・ファイル・レコード属性のマイナー更新: RedefineClassesおよびRetransformClassesがクラス・ファイルのRecord属性を変更できないことを指定します。 |
| 15.0.0 13 2020年5月 | 新規クラス・ファイルPermittedSubclasses属性のマイナー更新: RedefineClassesおよびRetransformClassesがクラス・ファイルのPermittedSubclasses属性を変更できないことを指定します。 |
| 17.0.0 15 2021年1月 | Agent_OnAttach/Agent_OnAttach_Lファンクションでエラーが報告された場合、実装がAgent_OnUnloadファンクションをコールしないよう選択した"エージェント停止"セクションでのマイナー説明。 |
| 17.0.0 8 2021年6月 | ヒープ関数1.0を非推奨にするマイナー更新。 |
| 19.0.0 27 2022年4月 | 仮想スレッドのサポート (プレビュー): 新機能の追加: can_support_virtual_threads. 新しい機能を追加: SuspendAllVirtualThreads, ResumeAllVirtualThreads. 新しいイベント・タイプの追加: JVMTI_EVENT_VIRTUAL_THREAD_START, JVMTI_EVENT_VIRTUAL_THREAD_END. 新規エラー・コードを追加: JVMTI_ERROR_UNSUPPORTED_OPERATION. |
| 21.0.0 7 2023年6月 | 仮想スレッドは永続的な機能としてファイナライズされました。 ライブ・フェーズでのエージェントの起動が、警告を出力するように指定されました。 |