JVMTM Tool Interface

バージョン1.2


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)になります。SolarisTMオペレーティング環境の場合、エージェント・ライブラリは共有オブジェクト(.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をロードしようとし、SolarisTMオペレーティング環境の下では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段階でエージェントを起動する場合、そのエージェント・ライブラリは次のプロトタイプを持つ起動関数をエクスポートする必要があります。
JNIEXPORT jint JNICALL 
Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
「L」という名前の静的リンク・エージェントの場合:
JNIEXPORT jint JNICALL 
Agent_OnLoad_L(JavaVM *vm, char *options, void *reserved)
VMは、この関数を呼び出すことでエージェントを起動します。この呼出しはVM初期化の早い段階で行われるため、次のことが言えます。

VMは、Agent_OnLoadまたはAgent_OnLoad_<agent-lib-name>関数を、第2引数に<options>を指定して呼び出します。つまり、コマンド行オプションの例で言えば、Agent_OnLoadchar *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に接続して特定のエージェントの起動を要求する可能性があります。

ライブ段階でエージェントを起動する場合、そのエージェント・ライブラリは次のプロトタイプを持つ起動関数をエクスポートする必要があります。
JNIEXPORT jint JNICALL 
Agent_OnAttach(JavaVM* vm, char *options, void *reserved)
「L」という名前の静的リンク・エージェントの場合:
JNIEXPORT jint JNICALL 
Agent_OnAttach_L(JavaVM* vm, char *options, void *reserved)

VMは、この関数を呼び出すことでエージェントを起動します。これは、VMに接続されたスレッドのコンテキスト内で呼び出されます。第1引数の<vm>は、Java VMです。<options>引数はエージェントに提供される起動オプションです。<options>修正UTF-8 文字列としてエンコードされます。起動オプションが指定されなかった場合は、長さゼロの文字列がoptionsに渡されます。options文字列の存続期間は、Agent_OnAttachまたはAgent_OnAttach_<agent-lib-name>呼出しの間です。この期間を超えて必要な場合は、文字列または文字列の一部をコピーする必要があります。

ライブ段階では権限の一部が使用できない可能性があります。

Agent_OnAttachまたはAgent_OnAttach_<agent-lib-name>関数は、エージェントを初期化し、エラーが発生したかどうかを示す値をVMに返します。ゼロ以外の値はすべて、エラーを表します。エラーが発生してもVMは終了しません。代わりにVMは、そのエラーを無視するか、そのエラーを標準エラーに出力したりシステム・ログに記録したりするなど、何らかの実装固有のアクションを実行します。

エージェントの停止

ライブラリは、オプションで、次のプロトタイプを持つ停止関数をエクスポートできます。
JNIEXPORT void JNICALL 
Agent_OnUnload(JavaVM *vm)
「L」という名前の静的リンク・エージェントの場合:
JNIEXPORT void JNICALL 
Agent_OnUnload_L(JavaVM *vm)
この関数は、ライブラリのアンロードの直前にVMによって呼び出されます。ライブラリは(実行可能ファイルに静的にリンクされたライブラリでないかぎり)アンロードされます。この関数が呼び出されるのは、なんらかのプラットフォーム固有のメカニズムによってアンロードが発生した場合(このドキュメントではアンロード・メカニズムについては規定していない)、あるいはVMの終了(正常終了または起動エラーなどのVMエラーによるもの)によってライブラリが(実質的に)アンロードされる場合です。もちろん、制御されないシャットダウンはこの規則の例外です。この関数と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とおりのうちのいずれかの方法で行います。

このインタフェースに用意されたクラス変更機能は、インストゥルメンテーションのメカニズムを提供し(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を使えば、ラッパー・メソッドによるネイティブ・メソッドの計測が可能となります。

修正UTF-8の文字列エンコーディング

JVM TIは、修正UTF-8を使って文字列をエンコードします。これは、JNIが使用するのと同じエンコーディングです。修正UTF-8と標準のUTF-8との違いは、補助文字とnull文字の表現方法にあります。詳細については、JNI仕様の「変更後のUTF-8文字列」セクションを参照してください。

仕様のコンテキスト

このインタフェースはJava仮想マシンで実行されるアプリケーションの状態にアクセスするため、用語はJavaプラットフォームに関するものであり、特に言及している場合を除いてネイティブ・プラット・フォームに関するものではありません。例を示します。

Sun、Sun Microsystems、Sun のロゴ、Java、および JVM は、米国ならびにその他の国における Oracle Corporation およびその関連会社の登録商標です。


関数

関数のアクセス

ネイティブ・コードは、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環境が作成されます。GetEnvversion引数は、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参照(jobjectjclass)およびそれらの派生物(jthreadjthreadGroup)を使用してオブジェクトを識別します。JVM TI関数に渡す参照はグローバル参照、ローカル参照のどちらでもかまいませんが、強い参照でなければいけません。JVM TI関数から返される参照はすべてローカル参照です。これらのローカル参照はJVM TI呼出し時に作成されます。ローカル参照は、管理が必要なリソースです(JNIドキュメントを参照)。スレッドがネイティブ・コードから復帰する際に、すべてのローカル参照が解放されます。典型的なエージェント・スレッドを含む一部のスレッドは、決してネイティブ・コードから復帰しません。各スレッドは、明示的な管理を一切行わずに16個のローカル参照を作成できることが保証されています。限られた数のJVM TI呼出しを実行した後、ネイティブ・コードから復帰するようなスレッド(イベントを処理するスレッドなど)では、明示的な管理が不要であると判断される場合があります。ただし、長時間実行されるエージェント・スレッドでは、明示的なローカル参照管理が必要になります(通常はJNI関数PushLocalFramePopLocalFrameを使用)。逆に、ネイティブ・コードからの復帰後も参照を維持するには、それらをグローバル参照に変換する必要があります。これらの規則はjmethodIDjfieldIDには適用されません。これらはjobjectではないからです。

関数呼出しの必要条件

関数に、スレッドまたはVMを特定の状態(中断など)にするのはエージェントであると明示的に指定されていないかぎり、関数を実行するためにVMを一定の安全な状態にするのは、JVM TI実装になります。

例外と関数

JVM TI関数から例外がスローされることはありません。エラー状態は関数の戻り値として伝えられます。JVM TI関数が呼び出されている間、既存の例外状態はすべて維持されます。例外の処理については、JNI仕様のJava例外に関するセクションを参照してください。

関数の索引


メモリー管理

メモリー管理関数: これらの関数は、JVM TI機能で使用されるメモリの割当て/割当て解除機能を備えており、エージェント用の作業メモリーを提供するために使用できます。JVM TIで管理されるメモリーは、他のメモリー割当てライブラリやメカニズムとは互換性がありません。


Allocate

jvmtiError
Allocate(jvmtiEnv* env,
            jlong size,
            unsigned char** mem_ptr)
JVM TIのアロケータを使用して、メモリーの領域を割り当てます。割り当てられたメモリーは、Deallocateによって解放してください。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 461.0

権限
必要な機能

パラメータ
名前 説明
sizejlong 割り当てるバイト数。

原理の説明: jlongはJVMDIとの互換性を実現するために使用される。

mem_ptrunsigned char** 戻ったとき、割り当てられたメモリーの先頭を指すポインタ。sizeがゼロの場合、NULLが返される。

エージェントはunsigned char*へのポインタを渡す。戻ったとき、unsigned char*は、サイズsizeの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_OUT_OF_MEMORY メモリー要求を履行できない。
JVMTI_ERROR_ILLEGAL_ARGUMENT sizeがゼロより小さい。
JVMTI_ERROR_NULL_POINTER mem_ptrNULL

Deallocate

jvmtiError
Deallocate(jvmtiEnv* env,
            unsigned char* mem)
JVM TIのアロケータを使用して、memを解放します。この関数は、JVM TIの関数によって割り当てられて返されたメモリー(Allocateを使用して割り当てられたメモリーを含む)を解放するために使用します。割り当てられたすべてのメモリーを解除するまで、メモリーを再生することはできません。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 471.0

権限
必要な機能

パラメータ
名前 説明
mem unsigned char * 割り当てられたメモリーの先頭を指すポインタ。「On return, the elements are set」は無視してよい。

エージェントは、unsigned charの配列を渡す。配列の要素の値は無視される。戻ったとき、要素が設定されている。memNULLの場合、呼出しが無視される。

エラー
この関数は、汎用エラーを返します


スレッド

スレッド関数: スレッドの関数型: スレッドの型: スレッドのフラグおよび定数:


スレッド状態の取得

jvmtiError
GetThreadState(jvmtiEnv* env,
            jthread thread,
            jint* thread_state_ptr)
スレッドの状態を取得します。スレッドの状態は、以下の一連の質問に答えることでわかります。

答えは次のビット・ベクトルで表されます。
スレッド状態のフラグ
定数 説明
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(long)
JVMTI_THREAD_STATE_IN_OBJECT_WAIT0x0100 スレッドはオブジェクト・モニターを待機中 - Object.wait
JVMTI_THREAD_STATE_PARKED0x0200 スレッドは一時停止中。LockSupport.parkLockSupport.parkUtil、およびLockSupport.parkNanos
JVMTI_THREAD_STATE_SUSPENDED0x100000 スレッドが中断された。java.lang.Thread.suspend()またはJVM TIの中断関数(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ベンダーが定義する。
次の定義は、JVM TIスレッド状態をjava.lang.Thread.State形式の状態に変換するために使用します。
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.NEW
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATEDJVMTI_THREAD_STATE_TERMINATED java.lang.Thread.State.TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLEJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE java.lang.Thread.State.RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKEDJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER java.lang.Thread.State.BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_WAITINGJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY java.lang.Thread.State.WAITING
JVMTI_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
規則

質問に対する回答は多くても1つですが、回答がないこともあります(回答が不明であるか、該当しないか、どの回答も正しくないため)。ある回答が設定されるのは、それを包含する回答が一致する場合のみです。つまり、次のいずれか1つ以上は設定できません。 JVMTI_THREAD_STATE_ALIVEが設定されている場合、J2SETM準拠実装では、以上のいずれかが常に設定されます。いずれかが設定されている場合は、包含する回答JVMTI_THREAD_STATE_ALIVEが設定されます。以下のいずれか1つのみを 設定できます(JVMTI_THREAD_STATE_WAITINGが設定されている場合、J2SETM準拠実装では、これらのいずれかが常に設定されます)。いずれかが設定されている場合、包含する回答JVMTI_THREAD_STATE_ALIVEおよびJVMTI_THREAD_STATE_WAITINGが設定されます。以下のいずれか1つのみを 設定できます。いずれかが設定されている場合、包含する回答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_ALIVEが設定されます。

そして、JVMTI_THREAD_STATE_TERMINATEDJVMTI_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";
            }
        

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 171.0

権限
必要な機能

パラメータ
名前 説明
threadjthread 照会するスレッド。threadNULLの場合、現在のスレッドが使用される。
thread_state_ptrjint* 戻ったとき、スレッド状態フラグの定義に従って状態フラグをポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD threadはスレッド・オブジェクトではない。
JVMTI_ERROR_NULL_POINTER thread_state_ptrNULL

現在のスレッドの取得

jvmtiError
GetCurrentThread(jvmtiEnv* env,
            jthread* thread_ptr)
現在のスレッドを取得します。現在のスレッドとは、この関数を呼び出したJavaプログラミング言語スレッドのことです。

スレッドを引数に取るJVM TI関数のほとんどは、NULLを現在のスレッドを意味するものとして受け入れます。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 181.1

権限
必要な機能

パラメータ
名前 説明
thread_ptrjthread* 戻ったとき、現在のスレッドをポイントする。

エージェントはjthreadへのポインタを渡す。戻ったとき、jthreadが設定されている。thread_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER thread_ptrNULL

すべてのスレッドの取得

jvmtiError
GetAllThreads(jvmtiEnv* env,
            jint* threads_count_ptr,
            jthread** threads_ptr)
すべてのライブ・スレッドを取得します。これらのスレッドは、Javaプログラミング言語のスレッド(つまりVMに接続されたスレッド)です。あるスレッドがライブ・スレッドになるのは、java.lang.Thread.isAlive()trueを返す場合(つまり、そのスレッドが起動後まだ終了していない場合)です。スレッドの領域はJVM TI環境のコンテキストによって決まりますが、それは通常、VMに接続されたすべてのスレッドになります。これにはJVM TIエージェント・スレッドも含まれます(RunAgentThreadを参照)。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 41.0

権限
必要な機能

パラメータ
名前 説明
threads_count_ptrjint* 戻ったとき、実行中のスレッドの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
threads_ptrjthread** 戻ったとき、参照(実行中のスレッドごとに1つずつ)の配列をポイントする。

エージェントはjthread*へのポインタを渡す。戻ったとき、jthread*は、サイズ*threads_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。threads_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER threads_count_ptrNULL
JVMTI_ERROR_NULL_POINTER threads_ptrNULL

スレッドの中断

jvmtiError
SuspendThread(jvmtiEnv* env,
            jthread thread)
指定されたスレッドを中断します。呼出し側スレッドが指定されている場合、この関数は、ほかのスレッドがResumeThreadを呼び出すまで戻りません。スレッドが現在中断されている場合、この関数は何も行わず、エラーを返します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 51.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_suspend スレッドを中断し、再開できる。

パラメータ
名前 説明
threadjthread 中断するスレッド。threadNULLの場合、現在のスレッドが使用される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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配列内に返されます。現在中断しているスレッドの状態は変わりません。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 921.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_suspend スレッドを中断し、再開できる。

パラメータ
名前 説明
request_countjint 中断するスレッドの数。
request_listconst jthread* 中断するスレッドのリスト。

エージェントはjthreadrequest_count要素の配列を渡す。
resultsjvmtiError* エージェントによって提供されたrequest_count要素の配列。戻ったとき、対応するスレッドの中断のエラー・コードが入っている。スレッドがこの呼出しによって中断した場合、エラー・コードはJVMTI_ERROR_NONEになる。その他のエラー・コードは、SuspendThreadに指定されたエラー・コード。

エージェントは、jvmtiErrorrequest_count要素を十分保持できる大きさの配列を渡す。配列の要素の値は無視される。戻ったとき、要素が設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_suspendを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_ILLEGAL_ARGUMENT request_count0より小さい。
JVMTI_ERROR_NULL_POINTER request_listNULL
JVMTI_ERROR_NULL_POINTER resultsNULL

スレッドの再開

jvmtiError
ResumeThread(jvmtiEnv* env,
            jthread thread)
中断されているスレッドの実行を再開します。現在JVM TI中断関数(例、SuspendThread)またはjava.lang.Thread.suspend()によって中断されているスレッドの実行を再開します。その他のスレッドには影響はありません。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 61.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_suspend スレッドを中断し、再開できる。

パラメータ
名前 説明
threadjthread 再開するスレッド。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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)またはjava.lang.Thread.suspend()経由で中断されたすべてのスレッドの実行が再開されます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 931.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_suspend スレッドを中断し、再開できる。

パラメータ
名前 説明
request_countjint 再開するスレッドの数。
request_listconst jthread* 再開するスレッド。

エージェントはjthreadrequest_count要素の配列を渡す。
resultsjvmtiError* エージェントによって提供されたrequest_count要素の配列。戻ったとき、対応するスレッドの再開のエラー・コードが入っている。スレッドがこの呼出しによって中断した場合、エラー・コードはJVMTI_ERROR_NONEになる。その他のエラー・コードは、ResumeThreadに指定されたエラー・コード。

エージェントは、jvmtiErrorrequest_count要素を十分保持できる大きさの配列を渡す。配列の要素の値は無視される。戻ったとき、要素が設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_suspendを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_ILLEGAL_ARGUMENT request_count0より小さい。
JVMTI_ERROR_NULL_POINTER request_listNULL
JVMTI_ERROR_NULL_POINTER resultsNULL

スレッドの停止

jvmtiError
StopThread(jvmtiEnv* env,
            jthread thread,
            jobject exception)
指定された非同期の例外を指定されたスレッドに送ります(java.lang.Thread.stopと同様)。通常、この関数は、指定されたスレッドを、例外ThreadDeathのインスタンスを使って終了させるために使います。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 71.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_signal_thread スレッドに停止または割込み信号を送信できる

パラメータ
名前 説明
threadjthread 停止するスレッド。
exceptionjobject 非同期の例外オブジェクト。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_signal_threadを持たない。AddCapabilitiesを使用する。
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と同様)。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 81.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_signal_thread スレッドに停止または割込み信号を送信できる

パラメータ
名前 説明
threadjthread 割り込むスレッド。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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構造体のフィールドに、指定されたスレッドの詳細が入ります。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 91.0

権限
必要な機能

jvmtiThreadInfo - スレッド情報構造体
フィールド 説明
namechar* スレッド名。修正UTF-8文字列としてエンコードされる。
priorityjint スレッドの優先順位。スレッド優先順位定数jvmtiThreadPriorityを参照。
is_daemonjboolean デーモン・スレッドかどうか
thread_groupjthreadGroup このスレッドが属するスレッド・グループ。スレッドが停止している場合はNULL
context_class_loaderjobject このスレッドに関連付けられているコンテキスト・クラス・ローダー。

パラメータ
名前 説明
threadjthread 照会するスレッド。threadNULLの場合、現在のスレッドが使用される。
info_ptrjvmtiThreadInfo* 戻ったとき、指定されたスレッドについての情報が入っている。

コンテキスト・クラス・ローダーを認識しないJDK 1.1の実装の場合、context_class_loaderフィールドはNULL。

エージェントはjvmtiThreadInfoへのポインタを渡す。戻ったとき、jvmtiThreadInfoが設定されている。jvmtiThreadInfonameフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiThreadInfoのフィールドthread_groupで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。jvmtiThreadInfoのフィールドcontext_class_loaderで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD threadはスレッド・オブジェクトではない。
JVMTI_ERROR_NULL_POINTER info_ptrNULL

所有モニター情報の取得

jvmtiError
GetOwnedMonitorInfo(jvmtiEnv* env,
            jthread thread,
            jint* owned_monitor_count_ptr,
            jobject** owned_monitors_ptr)
指定されたスレッドが所有するモニターについての情報を取得します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 101.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_owned_monitor_info モニターの所有に関する情報を取得できる - GetOwnedMonitorInfo

パラメータ
名前 説明
threadjthread 照会するスレッド。threadNULLの場合、現在のスレッドが使用される。
owned_monitor_count_ptrjint* 返されるモニターの数。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
owned_monitors_ptrjobject** 所有されるモニターの配列。

エージェントは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_ptrNULL
JVMTI_ERROR_NULL_POINTER owned_monitors_ptrNULL

所有モニターのスタックの深さ情報の取得

typedef struct {
    jobject monitor;
    jint stack_depth;
} jvmtiMonitorStackDepthInfo;
jvmtiError
GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
            jthread thread,
            jint* monitor_info_count_ptr,
            jvmtiMonitorStackDepthInfo** monitor_info_ptr)
指定されたスレッドが所有するモニターに関する情報と、それらのモニターをロックしているスタック・フレームの深さを取得します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1531.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_owned_monitor_stack_depth_info 所有されているモニターに関する情報とスタックの深さを取得できる - GetOwnedMonitorStackDepthInfo

jvmtiMonitorStackDepthInfo - モニター・スタック深さ情報構造体
フィールド 説明
monitorjobject 所有されるモニター。
stack_depthjint スタックの深さ。スタック・フレーム関数で使用されるスタックの深さに対応している。つまり、0は現在のフレームを、1は現在のフレームを呼び出したフレームをそれぞれ表す。また、実装がスタックの深さを判断できない場合は - 1になる(JNIのMonitorEnterを使って取得されたモニターの場合など)。

パラメータ
名前 説明
threadjthread 照会するスレッド。threadNULLの場合、現在のスレッドが使用される。
monitor_info_count_ptrjint* 返されるモニターの数。

エージェントは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_ptrNULL
JVMTI_ERROR_NULL_POINTER monitor_info_ptrNULL

現在競合しているモニターの取得

jvmtiError
GetCurrentContendedMonitor(jvmtiEnv* env,
            jthread thread,
            jobject* monitor_ptr)
指定されたスレッドが、java.lang.Object.waitを使ってオブジェクトのモニターに入るか、モニターを獲得し直すのを待機している場合に、そのオブジェクトを取得します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 111.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_current_contended_monitor GetCurrentContendedMonitorが可能

パラメータ
名前 説明
threadjthread 照会するスレッド。threadNULLの場合、現在のスレッドが使用される。
monitor_ptrjobject* 戻ったとき、現在競合しているモニターが入っている。そのようなモニターがない場合は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_ptrNULL

エージェント起動関数

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プログラミング言語のクエリーでは表示されませんが、GetAllThreadsGetAllStackTracesなど、JVM TIのクエリーには含まれます。

procの実行時に、新しいスレッドはVMに接続されます。JNIドキュメントのVMへの接続に関する項を参照してください。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 121.0

権限
必要な機能

パラメータ
名前 説明
threadjthread 実行するスレッド。
proc jvmtiStartFunction 起動関数。

argconst void * 起動関数の引数。

エージェントがポインタを渡す。argNULLの場合、起動関数にNULLが渡される。
priorityjint 開始されるスレッドの優先順位。java.lang.Thread.setPriorityで許可されているスレッド優先順位を使用できる(jvmtiThreadPriorityの優先順位を含む)。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_PRIORITY priorityJVMTI_THREAD_MIN_PRIORITYより低いかJVMTI_THREAD_MAX_PRIORITYより高い
JVMTI_ERROR_INVALID_THREAD threadはスレッド・オブジェクトではない。
JVMTI_ERROR_NULL_POINTER procNULL

スレッド・ローカルな記憶領域の設定

jvmtiError
SetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            const void* data)
VMは、個々の環境スレッド・ペアに関連付けられているポインタ値を格納します。このポインタ値をスレッド・ローカルな記憶領域と呼びます。この関数で設定されない場合、値はNULLになります。エージェントは、スレッド固有の情報を格納するため、メモリーを割り当てることができます。スレッド・ローカルな記憶領域を設定することにより、GetThreadLocalStorageを使ってアクセスできるようになります。

この関数は、JVM TIのスレッド・ローカルな記憶領域の値を設定するため、エージェントによって呼び出されます。JVM TIは、エージェントに対して、スレッドごとの情報を記録するために利用できる、ポインタ・サイズのスレッド・ローカルな記憶領域を提供します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1031.0

権限
必要な機能

パラメータ
名前 説明
threadjthread このスレッドを格納する。threadNULLの場合、現在のスレッドが使用される。
dataconst void * スレッド・ローカルな記憶領域に入力する値。

エージェントがポインタを渡す。dataNULLの場合、値はNULLに設定される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD threadはスレッド・オブジェクトではない。
JVMTI_ERROR_THREAD_NOT_ALIVE threadがライブ・スレッドではない(まだ起動していないか、すでに終了している)。

スレッド・ローカルな記憶領域の取得

jvmtiError
GetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            void** data_ptr)
JVM TIのスレッド・ローカルな記憶領域の値を取得するため、エージェントによって呼び出されます。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1021.0

権限
必要な機能

パラメータ
名前 説明
threadjthread このスレッドから取得する。threadNULLの場合、現在のスレッドが使用される。
data_ptrvoid** スレッド・ローカルな記憶領域の値を返すポインタ。スレッド・ローカルな記憶領域がSetThreadLocalStorageで設定されていない場合、返されるポインタはNULL

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD threadはスレッド・オブジェクトではない。
JVMTI_ERROR_THREAD_NOT_ALIVE threadがライブ・スレッドではない(まだ起動していないか、すでに終了している)。
JVMTI_ERROR_NULL_POINTER data_ptrNULL


スレッド・グループ

スレッド・グループ関数: スレッド・グループの型:


トップ・レベルのスレッド・グループの取得

jvmtiError
GetTopThreadGroups(jvmtiEnv* env,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)
VM内のトップ・レベルの(親がない)スレッド・グループをすべて返します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 131.0

権限
必要な機能

パラメータ
名前 説明
group_count_ptrjint* 戻ったとき、トップ・レベルのスレッド・グループの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
groups_ptrjthreadGroup** 戻ったとき、トップ・レベルのスレッド・グループの配列を指すポインタを参照する。

エージェントはjthreadGroup*へのポインタを渡す。戻ったとき、jthreadGroup*は、サイズ*group_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。groups_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER group_count_ptrNULL
JVMTI_ERROR_NULL_POINTER groups_ptrNULL

スレッド・グループ情報の取得

typedef struct {
    jthreadGroup parent;
    char* name;
    jint max_priority;
    jboolean is_daemon;
} jvmtiThreadGroupInfo;
jvmtiError
GetThreadGroupInfo(jvmtiEnv* env,
            jthreadGroup group,
            jvmtiThreadGroupInfo* info_ptr)
スレッド・グループの情報を取得します。jvmtiThreadGroupInfo構造体のフィールドに、指定されたスレッド・グループの詳細が入ります。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 141.0

権限
必要な機能

jvmtiThreadGroupInfo - スレッド・グループ情報構造体
フィールド 説明
parentjthreadGroup 親スレッド・グループ。
namechar* スレッド・グループの名前。修正UTF-8文字列としてエンコードされる。
max_priorityjint このスレッド・グループの最高の優先順位。
is_daemonjboolean デーモン・スレッド・グループかどうか。

パラメータ
名前 説明
groupjthreadGroup 照会するスレッド・グループ。
info_ptrjvmtiThreadGroupInfo* 戻ったとき、指定されたスレッド・グループについての情報が入っている。

エージェントはjvmtiThreadGroupInfoへのポインタを渡す。戻ったとき、jvmtiThreadGroupInfoが設定されている。jvmtiThreadGroupInfoのフィールドparentで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。jvmtiThreadGroupInfonameフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD_GROUP groupはスレッド・グループ・オブジェクトではない。
JVMTI_ERROR_NULL_POINTER info_ptrNULL

子スレッド・グループの取得

jvmtiError
GetThreadGroupChildren(jvmtiEnv* env,
            jthreadGroup group,
            jint* thread_count_ptr,
            jthread** threads_ptr,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)
このスレッド・グループ内のライブ・スレッドとアクティブなサブグループを取得します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 151.0

権限
必要な機能

パラメータ
名前 説明
groupjthreadGroup 照会するグループ。
thread_count_ptrjint* 戻ったとき、このスレッド・グループ内のライブ・スレッドの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
threads_ptrjthread** 戻ったとき、このスレッド・グループ内のライブ・スレッドの配列をポイントする。

エージェントはjthread*へのポインタを渡す。戻ったとき、jthread*は、サイズ*thread_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。threads_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
group_count_ptrjint* 戻ったとき、アクティブな子スレッド・グループの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
groups_ptrjthreadGroup** 戻ったとき、アクティブな子スレッド・グループの配列をポイントする。

エージェントはjthreadGroup*へのポインタを渡す。戻ったとき、jthreadGroup*は、サイズ*group_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。groups_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD_GROUP groupはスレッド・グループ・オブジェクトではない。
JVMTI_ERROR_NULL_POINTER thread_count_ptrNULL
JVMTI_ERROR_NULL_POINTER threads_ptrNULL
JVMTI_ERROR_NULL_POINTER group_count_ptrNULL
JVMTI_ERROR_NULL_POINTER groups_ptrNULL


スタック・フレーム

スタック・フレーム関数: スタック・フレームの型: これらの関数は、スレッドのスタックに関する情報を提供します。スタック・フレームは、深さで参照されます。深さゼロのフレームが現在のフレームです。

スタック・フレームについては、Java(tm)仮想マシン仕様のセクション3.6に記載されています。つまり、これらのフレームは、ネイティブ・メソッドを含むメソッドの呼出しに対応しているが、プラットフォーム固有のフレームやVM内部のフレームには対応していません。

JVM TI実装はメソッド呼び出しを使用してスレッドを起動する可能性があるので、対応するフレームがそれらの関数によって提供される情報として、スタック内に含まれる可能性があります。つまり、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_buffer jvmtiFrameInfo * 戻ったとき、このエージェントによって割り当てられたバッファに、スタック・フレーム情報が入っている。
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関数を使用できます。このマッピングは、遅延してもかまいません。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1041.0

権限
必要な機能

パラメータ
名前 説明
threadjthread このスレッドのスタック・トレースをフェッチする。threadNULLの場合、現在のスレッドが使用される。
start_depthjint フレームの取得をこの深さから開始する。負でない場合は現在のフレームからカウントし、最初に取得されるフレームは深さstart_depthになる。たとえば、0の場合は現在のフレームから開始し、1の場合は現在のフレームの呼出し元から開始し、2の場合は現在のフレームの呼出し元の呼出し元から開始する、といった具合になる。負の場合、もっとも古いフレームの下からカウントし、最初に取得されるフレームは深さstackDepth + start_depthになる(stackDepthはスタックのフレーム数)。たとえば、マイナス1の場合はもっとも古いフレームのみが取得され、マイナス2の場合はもっとも古いフレームから呼び出されたフレームから開始する。
max_frame_countjint 取得するjvmtiFrameInfoレコードの最大数。
frame_buffer jvmtiFrameInfo * 戻ったとき、このエージェントによって割り当てられたバッファに、スタック・フレーム情報が入っている。

エージェントは、jvmtiFrameInfomax_frame_count要素を十分保持できる大きさの配列を渡す。配列の要素の値は無視される。戻ったとき、要素の*count_ptrが設定される。
count_ptrjint* 戻ったとき、情報を入力されるレコードの数をポイントする。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_count0より小さい。
JVMTI_ERROR_NULL_POINTER frame_bufferNULL
JVMTI_ERROR_NULL_POINTER count_ptrNULL

すべてのスタック・トレースの取得

jvmtiError
GetAllStackTraces(jvmtiEnv* env,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr,
            jint* thread_count_ptr)
すべてのライブ・スレッドのスタックに関する情報を取得します(エージェント・スレッドを含む)。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); 
        

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1001.0

権限
必要な機能

パラメータ
名前 説明
max_frame_countjint スレッドごとに取得するjvmtiFrameInfoレコードの最大数。
stack_info_ptr jvmtiStackInfo ** 戻ったときに、このバッファに各スレッドのスタック情報が入っている。jvmtiStackInfoのレコード数は、thread_count_ptrで決定される。

このバッファは、jvmtiStackInfo.frame_bufferでポイントされたjvmtiFrameInfoバッファを含むように割り当てられている。これらのバッファは、別々に解放してはならない。

エージェントはjvmtiStackInfo*へのポインタを渡す。戻り時に、jvmtiStackInfo*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。jvmtiStackInfoのフィールドthreadで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
thread_count_ptrjint* トレースされたスレッドの数。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count0より小さい。
JVMTI_ERROR_NULL_POINTER stack_info_ptrNULL
JVMTI_ERROR_NULL_POINTER thread_count_ptrNULL

スレッド・リストのスタック・トレースの取得

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を参照してください。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1011.0

権限
必要な機能

パラメータ
名前 説明
thread_countjint トレースするスレッドの数。
thread_listconst jthread* トレースするスレッドのリスト。

エージェントはjthreadthread_count要素の配列を渡す。
max_frame_countjint スレッドごとに取得する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_count0より小さい。
JVMTI_ERROR_NULL_POINTER thread_listNULL
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count0より小さい。
JVMTI_ERROR_NULL_POINTER stack_info_ptrNULL

フレーム・カウントの取得

jvmtiError
GetFrameCount(jvmtiEnv* env,
            jthread thread,
            jint* count_ptr)
指定されたスレッドの呼出しスタックに現在入っているフレームの数を取得します。

アクティブにバイト・コードを実行しているスレッド(現在のスレッドではなく、中断されていないスレッドなど)のためにこの関数が呼び出された場合、一時的な情報が返されます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 161.0

権限
必要な機能

パラメータ
名前 説明
threadjthread 照会するスレッド。threadNULLの場合、現在のスレッドが使用される。
count_ptrjint* 戻ったとき、呼出しスタック内のフレームの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD threadはスレッド・オブジェクトではない。
JVMTI_ERROR_THREAD_NOT_ALIVE threadがライブ・スレッドではない(まだ起動していないか、すでに終了している)。
JVMTI_ERROR_NULL_POINTER count_ptrNULL

フレームのポップ

jvmtiError
PopFrame(jvmtiEnv* env,
            jthread thread)
threadスタックの現在のフレームをポップします。フレームをポップすると、直前のフレームに戻ります。スレッドが再開されると、スレッドの実行状態は、メソッドが呼び出される直前の状態にリセットされます。Java(tm)仮想マシン仕様の用語で説明すると、次のようになります。 ただし、呼出し先のメソッドで発生した引数の変更内容は保持されます。実行を続行すると、最初の実行指示が呼び出しとなります。

PopFrameの呼び出しとスレッドの再開の間、スタックの状態は未定義です。最初のフレームよりも前にフレームをポップするには、次の3つの手順を繰り返す必要があります。

被呼出しメソッドを呼び出すことによって獲得されたロック(これがsynchronizedメソッドの場合)と、被呼出しメソッド内のsynchronizedブロックに入ることによって獲得されたロックは解放されます。注: これは、ネイティブ・ロックやjava.util.concurrent.locksロックには適用されません。

最終的に、ブロックは実行されません。

グローバル状態への変更には対応しないので、変更は行われません。

指定されたスレッドは中断されていなければいけません。これは、そのスレッドが現在のスレッドであってはいけないことを意味します。

被呼出しメソッドと呼出し側のメソッドのどちらも、非ネイティブのJavaプログラミング言語のメソッドとします。

この関数は、JVM TIイベントを生成しません。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 801.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_pop_frame スタックからフレームをポップできる - PopFrame

パラメータ
名前 説明
threadjthread ポップする現在のフレームのスレッド。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_pop_frameを持たない。AddCapabilitiesを使用する。
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プログラミング言語のフレームについて、現在実行中の命令の位置を返します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 191.0

権限
必要な機能

パラメータ
名前 説明
threadjthread 照会するフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 照会するフレームの深さ。
method_ptrjmethodID* 戻ったとき、現在の位置のメソッドをポイントする。

エージェントはjmethodIDへのポインタを渡す。戻ったとき、jmethodIDが設定されている。
location_ptrjlocation* 戻ったとき、現在実行中の命令のインデックスをポイントする。フレームがネイティブ・メソッドを実行している場合は-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_ptrNULL
JVMTI_ERROR_NULL_POINTER location_ptrNULL

フレームのポップの通知

jvmtiError
NotifyFramePop(jvmtiEnv* env,
            jthread thread,
            jint depth)
深さdepthのフレームがスタックからポップされたとき、FramePopイベントを生成します。詳細は、FramePopイベントの説明を参照してください。非ネイティブJavaプログラミング言語のメソッドに対応するフレームだけが通知を受信できます。

指定したスレッドは現在のスレッドであるか、スレッドが中断したかのどちらかです。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 201.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_frame_pop_events FramePopイベントを設定し、取得できる。

パラメータ
名前 説明
threadjthread フレームのポップ・イベントが生成されるフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint フレームのポップ・イベントが生成されるフレームの深さ。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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にスタック・フレームがない。


早期復帰の強制

早期復帰の強制の関数: これらの関数を使うと、エージェントは、実行中の任意のポイントでの復帰をメソッドに強制できます。早期復帰するメソッドを被呼出しメソッドと呼びます。被呼出しメソッドは、Java(tm)仮想マシン仕様のセクション3.6に定義されているとおり、関数の呼出し時に、指定されたスレッドの現在のメソッドになります。

指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。メソッドの復帰は、Javaプログラミング言語のコードの実行がこのスレッド上で再開されたときに行われます。これらの関数のいずれかを呼び出してからスレッドの実行が再開されるまでの間のスタックの状態は未定義です。

被呼出しメソッドでは、これ以上の命令は実行されません。特に、最終的にブロックは実行されません。注: これにより、アプリケーション内で整合性のない状態が発生することがあります。

被呼出しメソッドを呼び出すことによって獲得されたロック(これがsynchronizedメソッドの場合)と、被呼出しメソッド内のsynchronizedブロックに入ることによって獲得されたロックは解放されます。注: これは、ネイティブ・ロックやjava.util.concurrent.locksロックには適用されません。

通常復帰の場合と同様に、MethodExitなどのイベントが生成されます。

被呼出しメソッドは、非ネイティブのJavaプログラミング言語のメソッドとします。スタック上にフレームが1つだけある状態でスレッドへの強制復帰を行なった場合、スレッドが再開時に終了します。


早期復帰の強制 - オブジェクト型

jvmtiError
ForceEarlyReturnObject(jvmtiEnv* env,
            jthread thread,
            jobject value)
この関数を使うと、結果の型がObjectまたはObjectのサブクラスであるメソッドから復帰できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 811.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_force_early_return 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。

パラメータ
名前 説明
threadjthread 現在のフレームが早期復帰するスレッド。threadNULLの場合、現在のスレッドが使用される。
valuejobject 被呼出しフレームの戻り値。オブジェクトまたは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)
この関数を使うと、結果の型がintshortcharbytebooleanのいずれかであるメソッドから復帰できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 821.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_force_early_return 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。

パラメータ
名前 説明
threadjthread 現在のフレームが早期復帰するスレッド。threadNULLの場合、現在のスレッドが使用される。
valuejint 被呼出しフレームの戻り値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_force_early_returnを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_OPAQUE_FRAME ネイティブ・メソッドに対応するフレームからの早期復帰が試みられた。または、実装がこのフレーム上でこの機能を提供できない。
JVMTI_ERROR_TYPE_MISMATCH 被呼出しメソッドの結果の型がintshortcharbytebooleanのいずれでもない。
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であるメソッドから復帰できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 831.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_force_early_return 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。

パラメータ
名前 説明
threadjthread 現在のフレームが早期復帰するスレッド。threadNULLの場合、現在のスレッドが使用される。
valuejlong 被呼出しフレームの戻り値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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であるメソッドから復帰できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 841.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_force_early_return 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。

パラメータ
名前 説明
threadjthread 現在のフレームが早期復帰するスレッド。threadNULLの場合、現在のスレッドが使用される。
valuejfloat 被呼出しフレームの戻り値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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であるメソッドから復帰できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 851.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_force_early_return 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。

パラメータ
名前 説明
threadjthread 現在のフレームが早期復帰するスレッド。threadNULLの場合、現在のスレッドが使用される。
valuejdouble 被呼出しフレームの戻り値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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と宣言されていなければいけません。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 861.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_force_early_return 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。

パラメータ
名前 説明
threadjthread 現在のフレームが早期復帰するスレッド。threadNULLの場合、現在のスレッドが使用される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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がライブ・スレッドではない(まだ起動していないか、すでに終了している)。


ヒープ

ヒープ関数: ヒープの関数型: ヒープの型: ヒープのフラグおよび定数: これらの関数は、ヒープの分析に使用されます。ヒープ内のオブジェクトの表示、これらのオブジェクトへのタグ付けなどの機能があります。

オブジェクトのタグ

タグは、オブジェクトに関連付けられる値です。タグは、エージェントにより、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のjboolean
JVMTI_PRIMITIVE_TYPE_BYTE66 「B」- Javaプログラミング言語のbyte - JNIのjbyte
JVMTI_PRIMITIVE_TYPE_CHAR67 「C」- Javaプログラミング言語のchar - JNIのjchar
JVMTI_PRIMITIVE_TYPE_SHORT83 「S」- Javaプログラミング言語のshort - JNIのjshort
JVMTI_PRIMITIVE_TYPE_INT73 「I」- Javaプログラミング言語のint - JNIのjint
JVMTI_PRIMITIVE_TYPE_LONG74 「J」- Javaプログラミング言語のlong - JNIのjlong
JVMTI_PRIMITIVE_TYPE_FLOAT70 「F」- Javaプログラミング言語のfloat - JNIのjfloat
JVMTI_PRIMITIVE_TYPE_DOUBLE68 「D」- Javaプログラミング言語のdouble - JNIのjdouble

フィールド参照用の参照情報構造体

JVMTI_HEAP_REFERENCE_FIELDおよびJVMTI_HEAP_REFERENCE_STATIC_FIELD参照に対して返される参照情報。

typedef struct {
    jint index;
} jvmtiHeapReferenceInfoField;
jvmtiHeapReferenceInfoField - フィールド参照用の参照情報構造体
フィールド 説明
indexjint JVMTI_HEAP_REFERENCE_FIELDの場合、参照側オブジェクトはクラスでもインタフェースでもありません。この場合、indexは、参照側オブジェクトのクラスに含まれるフィールドのインデックスです。以降、このクラスをCと呼びます。

JVMTI_HEAP_REFERENCE_STATIC_FIELDの場合、参照側オブジェクトは、クラス(以降Cと呼ぶ)とインタフェース(以降Iと呼ぶ)のいずれかになります。この場合、indexは、そのクラスまたはインタフェースに含まれるフィールドのインデックスです。

参照側オブジェクトがインタフェースでない場合、フィールドのインデックスは次のようにして決定されます。
  • Cとそのスーパー・クラスに含まれるすべてのフィールドのリストが作成されます。このリストは、java.lang.Object内のすべてのフィールドで始まり、C内のすべてのフィールドで終わります。
  • このリスト内で、指定されたクラスのフィールドがGetClassFieldsから返された順番に並べられます。
  • このリスト内のフィールドに、インデックスnn+1、... が順に割り当てられます。nは、Cによって実装されたすべてのインタフェースに含まれるフィールドのカウント数です。Cは、そのスーパークラスが直接実装しているすべてのインタフェースと、それらのインタフェースのすべてのスーパーインタフェースを実装しています。
参照側オブジェクトがインタフェースである場合、フィールドのインデックスは次のようにして決定されます。
  • I内で直接宣言されているフィールドのリストが作成されます。
  • このリスト内のフィールドがGetClassFieldsから返された順番に並べられます。
  • このリスト内のフィールドに、インデックスnn+1、... が順に割り当てられます。nは、Iのすべてのスーパー・インタフェースに含まれるフィールドのカウント数です。
この計算には、フィールド修飾子(static、public、privateなど)の種類にかかわらず、すべてのフィールドが含まれます。

たとえば、次のようなクラスとインタフェースが指定されているとします。
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)です。つまり、I0pI1xです。
b 3 後続のインデックス。
クラスC1も同じフィールド・インデックスを持ちます。

クラスC2のインスタンスのフィールド・インデックスは、次のようになります。
a 3 C2が実装するインタフェース内のフィールドのカウント数は3 (n=3)です。つまり、I0pI1xI2y (C2のインタフェース)です。I0のフィールドpが含まれるのは、一度のみです。
b 4 「a」に続くインデックス。
q 5 「b」に続くインデックス。
r 6 「q」に続くインデックス。
クラスC2も同じフィールド・インデックスを持ちます。上記のフィールド「a」のように、同じフィールドが、参照側オブジェクトごとに異なるインデックスを持つ可能性があります。また、コールバックからすべてのフィールド・インデックスが可視になるわけではありませんが、ここでは説明のためにすべてのインデックスを示しています。

インタフェースI1も同じフィールド・インデックスを持ちます。
x 1 I1のスーパー・インタフェース内のフィールドのカウント数は1 (n=1)です。つまり、I0pです。

配列参照用の参照情報構造体

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(tm)仮想マシン仕様のセクション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 - 参照情報構造体
フィールド 説明
fieldjvmtiHeapReferenceInfoField JVMTI_HEAP_REFERENCE_FIELDおよびJVMTI_HEAP_REFERENCE_STATIC_FIELD参照の参照側情報。
arrayjvmtiHeapReferenceInfoArray JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT参照の参照側情報。
constant_pooljvmtiHeapReferenceInfoConstantPool JVMTI_HEAP_REFERENCE_CONSTANT_POOL参照の参照側情報。
stack_localjvmtiHeapReferenceInfoStackLocal JVMTI_HEAP_REFERENCE_STACK_LOCAL参照の参照側情報。
jni_localjvmtiHeapReferenceInfoJniLocal JVMTI_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_callback jvmtiHeapIterationCallback ヒープ内のオブジェクトを記述するために呼び出されるコールバック。IterateThroughHeap関数によって使用され、FollowReferences関数によって無視されます。
heap_reference_callback jvmtiHeapReferenceCallback オブジェクト参照を記述するために呼び出されるコールバック。FollowReferences関数によって使用され、IterateThroughHeap関数によって無視されます。
primitive_field_callback jvmtiPrimitiveFieldCallback プリミティブ・フィールドを記述するために呼び出されるコールバック。
array_primitive_value_callback jvmtiArrayPrimitiveValueCallback プリミティブ値の配列を記述するために呼び出されるコールバック。
string_primitive_value_callback jvmtiStringPrimitiveValueCallback String値を記述するために呼び出されるコールバック。
reserved5 jvmtiReservedCallback 将来の使用のために予約済み。
reserved6 jvmtiReservedCallback 将来の使用のために予約済み。
reserved7 jvmtiReservedCallback 将来の使用のために予約済み。
reserved8 jvmtiReservedCallback 将来の使用のために予約済み。
reserved9 jvmtiReservedCallback 将来の使用のために予約済み。
reserved10 jvmtiReservedCallback 将来の使用のために予約済み。
reserved11 jvmtiReservedCallback 将来の使用のために予約済み。
reserved12 jvmtiReservedCallback 将来の使用のために予約済み。
reserved13 jvmtiReservedCallback 将来の使用のために予約済み。
reserved14 jvmtiReservedCallback 将来の使用のために予約済み。
reserved15 jvmtiReservedCallback 将来の使用のために予約済み。

原理の説明: ヒープ・ダンプ機能(下記)では、オブジェクトごとにコールバックが使用されます。バッファ方式の方がスループットが高いように思われますが、テストでは、そのような結果は得られません。メモリー参照の場所または配列アクセスのオーバーヘッドによるものと考えられます。


ヒープ反復コールバック

typedef jint (JNICALL *jvmtiHeapIterationCallback)
    (jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     jint length, 
     void* user_data);
エージェントによって提供されるコールバック関数。ヒープ内のオブジェクトを記述しますが、値は渡しません。

この関数は、必要なビジット制御フラグのビット・ベクトルを返すはずです。これにより、反復処理の全体を中止すべきかどうかが決まります(JVMTI_VISIT_OBJECTSフラグは無視される)。

ヒープ・コールバック関数の制約を参照してください。

パラメータ
名前 説明
class_tagjlong オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。オブジェクトが実行時クラスを表す場合、class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
sizejlong オブジェクトのサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
lengthjint このオブジェクトが配列である場合はその配列の長さ。それ以外の場合はマイナス1 (-1)。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

ヒープ参照コールバック

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_kindjvmtiHeapReferenceKind 参照の種類。
reference_infoconst jvmtiHeapReferenceInfo * 参照に関する詳細。reference_kindJVMTI_HEAP_REFERENCE_FIELDJVMTI_HEAP_REFERENCE_STATIC_FIELDJVMTI_HEAP_REFERENCE_ARRAY_ELEMENTJVMTI_HEAP_REFERENCE_CONSTANT_POOLJVMTI_HEAP_REFERENCE_STACK_LOCAL、またはJVMTI_HEAP_REFERENCE_JNI_LOCALの場合に設定される。それ以外の場合はNULL
class_tagjlong 参照されるオブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。参照先オブジェクトが実行時クラスを表す場合、class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
referrer_class_tagjlong 参照側オブジェクトのクラスのタグ(クラスにタグが付いていないか参照先がヒープ・ルートである場合はゼロ)。参照側オブジェクトが実行時クラスを表す場合、referrer_class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
sizejlong 参照されるオブジェクトのサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* 参照オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
referrer_tag_ptrjlong* 参照元オブジェクトのタグをポイントする(参照元オブジェクトがタグ付けされていない場合はゼロをポイントする)。参照元がオブジェクトでない場合(つまり、このコールバックの報告対象がヒープ・ルートである場合)はNULL。参照元オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。このコールバックの報告対象が、あるオブジェクトからそれ自身への参照である場合、referrer_tag_ptr == tag_ptrとなる。
lengthjint このオブジェクトが配列である場合はその配列の長さ。それ以外の場合はマイナス1 (-1)。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

プリミティブ・フィールド・コールバック

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フラグは無視される)。

ヒープ・コールバック関数の制約を参照してください。

パラメータ
名前 説明
kindjvmtiHeapReferenceKind フィールドの種類 -- インスタンスまたはstatic (JVMTI_HEAP_REFERENCE_FIELDまたはJVMTI_HEAP_REFERENCE_STATIC_FIELD)。
infoconst jvmtiHeapReferenceInfo * どのフィールドか(フィールドのインデックス)。
object_class_tagjlong オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。オブジェクトが実行時クラスを表す場合、object_class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
object_tag_ptrjlong* オブジェクトのタグ(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
valuejvalue フィールドの値。
value_typejvmtiPrimitiveType フィールドの型。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

配列プリミティブ値コールバック

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_tagjlong 配列オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。
sizejlong 配列のサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* 配列オブジェクトのタグ(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
element_countjint プリミティブ配列の長さ。
element_typejvmtiPrimitiveType 配列の要素の型。
elementsconst void* 配列の要素。この配列は、element_typeのサイズを持つelement_count個の項目から成るパック配列となる。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

文字列プリミティブ値コールバック

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_tagjlong Stringクラスのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。
sizejlong 文字列のサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* Stringオブジェクトのタグ(オブジェクトがタグ付けされていない場合はゼロ)をポイントする。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
valueconst jchar* Stringの値。Unicode文字列としてエンコードされる。
value_lengthjint 文字列の長さ。この長さは、文字列内の16ビットUnicode文字の数に等しくなる。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

将来使用するために予約されたコールバック

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グローバル、スレッド・スタックからの参照、ガベージ・コレクションの目的でルートとして使用されるその他のオブジェクトのセットです。

この関数は、参照グラフをトラバースすることで動作します。AB、...がオブジェクトを表すとします。AからBへの参照がトラバースされた場合、ヒープ・ルートからBへの参照がトラバースされた場合、またはBinitial_objectとして指定された場合に、Bビジットされたと言います。AからBへの参照がトラバースされるのは、Aがビジットされた後です。参照の報告順序は、参照のトラバース順序と同じになります。オブジェクト参照の報告は、エージェントから提供されたコールバック関数jvmtiHeapReferenceCallbackを呼び出すことで行われます。AからBへの参照で、A参照元B参照先と呼ばれます。コールバックの呼出しは、参照元からの参照ごとに1回ずつ行われます。これは、参照循環が存在する場合や参照元へのパスが複数存在する場合でも言えることです。参照元と参照先との間に参照が複数存在する可能性もありますが、その場合はそれぞれの参照が報告されます。これらの参照を区別するには、jvmtiHeapReferenceCallbackコールバックのreference_kindおよびreference_infoパラメータを確認します。

この関数が報告するのは、オブジェクト参照のJavaプログラミング言語ビューであり、仮想マシン実装ビューではありません。次のオブジェクト参照が報告されます(nullではない場合)。

またこの関数を使えば、プリミティブ(非オブジェクト)値を確認することもできます。配列またはStringのプリミティブ値が報告されるのは、オブジェクトがビジットされた後です。その報告時には、エージェントが提供するコールバック関数jvmtiArrayPrimitiveValueCallbackまたはjvmtiStringPrimitiveValueCallbackが呼び出されます。あるプリミティブ・フィールドが報告されるのは、そのフィールドを含むオブジェクトがビジットされた後です。その報告時には、エージェントが提供するコールバック関数jvmtiPrimitiveFieldCallbackが呼び出されます。

コールバックが提供されるかNULLであるかは、そのコールバックが呼び出されるかどうかだけを決定し、どのオブジェクトがビジットされるかや、ほかのコールバックが呼び出されるかどうかには影響しません。ただし、jvmtiHeapReferenceCallbackから返されるビジット制御フラグは、現在のオブジェクトが参照しているオブジェクトをビジットするかどうかを決定します。この関数のパラメータとして提供されるヒープ・フィルタ・フラグklassは、ビジットされるオブジェクトは制御しませんが、コールバックによって報告されるオブジェクトおよびプリミティブ値は制御します。たとえば、設定された唯一のコールバックがarray_primitive_value_callbackであり、klassがバイト配列のクラスに設定された場合、バイト配列のみが報告されます。以上をまとめたのが次の表です。

ビジット対象オブジェクトを制御する 報告対象オブジェクトを制御する 報告対象プリミティブを制御する
jvmtiHeapReferenceCallbackによって返されるヒープ・ビジット制御フラグ はい はい、ビジットが制御されるため はい、ビジットが制御されるため
callbacksセット内のarray_primitive_value_callback いいえ はい いいえ
heap_filter いいえ はい はい
klass いいえ はい はい

この関数の実行中、ヒープの状態は変化しません。オブジェクトの割当てやガベージ・コレクションは行われず、オブジェクトの状態(保持された値を含む)は変化しません。このため、Javaプログラミング言語コードを実行するスレッド、Javaプログラミング言語コードの実行を再開しようとしているスレッド、およびJNI関数を実行しようとしているスレッドは通常ストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1151.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
heap_filterjint ヒープ・フィルタ・フラグのこのビット・ベクトルは、コールバック関数の呼出し対象となるオブジェクトを制限します。これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。
klass jclass コールバックが報告するのは、オブジェクトがこのクラスのインスタンスである場合だけである。klassのスーパー・クラスのインスタンスであるオブジェクトは、報告されません。klassがインタフェースの場合、オブジェクトは報告されません。これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。

klassNULLの場合、コールバックは特定のクラスのインスタンスに制限されません。
initial_object jobject 追跡するオブジェクト

initial_objectNULLの場合、ヒープ・ルートから参照の追跡が行われる。
callbacksconst jvmtiHeapCallbacks * 一連のコールバック関数を定義する構造体。

エージェントはjvmtiHeapCallbacksへのポインタを渡す。
user_dataconst void * ユーザーが入力し、コールバックに渡されるデータ。

エージェントがポインタを渡す。user_dataNULLの場合、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 callbacksNULL

ヒープ内での反復

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 いいえ はい いいえ
heap_filter いいえ はい はい
klass いいえ はい はい

この関数の実行中、ヒープの状態は変化しません。オブジェクトの割当てやガベージ・コレクションは行われず、オブジェクトの状態(保持された値を含む)は変化しません。このため、Javaプログラミング言語コードを実行するスレッド、Javaプログラミング言語コードの実行を再開しようとしているスレッド、およびJNI関数を実行しようとしているスレッドは通常ストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1161.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
heap_filterjint ヒープ・フィルタ・フラグのこのビット・ベクトルは、コールバック関数の呼出し対象となるオブジェクトを制限します。これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。
klass jclass コールバックが報告するのは、オブジェクトがこのクラスのインスタンスである場合だけである。klassのスーパー・クラスのインスタンスであるオブジェクトは、報告されません。klassがインタフェースの場合、オブジェクトは報告されません。これはオブジェクト・コールバックとプリミティブ・コールバックの両方に当てはまる。

klassNULLの場合、コールバックは特定のクラスのインスタンスに制限されません。
callbacksconst jvmtiHeapCallbacks * 一連のコールバック関数を定義する構造体。

エージェントはjvmtiHeapCallbacksへのポインタを渡す。
user_dataconst void * ユーザーが入力し、コールバックに渡されるデータ。

エージェントがポインタを渡す。user_dataNULLの場合、NULLがユーザー指定データとして渡される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_tag_objectsを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_INVALID_CLASS klassは有効なクラスではない。
JVMTI_ERROR_NULL_POINTER callbacksNULL

タグの取得

jvmtiError
GetTag(jvmtiEnv* env,
            jobject object,
            jlong* tag_ptr)
オブジェクトに関連付けられているタグを取得します。タグは長整数値で、通常、オブジェクト情報の一意の識別子またはポインタを格納するために使用されます。タグの設定には、SetTag関数を使用します。タグが設定されていないオブジェクトは、タグ値としてゼロを返します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1061.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
objectjobject タグが取得されるオブジェクト。
tag_ptrjlong* 戻ったとき、参照される長整数値にタグ値が設定されている。

エージェントはjlongへのポインタを渡す。戻ったとき、jlongが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_tag_objectsを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_INVALID_OBJECT objectがオブジェクトではない。
JVMTI_ERROR_NULL_POINTER tag_ptrNULL

タグの設定

jvmtiError
SetTag(jvmtiEnv* env,
            jobject object,
            jlong tag)
オブジェクトに関連付けられているタグを設定します。タグは長整数値で、通常、オブジェクト情報の一意の識別子またはポインタを格納するために使用されます。タグの表示には、GetTag関数を使用します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1071.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
objectjobject タグが設定されるオブジェクト。
tagjlong タグの新しい値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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)
ヒープ内の指定されたタグを持つオブジェクトを返します。オブジェクトとタグの並行配列の形式になります。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1141.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
tag_countjint 走査するタグの数。
tagsconst jlong * これらのタグが付けられたオブジェクトを走査する。この配列内では、ゼロは使用できない。

エージェントはjlongtag_count要素の配列を渡す。
count_ptr jint * tags内の任意のタグを持つオブジェクトの数を返す。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
object_result_ptr jobject ** tags内の任意のタグを持つオブジェクトの配列を返す。

エージェントはjobject*へのポインタを渡す。戻ったとき、jobject*は、サイズ*count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。object_result_ptrNULLの場合、この情報は返されない。object_result_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。
tag_result_ptr jlong ** object_result_ptr内の各オブジェクトに対して、対応するインデックスのタグを返す。

エージェントはjlong*へのポインタを渡す。戻ったとき、jlong*は、サイズ*count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。tag_result_ptrNULLの場合、この情報は返されない。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_tag_objectsを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_ILLEGAL_ARGUMENT tags内にゼロが存在する。
JVMTI_ERROR_ILLEGAL_ARGUMENT tag_count0より小さい。
JVMTI_ERROR_NULL_POINTER tagsNULL
JVMTI_ERROR_NULL_POINTER count_ptrNULL

ガベージ・コレクションの強制

jvmtiError
ForceGarbageCollection(jvmtiEnv* env)
VMにガベージ・コレクションの実行を強制します。ガベージ・コレクションは可能なかぎり完全に行われます。この関数は、ファイナライザを実行させません。この関数は、ガベージ・コレクションが完了するまで終了しません。

ガベージ・コレクションは可能なかぎり完全に実行されますが、この関数が戻るまでにすべてのObjectFreeイベントが送信されているという保証はありません。特に、ファイナライズ待ちのオブジェクトが解放されない可能性があります。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1081.0

権限
必要な機能

パラメータ
名前 説明

エラー
この関数は、汎用エラーを返します


ヒープ(1.0)

ヒープ(1.0)の関数: ヒープ(1.0)の関数型: ヒープ(1.0)の型: これらの関数およびデータ型は元のJVM TI Version 1.0で導入されたものであり、より強力で柔軟性の高いバージョンで置き換えられました。新しいバージョンの特徴を次に示します。

現在のヒープ関数を使用してください

ヒープ・オブジェクトのフィルタの列挙(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 オブジェクトから、そのオブジェクトのいずれかのインスタンス・フィールド値への参照。この種の参照の場合、jvmtiObjectReferenceCallbackreferrer_indexパラメータはインスタンス・フィールドのインデックス。インデックスは、すべてのオブジェクトのフィールドの順序が基になる。クラスで直接宣言されたstaticおよびインスタンス・フィールドが含まれるほか、スーパー・クラスおよびスーパー・インタフェースで宣言されたすべてのフィールド(publicとprivateの両方)が含まれる。そのためインデックスは、直接宣言されたクラスにあるフィールドのインデックス(GetClassFields参照)と、すべてのスーパー・クラスおよびスーパー・インタフェースで宣言されたフィールド(publicとprivateの両方)の合計数を足し合わせたもので計算されます。インデックスは0から始まる。
JVMTI_REFERENCE_ARRAY_ELEMENT3 配列から、その配列のいずれかの要素への参照。この種の参照の場合、jvmtiObjectReferenceCallbackreferrer_indexパラメータは配列のインデックス。
JVMTI_REFERENCE_CLASS_LOADER4 クラスからそのクラス・ローダーへの参照。
JVMTI_REFERENCE_SIGNERS5 クラスからその署名者の配列への参照。
JVMTI_REFERENCE_PROTECTION_DOMAIN6 クラスからその保護ドメインへの参照。
JVMTI_REFERENCE_INTERFACE7 クラスから、そのクラスのいずれかのインタフェースへの参照。
JVMTI_REFERENCE_STATIC_FIELD8 クラスからそのいずれかのstaticフィールド値への参照。この種の参照の場合、jvmtiObjectReferenceCallbackreferrer_indexパラメータはstaticフィールドのインデックス。インデックスは、すべてのオブジェクトのフィールドの順序が基になる。クラスで直接宣言されたstaticおよびインスタンス・フィールドが含まれるほか、スーパー・クラスおよびスーパー・インタフェースで宣言されたすべてのフィールド(publicとprivateの両方)が含まれる。そのためインデックスは、直接宣言されたクラスにあるフィールドのインデックス(GetClassFields参照)と、すべてのスーパー・クラスおよびスーパー・インタフェースで宣言されたフィールド(publicとprivateの両方)の合計数を足し合わせたもので計算されます。インデックスは0から始まる。注: この定義は、JVM TI 1.0仕様での定義と異なる。

原理の説明: 既知の実装のなかで、1.0の定義を使用したものはない。

JVMTI_REFERENCE_CONSTANT_POOL9 クラスから定数プール内の解決済みエントリへの参照。この種の参照の場合、jvmtiObjectReferenceCallbackreferrer_indexパラメータは、クラスの定数プール・テーブルのインデックスで、1から始まる。Java(tm)仮想マシン仕様のセクション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_tagjlong オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。オブジェクトが実行時クラスを表す場合、class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
sizejlong オブジェクトのサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

ヒープ・ルート・オブジェクトのコールバック

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_kindjvmtiHeapRootKind ヒープ・ルートの種類。
class_tagjlong オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。オブジェクトが実行時クラスを表す場合、class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
sizejlong オブジェクトのサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

スタック参照オブジェクトのコールバック

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_kindjvmtiHeapRootKind ルートの種類(JVMTI_HEAP_ROOT_STACK_LOCALまたはJVMTI_HEAP_ROOT_JNI_LOCAL)。
class_tagjlong オブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。オブジェクトが実行時クラスを表す場合、class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
sizejlong オブジェクトのサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
thread_tagjlong このスタックに対応するスレッドのタグ。タグ付けされていない場合はゼロ。
depthjint フレームの深さ。
methodjmethodID このフレーム内で実行されているメソッド。
slotjint スロット番号。
user_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

オブジェクト参照のコールバック

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_kindjvmtiObjectReferenceKind 参照型。
class_tagjlong 参照されるオブジェクトのクラスのタグ(タグ付けされていないクラスの場合はゼロ)。参照先オブジェクトが実行時クラスを表す場合、class_tagjava.lang.Classに関連付けされたタグです(java.lang.Classがタグ付けされていない場合はゼロ)。
sizejlong 参照されるオブジェクトのサイズ(バイト単位)。GetObjectSizeを参照。
tag_ptrjlong* 参照オブジェクトのタグ値(オブジェクトがタグ付けされていない場合はゼロ)。オブジェクトと関連付けるタグの値を設定するため、エージェントはパラメータによってポイントされるjlongを設定する。
referrer_tagjlong 参照側のオブジェクトのタグ値。タグ付けされていないオブジェクトの場合はゼロ。
referrer_indexjint 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_datavoid* ユーザーが入力し、反復関数に渡されたデータ。

オブジェクトから到達可能なオブジェクトの反復

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関数を実行しようとしているスレッドは通常ストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1091.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
objectjobject オブジェクト
object_reference_callback jvmtiObjectReferenceCallback 各オブジェクト参照を記述するために呼び出されるコールバック。

user_dataconst void * ユーザーが入力し、コールバックに渡されるデータ。

エージェントがポインタを渡す。user_dataNULLの場合、NULLがユーザー指定データとして渡される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_tag_objectsを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_INVALID_OBJECT objectがオブジェクトではない。
JVMTI_ERROR_NULL_POINTER object_reference_callbackNULL

到達可能なオブジェクトの反復

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_callbackNULLと指定されている場合、この関数は、プロファイラにルート・オブジェクトを報告したあと、終了します。

この関数の実行中、ヒープの状態は変化しません。オブジェクトの割当てやガベージ・コレクションは行われず、オブジェクトの状態(保持された値を含む)は変化しません。このため、Javaプログラミング言語コードを実行するスレッド、Javaプログラミング言語コードの実行を再開しようとしているスレッド、およびJNI関数を実行しようとしているスレッドは通常ストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1101.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
heap_root_callback jvmtiHeapRootCallback JVMTI_HEAP_ROOT_JNI_GLOBALJVMTI_HEAP_ROOT_SYSTEM_CLASSJVMTI_HEAP_ROOT_MONITORJVMTI_HEAP_ROOT_THREAD、またはJVMTI_HEAP_ROOT_OTHER型の各ヒープ・ルートのために呼び出されるコールバック関数。

heap_root_callbackNULLの場合、ヒープ・ルートの報告は行わない。
stack_ref_callback jvmtiStackReferenceCallback JVMTI_HEAP_ROOT_STACK_LOCALまたはJVMTI_HEAP_ROOT_JNI_LOCALの各ヒープ・ルートのために呼び出されるコールバック関数。

stack_ref_callbackNULLの場合、スタック参照の報告は行わない。
object_ref_callback jvmtiObjectReferenceCallback 各オブジェクト参照のために呼び出されるコールバック関数。

object_ref_callbackNULLの場合、ルート・オブジェクトからの参照には従わない。
user_dataconst void * ユーザーが入力し、コールバックに渡されるデータ。

エージェントがポインタを渡す。user_dataNULLの場合、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関数を実行しようとしているスレッドは通常ストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1111.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
object_filterjvmtiHeapObjectFilter どのオブジェクトに対してコールバック関数が呼び出されるかを示す。
heap_object_callback jvmtiHeapObjectCallback object_filterに一致する各オブジェクトに対して呼び出される反復関数。

user_dataconst void * ユーザーが入力し、コールバックに渡されるデータ。

エージェントがポインタを渡す。user_dataNULLの場合、NULLがユーザー指定データとして渡される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_tag_objectsを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_ILLEGAL_ARGUMENT object_filterがjvmtiHeapObjectFilterではない。
JVMTI_ERROR_NULL_POINTER heap_object_callbackNULL

クラスのインスタンスの反復

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関数を実行しようとしているスレッドは通常ストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1121.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_tag_objects ヒープのカテゴリに説明されているように、タグを設定し、タグを取得できる。

パラメータ
名前 説明
klassjclass このクラスのオブジェクトに対してのみ反復処理を行う。
object_filterjvmtiHeapObjectFilter どのオブジェクトに対してコールバック関数が呼び出されるかを示す。
heap_object_callback jvmtiHeapObjectCallback object_filterに一致する各klassインスタンスに対して呼び出される反復関数。

user_dataconst void * ユーザーが入力し、コールバックに渡されるデータ。

エージェントがポインタを渡す。user_dataNULLの場合、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_callbackNULL


局所変数

局所変数関数: これらの関数は、局所変数の値を取得または設定するために使います。変数は、変数の値を含んでいるフレームの深さと、そのフレーム内の変数のスロット番号によって識別されます。変数からスロット番号へのマッピングは、関数GetLocalVariableTableを使って取得できます。


局所変数の取得 - オブジェクト型

jvmtiError
GetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject* value_ptr)
この関数を使うと、型がObjectまたはObjectのサブクラスである局所変数の値を取得できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 211.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
value_ptrjobject* 戻ったとき、変数の値をポイントする。

エージェントは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_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_ptrNULL

局所インスタンスの取得

jvmtiError
GetLocalInstance(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jobject* value_ptr)
この関数を使うと、静的でないフレームからスロット0 (「this」オブジェクト)の局所オブジェクト変数の値を取得できます。この関数は、ネイティブ・メソッドのフレームから「this」オブジェクトを取得しますが、この場合、GetLocalObject()JVMTI_ERROR_OPAQUE_FRAMEを返します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1551.2

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
value_ptrjobject* 戻ったとき、変数の値をポイントする。

エージェントはjobjectへのポインタを渡す。戻ったとき、jobjectが設定されている。value_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_access_local_variablesを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_INVALID_SLOT 指定されたフレームが静的なメソッドのフレームである場合。
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_ptrNULL

局所変数の取得 - 整数型

jvmtiError
GetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint* value_ptr)
この関数を使うと、型がintshortcharbytebooleanのいずれかである局所変数の値を取得できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 221.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
value_ptrjint* 戻ったとき、変数の値をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_access_local_variablesを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_INVALID_SLOT 無効なslot
JVMTI_ERROR_TYPE_MISMATCH 変数の型がintshortcharbyte、またはbooleanではない。
JVMTI_ERROR_OPAQUE_FRAME 可視のフレームではない。
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_ptrNULL

局所変数の取得 - 長整数型

jvmtiError
GetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong* value_ptr)
この関数を使うと、型がlongである局所変数の値を取得できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 231.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
value_ptrjlong* 戻ったとき、変数の値をポイントする。

エージェントは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_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_ptrNULL

局所変数の取得 - 浮動小数点数型

jvmtiError
GetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat* value_ptr)
この関数を使うと、型がfloatである局所変数の値を取得できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 241.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
value_ptrjfloat* 戻ったとき、変数の値をポイントする。

エージェントは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_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_ptrNULL

局所変数の取得 - 倍精度浮動小数点数型

jvmtiError
GetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble* value_ptr)
この関数を使うと、型がlongである局所変数の値を取得できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 251.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
value_ptrjdouble* 戻ったとき、変数の値をポイントする。

エージェントは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_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_ptrNULL

局所変数の設定 - オブジェクト型

jvmtiError
SetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject value)
この関数を使うと、型がObjectまたはObjectのサブクラスである局所変数の値を設定できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 261.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
valuejobject 変数の新しい値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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_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)
この関数を使うと、型がintshortcharbytebooleanのいずれかである局所変数の値を設定できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 271.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
valuejint 変数の新しい値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_access_local_variablesを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_INVALID_SLOT 無効なslot
JVMTI_ERROR_TYPE_MISMATCH 変数の型がintshortcharbyte、またはbooleanではない。
JVMTI_ERROR_OPAQUE_FRAME 可視のフレームではない。
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である局所変数の値を設定できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 281.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
valuejlong 変数の新しい値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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_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である局所変数の値を設定できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 291.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
valuejfloat 変数の新しい値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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_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である局所変数の値を設定できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 301.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

パラメータ
名前 説明
threadjthread 変数の値を含むフレームのスレッド。threadNULLの場合、現在のスレッドが使用される。
depthjint 変数の値を含むフレームの深さ。
slotjint 変数のスロット番号。
valuejdouble 変数の新しい値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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_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イベントが生成されます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 381.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_breakpoint_events Breakpointイベントを設定し、取得できる。

パラメータ
名前 説明
methodjmethodID ブレークポイントを設定するメソッド
locationjlocation ブレークポイントを設定する命令のインデックス

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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で指定されたバイト・コードに設定されているブレークポイントを解除します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 391.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_breakpoint_events Breakpointイベントを設定し、取得できる。

パラメータ
名前 説明
methodjmethodID ブレークポイントを解除するメソッド
locationjlocation ブレークポイントを解除する命令のインデックス

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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を使用します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 411.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_field_access_events フィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch

パラメータ
名前 説明
klassjclass 監視するフィールドを含むクラス
fieldjfieldID 監視するフィールド

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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で指定されるフィールドに対するフィールド・アクセスの監視を取り消します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 421.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_field_access_events フィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch

パラメータ
名前 説明
klassjclass 監視するフィールドを含むクラス
fieldjfieldID 監視するフィールド

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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つだけ設定できます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 431.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_field_modification_events フィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch

パラメータ
名前 説明
klassjclass 監視するフィールドを含むクラス
fieldjfieldID 監視するフィールド

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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を使って以前に設定したフィールド変更の監視を取り消します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 441.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_field_modification_events フィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch

パラメータ
名前 説明
klassjclass 監視するフィールドを含むクラス
fieldjfieldID 監視するフィールド

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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
GetLoadedClasses(jvmtiEnv* env,
            jint* class_count_ptr,
            jclass** classes_ptr)
仮想マシンにロードされている全クラスの配列を返します。配列内のクラスの数はclass_count_ptr、配列自体はclasses_ptrによって返されます。

返されるリストには、すべての型の配列クラス(プリミティブ型の配列を含む)が含まれます。プリミティブ・クラス(たとえば、java.lang.Integer.TYPE)は、このリストには含まれません

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 781.0

権限
必要な機能

パラメータ
名前 説明
class_count_ptrjint* 戻ったとき、クラスの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
classes_ptrjclass** 戻ったとき、各クラスへの参照(クラスごとに1つずつ)の配列をポイントする。

エージェントはjclass*へのポインタを渡す。戻ったとき、jclass*は、サイズ*class_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。classes_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER class_count_ptrNULL
JVMTI_ERROR_NULL_POINTER classes_ptrNULL

クラス・ローダー・クラスの取得

jvmtiError
GetClassLoaderClasses(jvmtiEnv* env,
            jobject initiating_loader,
            jint* class_count_ptr,
            jclass** classes_ptr)
このクラス・ローダーが起動ローダーとして記録されているクラスの配列を返します。返される配列内の各クラスは、このクラス・ローダーによって直接定義されて作成されたものか、または別のクラス・ローダーに委譲して作成されたものです。Java(tm)仮想マシン仕様のセクション5.3を参照してください。

JDK 1.1の実装では、起動クラス・ローダーと定義クラス・ローダーの区別が認識されないため、この関数は、仮想マシンにロードされたすべてのクラスを返します。配列内のクラスの数はclass_count_ptr、配列自体はclasses_ptrによって返されます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 791.0

権限
必要な機能

パラメータ
名前 説明
initiating_loader jobject 起動クラス・ローダー。

initiating_loaderNULLの場合、ブートストラップ・ローダーによって起動されたクラスが返される。
class_count_ptrjint* 戻ったとき、クラスの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
classes_ptrjclass** 戻ったとき、各クラスへの参照(クラスごとに1つずつ)の配列をポイントする。

エージェントはjclass*へのポインタを渡す。戻ったとき、jclass*は、サイズ*class_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。classes_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER class_count_ptrNULL
JVMTI_ERROR_NULL_POINTER classes_ptrNULL

クラスのシグニチャの取得

jvmtiError
GetClassSignature(jvmtiEnv* env,
            jclass klass,
            char** signature_ptr,
            char** generic_ptr)
klassで指定されたクラスに、JNI型のシグニチャとクラスのジェネリック・シグニチャを返します。たとえば、java.util.List"Ljava/util/List;"で、int[]"[I"の場合、返されるプリミティブ・クラスの名前は、対応するプリミティブ型の型シグニチャ文字になります。たとえば、java.lang.Integer.TYPE"I"です。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 481.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
signature_ptr char ** 戻ったとき、クラスのJNI型シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。signature_ptrNULLの場合、シグニチャは返されない。
generic_ptr char ** 戻ったとき、クラスのジェネリック・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。クラスのジェネリック・シグニチャ属性が存在しない場合は、戻ったときNULLをポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。generic_ptrNULLの場合、ジェネリックス・シグニチャは返されない。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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など)。設定されている場合、その他のすべてのビットはゼロ。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 491.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
status_ptrjint* 戻ったとき、このクラスの現在の状態としてクラスのステータス・フラグを1つ以上ポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER status_ptrNULL

ソース・ファイル名の取得

jvmtiError
GetSourceFileName(jvmtiEnv* env,
            jclass klass,
            char** source_name_ptr)
klassで指定されたクラスについて、source_name_ptrを介してソース・ファイル名を返します。返される文字列は、ファイル名だけで、ディレクトリ名は含まれません。

プリミティブ・クラス(たとえば、java.lang.Integer.TYPE)および配列の場合、この関数はJVMTI_ERROR_ABSENT_INFORMATIONを返します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 501.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_source_file_name クラスのソース・ファイルの名前を取得できる

パラメータ
名前 説明
klassjclass 照会するクラス。
source_name_ptrchar** 戻ったとき、クラスのソース・ファイル名(修正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_ptrNULL

クラスの修飾子の取得

jvmtiError
GetClassModifiers(jvmtiEnv* env,
            jclass klass,
            jint* modifiers_ptr)
klassで指定されたクラスのアクセス・フラグを、modifiers_ptrを介して返します。アクセス・フラグは、Java(tm)仮想マシン仕様の第4章に定義されています。

クラスが配列クラスの場合、そのpublic、privateおよびprotected修飾子は、そのコンポーネント型の修飾子と同じです。プリミティブ型の配列の場合、このコンポーネント型は、プリミティブ・クラスの1つ(たとえば、java.lang.Integer.TYPE)で表現されます。

クラスがプリミティブ・クラスの場合、そのpublic修飾子は常にtrueになります。また、そのprotected修飾子およびprivate修飾子は常にfalseになります。

クラスが配列クラスまたはプリミティブ・クラスの場合、そのfinal修飾子は常にtrueになり、interface修飾子は常にfalseになります。その他の修飾子の値は、この仕様では判定されません。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 511.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
modifiers_ptrjint* 戻ったとき、このクラスの現在のアクセス・フラグをポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER modifiers_ptrNULL

クラスのメソッドの取得

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)の場合、空のメソッド・リストが返されます。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 521.0

権限
必要な機能
任意の機能
権限 効果
can_maintain_original_method_order クラス・ファイル内に出現する順序でメソッドを返すことができる

パラメータ
名前 説明
klassjclass 照会するクラス。
method_count_ptrjint* 戻ったとき、このクラスで宣言されているメソッドの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
methods_ptrjmethodID** 戻ったとき、メソッドIDの配列をポイントする。

エージェントはjmethodID*へのポインタを渡す。戻ったとき、jmethodID*は、サイズ*method_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_CLASS_NOT_PREPARED klassが準備されていない。
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER method_count_ptrNULL
JVMTI_ERROR_NULL_POINTER methods_ptrNULL

クラスのフィールドの取得

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を使って、配列の長さを判別してください。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 531.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
field_count_ptrjint* 戻ったとき、このクラスで宣言されているフィールドの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
fields_ptrjfieldID** 戻ったとき、フィールドIDの配列をポイントする。

エージェントはjfieldID*へのポインタを渡す。戻ったとき、jfieldID*は、サイズ*field_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_CLASS_NOT_PREPARED klassが準備されていない。
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER field_count_ptrNULL
JVMTI_ERROR_NULL_POINTER fields_ptrNULL

実装されたインタフェースの取得

jvmtiError
GetImplementedInterfaces(jvmtiEnv* env,
            jclass klass,
            jint* interface_count_ptr,
            jclass** interfaces_ptr)
このクラスの直接のスーパー・インタフェースを返します。クラスに対しては、この関数は、implements節で宣言されているインタフェースを返します。インタフェースに対しては、この関数は、extends節で宣言されているインタフェースを返します。配列クラスおよびプリミティブ・クラス(たとえば、java.lang.Integer.TYPE)の場合、空のインタフェース・リストが返されます。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 541.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
interface_count_ptrjint* 戻ったとき、インタフェースの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
interfaces_ptrjclass** 戻ったとき、インタフェースの配列をポイントする。

エージェントは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_ptrNULL
JVMTI_ERROR_NULL_POINTER interfaces_ptrNULL

クラス・バージョン番号の取得

jvmtiError
GetClassVersionNumbers(jvmtiEnv* env,
            jclass klass,
            jint* minor_version_ptr,
            jint* major_version_ptr)
klassに指定されたクラスについては、Java(tm)仮想マシン仕様の第4章で定義されているように、マイナー・バージョン番号とメジャー・バージョン番号を返します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1451.1

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
minor_version_ptrjint* 戻ったとき、クラス・ファイル形式のminor_version項目の値をポイントする。注: クラス・ファイル形式との一貫性を保つために、マイナー・バージョン番号が最初のパラメータになっている。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
major_version_ptrjint* 戻ったとき、クラス・ファイル形式のmajor_version項目の値をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ABSENT_INFORMATION クラスがプリミティブまたは配列クラスである。
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER minor_version_ptrNULL
JVMTI_ERROR_NULL_POINTER major_version_ptrNULL

定数プールの取得

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(tm)仮想マシン仕様の第4章に記載されたconstant_pool項目の形式で定数プールのrawバイトを返します。定数プールの形式は、クラス・ファイル形式のバージョンによって異なる可能性があるので、クラスのメジャー・バージョン番号、マイナー・バージョン番号に互換性があることを確認するようにしてください。

返される定数プールのレイアウトや内容が、定義元のクラス・ファイル内の定数プールと同じでないこともあります。GetConstantPool()から返される定数プールのエントリ数は、定義元の定数プールのエントリ数と異なる場合があります。エントリの順序が異なる場合もあります。GetConstantPool()から返される定数プールは、GetBytecodes()が使用する定数プールに一致します。つまり、GetBytecodes()から返されるバイト・コードに含まれる定数プール・インデックスは、GetConstantPool()から返される定数プールのエントリを参照します。RetransformClassesおよびRedefineClassesは定数プールを変更できるため、この関数から返される定数プールは、それに応じて変更される可能性があります。したがって、途中でクラスの再変換または再定義が行われた場合は、GetConstantPool()とGetBytecodes()の間の対応関係が維持されません。ある特定のバイト・コードが使用する定数プール・エントリの値は、定義元クラス・ファイルの対応する値に一致します(インデックスが一致しない場合でも)。バイト・コードが直接的にも間接的にも使用しない定数プール・エントリ(注釈に関連付けられているUTF-8文字列など)は、返された定数プール内に存在していなくてもかまいません。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1461.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_constant_pool あるクラスの定数プールを取得できる - GetConstantPool

パラメータ
名前 説明
klassjclass 照会するクラス。
constant_pool_count_ptrjint* 戻ったとき、定数プール・テーブル内のエントリの数+1をポイントする。これは、クラス・ファイル形式のconstant_pool_count項目に対応している。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
constant_pool_byte_count_ptrjint* 戻ったとき、返されたraw定数プール内のバイト数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
constant_pool_bytes_ptrunsigned 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_ptrNULL
JVMTI_ERROR_NULL_POINTER constant_pool_byte_count_ptrNULL
JVMTI_ERROR_NULL_POINTER constant_pool_bytes_ptrNULL

インタフェースかどうかの検査

jvmtiError
IsInterface(jvmtiEnv* env,
            jclass klass,
            jboolean* is_interface_ptr)
クラス・オブジェクト参照がインタフェースを表しているかどうかを判定します。クラスが実際にインタフェースである場合、jbooleanJNI_TRUEを返し、インタフェースではない場合にはJNI_FALSEを返します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 551.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
is_interface_ptrjboolean* 戻ったとき、この関数のboolean型の結果をポイントする。

エージェントはjbooleanへのポインタを渡す。戻ったとき、jbooleanが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER is_interface_ptrNULL

配列クラスかどうかの検査

jvmtiError
IsArrayClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_array_class_ptr)
クラス・オブジェクト参照が配列を表しているかどうかを判定します。jbooleanは、クラスが配列である場合はJNI_TRUEになり、そうでない場合はJNI_FALSEになります。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 561.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
is_array_class_ptrjboolean* 戻ったとき、この関数のboolean型の結果をポイントする。

エージェントはjbooleanへのポインタを渡す。戻ったとき、jbooleanが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER is_array_class_ptrNULL

変更可能クラスかどうかの検査

jvmtiError
IsModifiableClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_modifiable_class_ptr)
クラスが変更可能かどうかを判定します。クラスが変更可能である場合(is_modifiable_class_ptrJNI_TRUEを返した場合)、そのクラスは、RedefineClassesを使って再定義したり(エージェントがcan_redefine_classes権限を所有していると仮定)、RetransformClassesを使って再変換したり(エージェントがcan_retransform_classes権限を所有していると仮定)できます。あるクラスが変更不可能である場合(is_modifiable_class_ptrJNI_FALSEを返した場合)、そのクラスは再定義することも再変換することもできません。

プリミティブ・クラス(java.lang.Integer.TYPEなど)と配列クラスが変更可能になることはありません。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 451.1

権限
必要な機能
任意の機能
権限 効果
can_redefine_any_class これを所有すると、すべてのクラス(プリミティブ・クラスと配列クラスは除く)が変更可能になる。
can_redefine_classes この関数の結果に何の影響も与えない。ただし、RedefineClassesを使ってクラスを変更するには、これを追加で所有している必要があります。
can_retransform_classes この関数の結果に何の影響も与えない。ただし、RetransformClassesを使ってクラスを変更するには、これを追加で所有している必要があります。

パラメータ
名前 説明
klassjclass 照会するクラス。
is_modifiable_class_ptrjboolean* 戻ったとき、この関数のboolean型の結果をポイントする。

エージェントはjbooleanへのポインタを渡す。戻ったとき、jbooleanが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER is_modifiable_class_ptrNULL

クラス・ローダーの取得

jvmtiError
GetClassLoader(jvmtiEnv* env,
            jclass klass,
            jobject* classloader_ptr)
klassで指定されたクラスのクラス・ローダーの参照を、classloader_ptrを介して返します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 571.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
classloader_ptrjobject* 戻ったとき、このクラスをロードしたクラス・ローダーをポイントする。クラスがクラス・ローダーで作成されていない場合、またはクラス・ローダーがブートストラップ・クラス・ローダーでない場合は、NULLをポイントする。

エージェントはjobjectへのポインタを渡す。戻ったとき、jobjectが設定されている。classloader_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_NULL_POINTER classloader_ptrNULL

ソース・デバッグ拡張機能の取得

jvmtiError
GetSourceDebugExtension(jvmtiEnv* env,
            jclass klass,
            char** source_debug_extension_ptr)
klassで指定されたクラスのデバッグ拡張機能を、source_debug_extension_ptrを介して返します。返される文字列には、klassのクラス・ファイルに存在するデバッグ拡張情報がそのまま含まれます。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 901.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_source_debug_extension クラスのソース・デバッグ拡張機能を取得できる。

パラメータ
名前 説明
klassjclass 照会するクラス。
source_debug_extension_ptrchar** 戻ったとき、クラスのデバッグ拡張機能(修正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_ptrNULL

クラスの再変換

jvmtiError
RetransformClasses(jvmtiEnv* env,
            jint class_count,
            const jclass* classes)
この関数は、すでにロード済みのクラスのバイト・コード・インストゥルメンテーションを容易にします。修正しながらデバッグを続けるためにソースから再コンパイルする場合のように、既存のバイト・コードを参照することなしにクラス定義を置換する場合は、代わりにRedefineClasses関数を使用するようにしてください。

クラスがはじめてロードされるときや再定義されるときに、その初期クラス・ファイル・バイトをClassFileLoadHookイベント経由で変換することができます。この関数は、以前に変換が行われたかどうかには関係なく、変換処理を再実行します。この再変換は次の手順で行われます。 詳細は、ClassFileLoadHookイベントを参照してください。

初期クラス・ファイル・バイトは、ClassLoader.defineClassまたはRedefineClassesに渡されたバイト(変換適用前)を表しますが、両者が厳密に一致しない可能性もあります。定数プールが、GetConstantPoolで説明した点で異なる可能性があります。メソッドのバイトコード内の定数プール・インデックスは対応します。一部の属性が存在しない可能性があります。メソッドの順序など、順序が意味を持たない場合には、順序が維持されないことがあります。

再変換を行うと、新しいバージョンのメソッドがインストールされる可能性があります。古いバージョンのメソッドは廃止される可能性があります。以降の呼出しでは新しいバージョンのメソッドが使用されます。メソッドがアクティブなスタック・フレームを持つ場合、それらのアクティブなスタック・フレームは元のメソッド・バージョンのバイト・コードを引き続き実行します。

この関数により、一般的なJVMセマンティックスのもとで行われる以外の初期化は起こりません。つまり、クラスを再変換しても、そのクラスの初期化は実行されません。staticフィールドの値は、呼出し前の状態のままです。

スレッドを中断する必要はありません。

クラス内のブレークポイントは解除されます。

属性はすべて更新されます。

再変換されたクラスのインスタンスは影響を受けません。各フィールドは以前の値を維持します。インスタンス上のタグも影響を受けません。

この呼び出しへの応答として、ClassFileLoadHook以外のイベントが送信されることはありません。

再変換では、メソッド本体、定数プール、属性を変更できます。再変換では、フィールドまたはメソッドの追加、削除、名前変更、メソッドのシグネチャの変更、修飾子の変更、継承の変更を行わないようにする必要があります。これらの制限は将来のバージョンで解除される可能性があります。未サポートの再変換が試みられた場合に返されるエラー・コードについては、後述のエラー戻り値の説明を参照してください。クラス・ファイルのバイトが検証またはインストールされるのは、それらのバイトがClassFileLoadHookイベントのチェーンを通過した後なので、返されるエラー・コードは再変換の結果を反映したものになります。JVMTI_ERROR_NONE以外のエラー・コードが返された場合、再変換対象のどのクラスについても、新しい定義がインストールされることはありません。この関数が(エラー・コードJVMTI_ERROR_NONEで)復帰した場合は、再変換対象のすべてのクラスで新しい定義がインストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1521.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_retransform_classes RetransformClassesでクラスを再変換できる。特定の実装によって適用されるこの権限の制限(「権限」セクションを参照)に加え、この権限は、この環境でClassFileLoadHookイベントがはじめて有効化される前に設定する必要がある。ClassFileLoadHookがはじめて有効化された時点でこの権限を所有している環境を「再変換可能」と呼ぶ。ClassFileLoadHookがはじめて有効化された時点でこの権限を所有していない環境を「再変換不可能」と呼ぶ。
任意の機能
can_retransform_any_class RetransformClassesを任意のクラスで呼び出せる(can_retransform_classesも設定する必要がある)

パラメータ
名前 説明
class_countjint 再変換されるクラスの数。
classesconst jclass* 再変換されるクラスの配列。

エージェントはjclassclass_count要素の配列を渡す。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_retransform_classesを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_UNMODIFIABLE_CLASS 変更不可能なクラスがclassesに含まれている。IsModifiableClassを参照。
JVMTI_ERROR_INVALID_CLASS classesのいずれかが有効なクラスでない。
JVMTI_ERROR_UNSUPPORTED_VERSION 再変換されるクラス・ファイルのバージョン番号がこのVMでサポートされていない。
JVMTI_ERROR_INVALID_CLASS_FORMAT 再変換されるクラス・ファイルの形式が正しくない(VMはClassFormatErrorを返す)。
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION 再変換されるクラス・ファイルの定義が循環定義になる(VMはClassCircularityErrorを返す)。
JVMTI_ERROR_FAILS_VERIFICATION 再変換されるクラス・ファイルのバイトが検証に失敗する。
JVMTI_ERROR_NAMES_DONT_MATCH 再変換されるクラス・ファイル内で定義されたクラス名が、旧クラス・オブジェクト内の名前と異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED 再変換されるクラス・ファイルでメソッドの追加が必要。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 再変換されるクラス・ファイルによってフィールドが変更される。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED 再変換されるクラス・ファイルの直接スーパー・クラスが異なる、または直接実装されているインタフェースが異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED 再変換されるクラス・ファイルでは旧クラスのバージョンで宣言したメソッドを宣言しない。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED 再変換されたクラス・ファイルに異なるクラス修飾子が含まれている。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED 再変換されるクラス・ファイルのメソッドの修飾子が旧クラスのバージョンの修飾子と異なる。
JVMTI_ERROR_ILLEGAL_ARGUMENT class_count0より小さい。
JVMTI_ERROR_NULL_POINTER classesNULL

クラスの再定義

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イベントは送信されません。

再定義では、メソッド本体、定数プール、属性を変更できます。再定義では、フィールドまたはメソッドの追加、削除、名前変更、メソッドのシグネチャの変更、修飾子の変更、継承の変更を行わないようにする必要があります。これらの制限は将来のバージョンで解除される可能性があります。未サポートの再定義が試みられた場合に返されるエラー・コードについては、後述のエラー戻り値の説明を参照してください。クラス・ファイルのバイトが検証またはインストールされるのは、それらのバイトがClassFileLoadHookイベントのチェーンを通過した後なので、返されるエラー・コードは、class_definitionsに渡されたバイトに適用された変換の結果を反映したものになります。JVMTI_ERROR_NONE以外のエラー・コードが返された場合、再定義対象のどのクラスについても、新しい定義がインストールされることはありません。この関数が(エラー・コードJVMTI_ERROR_NONEで)復帰した場合は、再定義対象のすべてのクラスで新しい定義がインストールされます。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 871.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_redefine_classes RedefineClassesでクラスを再定義できる。
任意の機能
can_redefine_any_class プリミティブ・クラスでも配列クラスでもない任意のクラスを変更(再変換または再定義)できる。IsModifiableClassを参照。

jvmtiClassDefinition - クラスの再定義の説明
フィールド 説明
klassjclass このクラスのクラス・オブジェクト
class_byte_countjint 定義するクラスのバイト数(下)
class_bytesconst unsigned char* クラスを定義するバイト(Java(tm)仮想マシン仕様の第4章を参照)

パラメータ
名前 説明
class_countjint class_definitionsで指定されたクラスの数
class_definitionsconst jvmtiClassDefinition* 新しいクラス定義の配列

エージェントはjvmtiClassDefinitionclass_count要素の配列を渡す。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_redefine_classesを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_NULL_POINTER class_bytesのいずれかがNULLの場合。
JVMTI_ERROR_UNMODIFIABLE_CLASS class_definitionsの要素は変更できない。IsModifiableClassを参照。
JVMTI_ERROR_INVALID_CLASS class_definitionsの要素が有効なクラスではない。
JVMTI_ERROR_UNSUPPORTED_VERSION 新しいクラス・ファイルのバージョンがこのVMでサポートされていない。
JVMTI_ERROR_INVALID_CLASS_FORMAT 新しいクラス・ファイルの形式が正しくない(VMはClassFormatErrorを返す)。
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION 新しいクラス・ファイルの定義が循環定義になる(VMはClassCircularityErrorを返す)。
JVMTI_ERROR_FAILS_VERIFICATION クラス・バイトが検証に失敗する。
JVMTI_ERROR_NAMES_DONT_MATCH 新しいクラス・ファイル内で定義されたクラス名が、旧クラス・オブジェクト内の名前と異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED 新しいクラス・ファイルでメソッドの追加が必要。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 新しいクラスのバージョンによってフィールドが変更される。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED 新しいクラスのバージョンの直接スーパー・クラスが異なる、または直接実装されているインタフェースが異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED 新しいクラスのバージョンでは旧クラスのバージョンで宣言したメソッドを宣言しない。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED 新しいクラスのバージョンの修飾子が異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED 新しいクラスのバージョンのメソッドの修飾子が旧クラスのバージョンの修飾子と異なる。
JVMTI_ERROR_ILLEGAL_ARGUMENT class_count0より小さい。
JVMTI_ERROR_NULL_POINTER class_definitionsNULL


オブジェクト

オブジェクト関数: オブジェクトの型:


オブジェクト・サイズの取得

jvmtiError
GetObjectSize(jvmtiEnv* env,
            jobject object,
            jlong* size_ptr)
objectで示されたオブジェクトについて、オブジェクトのサイズをsize_ptr経由で返します。このサイズは、このオブジェクトにより消費されるストレージの容量の実装固有の近似値です。これは、オブジェクトのオーバーヘッドの一部または全部を含む可能性があるため、実装内での比較には役立ちますが、実装間の比較には役立ちません。この近似値は、JVMの単一呼出しの間に変わる可能性があります。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1541.0

権限
必要な機能

パラメータ
名前 説明
objectjobject 照会するオブジェクト。
size_ptrjlong* 戻ったとき、オブジェクトのサイズ(バイト単位)をポイントする。

エージェントはjlongへのポインタを渡す。戻ったとき、jlongが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_OBJECT objectがオブジェクトではない。
JVMTI_ERROR_NULL_POINTER size_ptrNULL

オブジェクトのハッシュ・コードの取得

jvmtiError
GetObjectHashCode(jvmtiEnv* env,
            jobject object,
            jint* hash_code_ptr)
objectで示されたオブジェクトについて、ハッシュ・コードをhash_code_ptr経由で返します。このハッシュ・コードを使えばオブジェクト参照のハッシュ・テーブルを保守できますが、その場合、一部の実装でパフォーマンスが大幅に低下する可能性があります。ほとんどの場合、オブジェクトに情報を関連付けるための手段としては、タグのほうが効率的です。この関数は、特定のオブジェクトに対し、その存続期間を通じて同じハッシュ・コード値を保証します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 581.0

権限
必要な機能

パラメータ
名前 説明
objectjobject 照会するオブジェクト。
hash_code_ptrjint* 戻ったとき、オブジェクトのハッシュ・コードをポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_OBJECT objectがオブジェクトではない。
JVMTI_ERROR_NULL_POINTER hash_code_ptrNULL

オブジェクトのモニターの利用情報を取得

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構造体のフィールドに、モニターの使用に関する情報が入ります。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 591.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_monitor_info GetObjectMonitorUsageが可能

jvmtiMonitorUsage - オブジェクト・モニターの使用情報
フィールド 説明
ownerjthread このモニターを所有しているスレッド。このモニターが使用されていない場合はNULL
entry_countjint このモニターを所有するスレッドがモニターを使用した回数
waiter_countjint このモニターを所有する順番を待っているスレッドの数
waitersjthread* waiter_count待機スレッド
notify_waiter_countjint このモニターから通知を受ける待機スレッドの数
notify_waitersjthread* 通知を待っているnotify_waiter_countスレッド

パラメータ
名前 説明
objectjobject 照会するオブジェクト。
info_ptrjvmtiMonitorUsage* 戻ったとき、指定されたオブジェクトのモニター情報が入っている。

エージェントはjvmtiMonitorUsageへのポインタを渡す。戻ったとき、jvmtiMonitorUsageが設定されている。jvmtiMonitorUsageのフィールドownerで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。jvmtiMonitorUsagewaitersフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiMonitorUsageのフィールドwaitersで返されるオブジェクトはJNIローカル参照であり、管理する必要がある。jvmtiMonitorUsagenotify_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_ptrNULL


フィールド

フィールド関数:


フィールドの名前とシグニチャの取得

jvmtiError
GetFieldName(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)
klassfieldで指定されたフィールドについて、名前をname_ptrで返し、シグニチャをsignature_ptrで返します。

フィールドのシグニチャはJNI仕様で定義されており、Java(tm)仮想マシン仕様のセクション4.3.2ではfield descriptorsと呼ばれています。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 601.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するフィールドのクラス。
fieldjfieldID 照会するフィールド。
name_ptr char ** 戻ったとき、フィールド名(修正UTF-8文字列としてエンコードされる)をポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。name_ptrNULLの場合、名前は返されない。
signature_ptr char ** 戻ったとき、フィールドのシグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。signature_ptrNULLの場合、シグニチャは返されない。
generic_ptr char ** 戻ったとき、フィールドのジェネリック・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。フィールドのジェネリック・シグニチャ属性が存在しない場合は、戻ったときNULLをポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。generic_ptrNULLの場合、ジェネリックス・シグニチャは返されない。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_INVALID_FIELDID fieldがjfieldIDではない。

フィールドの宣言クラスの取得

jvmtiError
GetFieldDeclaringClass(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jclass* declaring_class_ptr)
klassfieldで指定されたフィールドについて、そのフィールドを定義しているクラスをdeclaring_class_ptrを介して返します。宣言しているクラスは、klass、スーパー・クラス、または実装されたインタフェースのいずれかです。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 611.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
fieldjfieldID 照会するフィールド。
declaring_class_ptrjclass* 戻ったとき、宣言するクラスをポイントする。

エージェントはjclassへのポインタを渡す。戻ったとき、jclassが設定されている。declaring_class_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_INVALID_FIELDID fieldがjfieldIDではない。
JVMTI_ERROR_NULL_POINTER declaring_class_ptrNULL

フィールドの修飾子の取得

jvmtiError
GetFieldModifiers(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jint* modifiers_ptr)
klassfieldで指定されたフィールドのアクセス・フラグを、modifiers_ptrを介して返します。アクセス・フラグは、Java(tm)仮想マシン仕様の第4章に定義されています。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 621.0

権限
必要な機能

パラメータ
名前 説明
klassjclass 照会するクラス。
fieldjfieldID 照会するフィールド。
modifiers_ptrjint* 戻ったとき、アクセス・フラグをポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_CLASS klassがクラス・オブジェクトでないか、クラスがアンロードされている。
JVMTI_ERROR_INVALID_FIELDID fieldがjfieldIDではない。
JVMTI_ERROR_NULL_POINTER modifiers_ptrNULL

合成フィールドかどうかの検査

jvmtiError
IsFieldSynthetic(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jboolean* is_synthetic_ptr)
klassおよびfieldで指定されたフィールドに対し、is_synthetic_ptrを介してそのフィールドが合成であるかどうかを示す値を返します。合成フィールドはコンパイラによって生成されますが、元のソース・コード内には存在しません。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 631.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_synthetic_attribute フィールドまたはメソッドが合成であるかどうかをテストできます - IsFieldSyntheticIsMethodSynthetic

パラメータ
名前 説明
klassjclass 照会するフィールドのクラス。
fieldjfieldID 照会するフィールド。
is_synthetic_ptrjboolean* 戻ったとき、この関数の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_ptrNULL


メソッド

メソッド関数: メソッドの型: これらの関数は、あるメソッド(jmethodIDとして表現)に関する情報を提供したり、メソッドの処理方法を設定したりします。

廃止メソッド

関数RetransformClassesおよびRedefineClassesを呼び出すと、新しいバージョンのメソッドがインストールされます。元のメソッド・バージョンと新しいメソッド・バージョンが同等と見なされるのは、次のような場合です。 新しいメソッド・バージョンと等価でない元のメソッド・バージョンは「廃止」と呼ばれ、新しいメソッドIDが割り当てられます。そして、元のメソッドIDは新しいメソッド・バージョンを指すようになります。廃止されたメソッドIDかどうかをテストするには、IsMethodObsoleteを使用します。


メソッドの名前とシグニチャの取得

jvmtiError
GetMethodName(jvmtiEnv* env,
            jmethodID method,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)
methodで指定されたメソッドの名前をname_ptrを介して返し、メソッドのシグニチャをsignature_ptrを介して返します。

メソッドのシグニチャはJNI仕様で定義されており、Java(tm)仮想マシン仕様のセクション4.3.3ではmethod descriptorsと呼ばれています。Java言語仕様に定義されたメソッドのシグニチャとは異なる点に注意してください。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 641.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
name_ptr char ** 戻ったとき、メソッド名(修正UTF-8文字列としてエンコードされる)をポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。name_ptrNULLの場合、名前は返されない。
signature_ptr char ** 戻ったとき、メソッド・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。signature_ptrNULLの場合、シグニチャは返されない。
generic_ptr char ** 戻ったとき、メソッドのジェネリック・シグニチャ(修正UTF-8文字列としてエンコードされる)をポイントする。メソッドのジェネリック・シグニチャ属性が存在しない場合は、戻ったときNULLをポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。generic_ptrNULLの場合、ジェネリックス・シグニチャは返されない。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。

メソッドの宣言クラスの取得

jvmtiError
GetMethodDeclaringClass(jvmtiEnv* env,
            jmethodID method,
            jclass* declaring_class_ptr)
methodで指定されたメソッドを定義するクラスを、declaring_class_ptrを介して返します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 651.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
declaring_class_ptrjclass* 戻ったとき、宣言するクラスをポイントする。

エージェントはjclassへのポインタを渡す。戻ったとき、jclassが設定されている。declaring_class_ptrから返されるオブジェクトはJNIローカル参照であり、管理する必要がある。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。
JVMTI_ERROR_NULL_POINTER declaring_class_ptrNULL

メソッドの修飾子の取得

jvmtiError
GetMethodModifiers(jvmtiEnv* env,
            jmethodID method,
            jint* modifiers_ptr)
methodで指定されたメソッドのアクセス・フラグを、modifiers_ptrを介して返します。アクセス・フラグは、Java(tm)仮想マシン仕様の第4章に定義されています。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 661.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
modifiers_ptrjint* 戻ったとき、アクセス・フラグをポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。
JVMTI_ERROR_NULL_POINTER modifiers_ptrNULL

局所変数の取得

jvmtiError
GetMaxLocals(jvmtiEnv* env,
            jmethodID method,
            jint* max_ptr)
methodで指定されたメソッドによって使用される局所変数(呼出し時にメソッドにパラメータを渡すために使用される局所変数を含む)のスロット数を返します。

Java(tm)仮想マシン仕様のセクション4.7.3max_localsの説明を参照してください。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 681.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
max_ptrjint* 戻ったとき、局所変数のスロットの最大数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。
JVMTI_ERROR_NATIVE_METHOD methodはネイティブ・メソッド。
JVMTI_ERROR_NULL_POINTER max_ptrNULL

引数のサイズの取得

jvmtiError
GetArgumentsSize(jvmtiEnv* env,
            jmethodID method,
            jint* size_ptr)
methodで指定されたメソッドの引数によって使用される局所変数のスロット数を、max_ptrを介して返します。なお、2ワードの引数は、スロットを2つ使用します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 691.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
size_ptrjint* 戻ったとき、引数のスロットの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。
JVMTI_ERROR_NATIVE_METHOD methodはネイティブ・メソッド。
JVMTI_ERROR_NULL_POINTER size_ptrNULL

行番号テーブルの取得

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を介して返されます。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 701.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_line_numbers メソッドの行番号テーブルを取得できる

jvmtiLineNumberEntry - 行番号テーブルのエントリ
フィールド 説明
start_locationjlocation 行を開始するjlocation
line_numberjint 行番号

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
entry_count_ptrjint* 戻ったとき、テーブル内のエントリの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
table_ptrjvmtiLineNumberEntry** 戻ったとき、行番号テーブルのポインタをポイントする。

エージェントは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_ptrNULL
JVMTI_ERROR_NULL_POINTER table_ptrNULL

メソッドの配置位置の取得

jvmtiError
GetMethodLocation(jvmtiEnv* env,
            jmethodID method,
            jlocation* start_location_ptr,
            jlocation* end_location_ptr)
methodで指定されたメソッドについて、その開始アドレスと終了アドレスをstart_location_ptrend_location_ptrを介して返します。従来のバイト・コード・インデックス・スキーマでは、start_location_ptrは常にゼロを、end_location_ptrは常にバイト・コードから1を引いた値をポイントします。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 711.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
start_location_ptrjlocation* 戻ったとき、最初の位置をポイントする。位置情報が得られない場合は-1をポイントする。情報が使用可能で、GetJLocationFormatからJVMTI_JLOCATION_JVMBCIが返される場合、これは常にゼロになる。

エージェントはjlocationへのポインタを渡す。戻ったとき、jlocationが設定されている。
end_location_ptrjlocation* 戻ったとき、最後の位置をポイントする。位置情報が得られない場合は-1をポイントする。

エージェントはjlocationへのポインタを渡す。戻ったとき、jlocationが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ABSENT_INFORMATION クラス情報にメソッドのサイズが含まれていない。
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。
JVMTI_ERROR_NATIVE_METHOD methodはネイティブ・メソッド。
JVMTI_ERROR_NULL_POINTER start_location_ptrNULL
JVMTI_ERROR_NULL_POINTER end_location_ptrNULL

局所変数テーブルの取得

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)
局所変数の情報を返します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 721.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_access_local_variables 局所変数を設定し、取得できる

jvmtiLocalVariableEntry - 局所変数テーブルのエントリ
フィールド 説明
start_locationjlocation この局所変数がはじめて有効になるコード配列インデックス(つまり、この局所変数はそこで値を持っていなければならない)。
lengthjint この局所変数の有効部分の長さ。この局所変数が有効である最後のコード配列インデックスは、start_location+lengthになる。
namechar* 局所変数名。修正UTF-8文字列としてエンコードされる。
signaturechar* 局所変数の型のシグネチャ。修正UTF-8文字列としてエンコードされる。このシグネチャの形式は、Java™仮想マシン仕様の4.3.2章で定義された形式と同じになる。
generic_signaturechar* 局所変数のジェネリック・シグネチャ。修正UTF-8文字列としてエンコードされる。ジェネリック型でないすべての局所変数について、このフィールドの値はNULLになる。
slotjint 局所変数のスロット。「局所変数」を参照。

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
entry_count_ptrjint* 戻ったとき、テーブル内のエントリの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
table_ptrjvmtiLocalVariableEntry** 戻ったとき、局所変数テーブルのエントリの配列をポイントする。

エージェントはjvmtiLocalVariableEntry*へのポインタを渡す。戻ったとき、jvmtiLocalVariableEntry*は、サイズ*entry_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。jvmtiLocalVariableEntrynameフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiLocalVariableEntrysignatureフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiLocalVariableEntrygeneric_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_ptrNULL
JVMTI_ERROR_NULL_POINTER table_ptrNULL

バイト・コードの取得

jvmtiError
GetBytecodes(jvmtiEnv* env,
            jmethodID method,
            jint* bytecode_count_ptr,
            unsigned char** bytecodes_ptr)
methodで指定されたメソッドを実装するバイト・コードを返します。バイト・コードの数は、bytecode_count_ptrを介して返されます。バイト・コード自体は、bytecodes_ptrを介して返されます。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 751.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_bytecodes メソッドGetBytecodesのバイト・コードを取得できる

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
bytecode_count_ptrjint* 戻ったとき、バイト・コードの配列の長さをポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
bytecodes_ptrunsigned 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_ptrNULL
JVMTI_ERROR_NULL_POINTER bytecodes_ptrNULL

ネイティブ・メソッドかどうかの検査

jvmtiError
IsMethodNative(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_native_ptr)
methodで指定されたメソッドがネイティブ・メソッドかどうかを表す値を、is_native_ptrを介して返します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 761.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
is_native_ptrjboolean* 戻ったとき、この関数のboolean型の結果をポイントする。

エージェントはjbooleanへのポインタを渡す。戻ったとき、jbooleanが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。
JVMTI_ERROR_NULL_POINTER is_native_ptrNULL

合成メソッドかどうかの検査

jvmtiError
IsMethodSynthetic(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_synthetic_ptr)
methodで指定されたメソッドが合成メソッドかどうかを表す値を、is_synthetic_ptrを介して返します。合成メソッドは、コンパイラによって生成されますが、元のソース・コード内には存在しません。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 771.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_synthetic_attribute フィールドまたはメソッドが合成であるかどうかをテストできます - IsFieldSyntheticIsMethodSynthetic

パラメータ
名前 説明
methodjmethodID 照会するメソッド。
is_synthetic_ptrjboolean* 戻ったとき、この関数の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_ptrNULL

廃棄されたメソッドかどうかの検査

jvmtiError
IsMethodObsolete(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_obsolete_ptr)
メソッドIDが廃止メソッド・バージョンを参照しているかどうかを判定します。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 911.0

権限
必要な機能

パラメータ
名前 説明
methodjmethodID 照会するメソッドID。
is_obsolete_ptrjboolean* 戻ったとき、この関数のboolean型の結果をポイントする。

エージェントはjbooleanへのポインタを渡す。戻ったとき、jbooleanが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_METHODID methodがjmethodIDではない。
JVMTI_ERROR_NULL_POINTER is_obsolete_ptrNULL

ネイティブ・メソッド接頭辞の設定

jvmtiError
SetNativeMethodPrefix(jvmtiEnv* env,
            const char* prefix)
この関数は、名前に接頭辞を適用して再試行できるようにすることにより、ネイティブ・メソッド解決のエラー処理を変更します。これをClassFileLoadHookイベントと組み合わせて使用すれば、ネイティブ・メソッドの計測が可能になります。

ネイティブ・メソッドはバイト・コードを持たないので、直接計測できません。したがって、計測可能なネイティブでないメソッドでネイティブ・メソッドをラップする必要があります。たとえば次を考えます。
native boolean foo(int x);

これが次のようになるように、(ClassFileLoadHookイベントを使って)クラス・ファイルを変換できます。
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に解決する必要があります。
Java_somePackage_someClass_foo(JNIEnv* env, jint x)

この関数を使えば、接頭辞を指定し、適切な解決が行われるようにできます。具体的には、標準の解決が失敗した場合に、接頭辞を考慮して再び解決が試みられます。解決方法は2つあります。JNI関数RegisterNativesによる明示的な解決と、通常の自動解決です。RegisterNativesの場合、VMは次の関連付けを試みます。
method(foo) -> nativeImplementation(foo)

これに失敗すると、指定された接頭辞をメソッド名の先頭に追加して解決が再試行され、次のような正しい解決が得られます。
method(wrapped_foo) -> nativeImplementation(foo)

自動解決の場合、VMは次を試みます。
method(wrapped_foo) -> nativeImplementation(wrapped_foo)

これに失敗すると、指定された接頭辞を実装名から削除して解決が再試行され、次の正しい解決が得られます。
method(wrapped_foo) -> nativeImplementation(foo)

接頭辞が使用されるのは標準の解決が失敗した場合だけなので、ネイティブ・メソッドのラップは選択的に行えます。

各JVM TI環境は独立しており、それぞれが独自のバイト・コード変換を行えるため、複数の層のラッパーが適用される可能性があります。したがって、環境ごとに異なる接頭辞が必要になります。変換は順番に適用されるため、接頭辞を適用する場合、接頭辞は変換と同じ順番で適用されます。変換の適用順については、ClassFileLoadHookイベントを参照してください。つまり、3つの環境がラッパーを適用した場合、foo$env3_$env2_$env1_fooのようになります。しかし、たとえば2番目の環境がfooにラッパーを適用しなかった場合は、単に$env3_$env1_fooとなります。接頭辞のシーケンスを効率的に決定できるようにするため、途中の接頭辞は、そのネイティブでないラッパーが存在する場合にのみ適用されます。つまりこの例では、$env1_fooがネイティブ・メソッドでなくても、$env1_fooが存在するため$env1_接頭辞が適用されます。

接頭辞は解決時に使用されますが、その解決はいつでも遅延される可能性があります。したがって、ネイティブ・メソッドの接頭辞は、対応する接頭辞付きのネイティブ・メソッドが存在しているかぎり、設定されたままにしておく必要があります。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 731.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_set_native_method_prefix ネイティブ・メソッドを解決できない場合に適用すべき接頭辞を設定できる - SetNativeMethodPrefixおよびSetNativeMethodPrefixes

パラメータ
名前 説明
prefixconst char * 適用する接頭辞。修正UTF-8文字列としてエンコードされる。

エージェントは、charの配列を渡す。prefixNULLの場合、この環境の既存の接頭辞が取り消される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_set_native_method_prefixを持たない。AddCapabilitiesを使用する。

複数のネイティブ・メソッド接頭辞の設定

jvmtiError
SetNativeMethodPrefixes(jvmtiEnv* env,
            jint prefix_count,
            char** prefixes)
通常のエージェントの場合、SetNativeMethodPrefixが、ネイティブ・メソッドの接頭辞設定に必要とされるすべての機能を提供します。複数の独立したクラス・ファイル変換を実行するメタエージェント(別の層のエージェントのプロキシとしてのエージェントなど)の場合、この関数を使うと、各変換に独自の接頭辞を割り当てることができます。接頭辞は、指定された順番で適用され、SetNativeMethodPrefixで説明した、複数のJVM TI環境からの接頭辞の適用方法と同じ方法で処理されます。

以前の接頭辞はすべて置換されます。したがって、prefix_count0を指定してこの関数を呼び出すと、この環境の接頭辞機能が無効になります。

SetNativeMethodPrefixとこの関数が、接頭辞を設定するための2つの方法です。1つの接頭辞を指定してSetNativeMethodPrefixを呼び出すのは、prefix_count1を指定してこの関数を呼び出すのと同じです。NULLを指定してSetNativeMethodPrefixを呼び出すのは、prefix_count0を指定してこの関数を呼び出すのと同じです。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 741.1

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_set_native_method_prefix ネイティブ・メソッドを解決できない場合に適用すべき接頭辞を設定できる - SetNativeMethodPrefixおよびSetNativeMethodPrefixes

パラメータ
名前 説明
prefix_countjint 適用する接頭辞の数。
prefixes char ** この環境で適用する接頭辞。それぞれ修正UTF-8文字列としてエンコードされる。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_set_native_method_prefixを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_ILLEGAL_ARGUMENT prefix_count0より小さい。
JVMTI_ERROR_NULL_POINTER prefixesNULL


rawモニター

rawモニター関数:


rawモニターの作成

jvmtiError
CreateRawMonitor(jvmtiEnv* env,
            const char* name,
            jrawMonitorID* monitor_ptr)
rawモニターを作成します。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 311.0

権限
必要な機能

パラメータ
名前 説明
nameconst char* モニターを識別する名前。修正UTF-8文字列としてエンコードされる。

エージェントは、charの配列を渡す。
monitor_ptrjrawMonitorID* 戻ったとき、作成されたモニターをポイントする。

エージェントはjrawMonitorIDへのポインタを渡す。戻ったとき、jrawMonitorIDが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER nameNULL
JVMTI_ERROR_NULL_POINTER monitor_ptrNULL

rawモニターの破棄

jvmtiError
DestroyRawMonitor(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターを破棄します。破棄されるモニターがこのスレッドによって入力された場合、破棄される前に終了します。破棄されるモニターが別のスレッドによって入力された場合、エラーが返され、モニターの破棄は行われません。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 321.0

権限
必要な機能

パラメータ
名前 説明
monitorjrawMonitorID モニター

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NOT_MONITOR_OWNER モニターの所有者ではない。
JVMTI_ERROR_INVALID_MONITOR monitorがjrawMonitorIDではない。

rawモニターの開始

jvmtiError
RawMonitorEnter(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターの排他的所有権を取得します。同じスレッドで複数回モニターを入力することができます。スレッドは、モニターを入力回数分だけ終了する必要があります。モニターがOnLoad (接続されたスレッドが生成される前)の段階で入力され、接続されたスレッドが生成された時点で終了していない場合、入力はメイン・スレッドで行われたと認識されます。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 331.0

権限
必要な機能

パラメータ
名前 説明
monitorjrawMonitorID モニター

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_MONITOR monitorがjrawMonitorIDではない。

rawモニターの終了

jvmtiError
RawMonitorExit(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターの排他的所有権を解放します。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 341.0

権限
必要な機能

パラメータ
名前 説明
monitorjrawMonitorID モニター

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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が経過するまで、現在のスレッドを待機させます。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 351.0

権限
必要な機能

パラメータ
名前 説明
monitorjrawMonitorID モニター
millisjlong タイム・アウト(ミリ秒単位)。タイム・アウトがゼロの場合、実際の時間は考慮されず、スレッドは単に通知されるまで待機する。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NOT_MONITOR_OWNER モニターの所有者ではない。
JVMTI_ERROR_INTERRUPT 待機中に割込みが発生したため、再試行の必要あり。
JVMTI_ERROR_INVALID_MONITOR monitorがjrawMonitorIDではない。

rawモニターの通知

jvmtiError
RawMonitorNotify(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターを待機中の1つのスレッドに通知します。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 361.0

権限
必要な機能

パラメータ
名前 説明
monitorjrawMonitorID モニター

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NOT_MONITOR_OWNER モニターの所有者ではない。
JVMTI_ERROR_INVALID_MONITOR monitorがjrawMonitorIDではない。

rawモニターの通知(すべて)

jvmtiError
RawMonitorNotifyAll(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターを待機中のすべてのスレッドに通知します。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 371.0

権限
必要な機能

パラメータ
名前 説明
monitorjrawMonitorID モニター

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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として定義されるため、コンパイラによっては最適化によってテーブルへのアクセス機能が除去され、その結果、この関数が無効になる可能性があります。テーブルはコピーされます。テーブルのローカル・コピーを変更しても、何の効果もありません。この関数の影響を受けるのは関数テーブルのみであり、環境の他の側面はすべて何の影響も受けません。前述の例を参照してください。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1201.0

権限
必要な機能

パラメータ
名前 説明
function_tableconst jniNativeInterface * 新しいJNI関数テーブルをポイントする。

エージェントはjniNativeInterfaceへのポインタを渡す。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER function_tableNULL

JNI関数テーブルの取得

jvmtiError
GetJNIFunctionTable(jvmtiEnv* env,
            jniNativeInterface** function_table)
JNI関数テーブルを取得します。JNI関数テーブルは、割り当てられたメモリーにコピーされます。SetJNIFunctionTableが呼び出されていた場合、(元の関数テーブルではなく)変更後の関数テーブルが返されます。コピーされるのは関数テーブルのみであり、環境の他の側面はコピーされません。前述の例を参照してください。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない いいえ 1211.0

権限
必要な機能

パラメータ
名前 説明
function_table jniNativeInterface ** 戻ったとき、*function_tableは新しく割り当てられたJNI関数テーブルのコピーをポイントする。

エージェントはjniNativeInterface*へのポインタを渡す。戻り時に、jniNativeInterface*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER function_tableNULL


イベント管理

イベント管理関数: イベント管理の型:


イベント・コールバックの設定

jvmtiError
SetEventCallbacks(jvmtiEnv* env,
            const jvmtiEventCallbacks* callbacks,
            jint size_of_callbacks)
イベントごとに呼び出される関数を設定します。コールバックを指定するには、置換用の関数テーブルを提供します。関数テーブルはコピーされます。テーブルのローカル・コピーを変更しても、何の効果もありません。これはアトミックなアクションであり、一度にすべてのコールバックが設定されます。この関数を呼び出すまで、イベントは送信されません。エントリがNULLの場合またはイベントがsize_of_callbacksを超えている場合、イベントは送信されません。イベントの詳細は、このドキュメントの後のほうで説明します。イベントが送信されるためには、イベントを有効化し、そのコールバックを登録する必要があります。この関数とSetEventNotificationModeの呼出し順序は、結果に影響を与えません。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1221.0

権限
必要な機能

パラメータ
名前 説明
callbacksconst jvmtiEventCallbacks * 新しいイベント・コールバック。

エージェントはjvmtiEventCallbacksへのポインタを渡す。callbacksNULLの場合、既存のコールバックは削除される。
size_of_callbacksjint sizeof(jvmtiEventCallbacks)-- バージョン間の互換性を実現。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ILLEGAL_ARGUMENT size_of_callbacks0より小さい。

イベント通知モードの設定

typedef enum {
    JVMTI_ENABLE = 1,
    JVMTI_DISABLE = 0
} jvmtiEventMode;
jvmtiError
SetEventNotificationMode(jvmtiEnv* env,
            jvmtiEventMode mode,
            jvmtiEvent event_type,
            jthread event_thread,
             ...)
イベントの生成を制御します。
イベントの有効化と無効化(jvmtiEventMode)
定数 説明
JVMTI_ENABLE1 modeJVMTI_ENABLEの場合、イベントevent_typeが有効化される
JVMTI_DISABLE0 modeJVMTI_DISABLEの場合、イベントevent_typeが無効化される
threadNULLの場合、イベントの有効化または無効化はグローバルに行われます。それ以外の場合、その有効化または無効化は特定のスレッドに対して行われます。あるイベントが特定のスレッドで生成されるのは、そのイベントがスレッド・レベル、グローバル・レベルのいずれかで有効化された場合です。

個々のイベントについての情報は、後述する説明を参照してください。

次のイベントは、この関数を使ってスレッド・レベルでは制御できません。

最初は、スレッド・レベルで有効にされているイベントも、グローバル・レベルで有効にされているイベントもありません。

この関数を呼び出す前に、必要な権限(後述の「イベントを有効化する権限」を参照)を所有している必要があります。

イベントの詳細については、後述します。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 21.0

権限
必要な機能
イベントを有効化する権限
権限 イベント
can_generate_field_modification_eventsFieldModification
can_generate_field_access_eventsFieldAccess
can_generate_single_step_eventsSingleStep
can_generate_exception_eventsException
ExceptionCatch
can_generate_frame_pop_eventsFramePop
can_generate_breakpoint_eventsBreakpoint
can_generate_method_entry_eventsMethodEntry
can_generate_method_exit_eventsMethodExit
can_generate_compiled_method_load_eventsCompiledMethodLoad
CompiledMethodUnload
can_generate_monitor_eventsMonitorContendedEnter
MonitorContendedEntered
MonitorWait
MonitorWaited
can_generate_vm_object_alloc_eventsVMObjectAlloc
can_generate_native_method_bind_eventsNativeMethodBind
can_generate_garbage_collection_eventsGarbageCollectionStart
GarbageCollectionFinish
can_generate_object_free_eventsObjectFree

パラメータ
名前 説明
modejvmtiEventMode JVMTI_ENABLEまたはJVMTI_DISABLE
event_typejvmtiEvent 制御するイベント
event_thread jthread 制御するスレッド

event_threadNULLの場合、イベントはグローバル・レベルで制御される。
...... 将来の拡張用

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_INVALID_THREAD event_threadNULL以外で、有効なスレッドでない。
JVMTI_ERROR_THREAD_NOT_ALIVE event_threadNULL以外で、ライブ・スレッドではない(まだ起動していないか、すでに終了している)。
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_typeJVMTI_EVENT_COMPILED_METHOD_LOADの場合、現在コンパイル済のメソッドごとにCompiledMethodLoadイベントが送信されます。過去にロードされたが現在はアンロード済であるようなメソッドは、送信されません。以前に送信されたイベントの履歴は、この関数で送信されるイベントに影響を与えません。たとえば、この関数を呼び出すたびに、現在コンパイル済のすべてのメソッドが送信されます。

エージェントがプログラムの実行開始後に接続されたことにより、イベントが失われた場合は、この関数を使って失われたイベントを生成できます。

Javaプログラミング言語コードまたはJNI関数の実行の試みは、この関数が復帰するまで一時停止される可能性があるので、どちらもイベント送信スレッドから呼び出すべきではありません。不足するイベントが送信されて処理され、復帰するまで、この関数は復帰しません。イベントは、発生元のスレッドとは別のスレッド上で送信される場合があります。SetEventCallbacksでイベントのコールバックを設定し、SetEventNotificationModeでイベントを有効化しないと、イベントは発生しません。要求されたイベントの一部または全部を生成するための情報がVMにもう残っていない場合、単にイベントが送信されず、エラーも返されません。

サポートされるイベントは次のとおりです。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1231.0

権限
必要な機能
任意の機能
権限 効果
can_generate_compiled_method_load_events メソッドのコンパイル時またはアンロード時にイベントを生成できる

パラメータ
名前 説明
event_typejvmtiEvent 生成するイベントのタイプ。次のいずれかとする。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY event_typeJVMTI_EVENT_COMPILED_METHOD_LOADで、can_generate_compiled_method_load_eventsfalse
JVMTI_ERROR_ILLEGAL_ARGUMENT event_typeJVMTI_EVENT_COMPILED_METHOD_LOADでもJVMTI_EVENT_DYNAMIC_CODE_GENERATEDでもない。
JVMTI_ERROR_INVALID_EVENT_TYPE event_typeがjvmtiEventではない。


拡張機能メカニズム

拡張機能メカニズム関数: 拡張機能メカニズムの関数型: 拡張機能メカニズムの型: JVM TI実装は、これらの関数を使って、この仕様に定義されていない関数およびイベントを提供します。

拡張関数と拡張イベントのパラメータは、それぞれ次の表に示す「型」と「種類」を持ちます。
拡張関数/イベント・パラメータの型(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_okjboolean NULL引数を許可するか。ポインタ型とオブジェクト型のみに適用。


拡張関数

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またはライブ段階でしか呼び出せない いいえ 1241.0

権限
必要な機能

jvmtiExtensionFunctionInfo - 拡張関数情報
フィールド 説明
func jvmtiExtensionFunction 呼び出される実際の関数
idchar* 拡張関数の識別子。修正UTF-8文字列としてエンコードされる。パッケージの命名規則を使用する。例: com.sun.hotspot.bar
short_descriptionchar* 関数を1文で説明。修正UTF-8文字列でエンコードされる。
param_countjint jvmtiEnv *jvmti_envを除くパラメータ数
params jvmtiParamInfo * param_countパラメータの配列(jvmtiEnv *jvmti_envは除外)
error_countjint エラー戻り値の数(汎用エラーを除く)
errors jvmtiError * error_countのエラーの配列

パラメータ
名前 説明
extension_count_ptrjint* 戻ったとき、拡張関数の数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
extensionsjvmtiExtensionFunctionInfo** 拡張関数情報の配列を、関数ごとに1つずつ返す。

エージェントはjvmtiExtensionFunctionInfo*へのポインタを渡す。戻ったとき、jvmtiExtensionFunctionInfo*は、サイズ*extension_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。jvmtiExtensionFunctionInfoidフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiExtensionFunctionInfoshort_descriptionフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiExtensionFunctionInfoparamsフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiParamInfonameフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiExtensionFunctionInfoerrorsフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER extension_count_ptrNULL
JVMTI_ERROR_NULL_POINTER extensionsNULL

拡張イベントの取得

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またはライブ段階でしか呼び出せない いいえ 1251.0

権限
必要な機能

jvmtiExtensionEventInfo - 拡張イベント情報
フィールド 説明
extension_event_indexjint イベントを識別するインデックス
idchar* 拡張イベントの識別子。修正UTF-8文字列としてエンコードされる。パッケージの命名規則を使用する。例: com.sun.hotspot.bar
short_descriptionchar* イベントを1文で説明。修正UTF-8文字列としてエンコードされる。
param_countjint jvmtiEnv *jvmti_envを除くパラメータ数
params jvmtiParamInfo * param_countパラメータの配列(jvmtiEnv *jvmti_envは除外)

パラメータ
名前 説明
extension_count_ptrjint* 戻ったとき、拡張イベントの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
extensionsjvmtiExtensionEventInfo** 拡張イベント情報の配列を、イベントごとに1つずつ返す。

エージェントはjvmtiExtensionEventInfo*へのポインタを渡す。戻ったとき、jvmtiExtensionEventInfo*は、サイズ*extension_count_ptrの新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。jvmtiExtensionEventInfoidフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiExtensionEventInfoshort_descriptionフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiExtensionEventInfoparamsフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。jvmtiParamInfonameフィールドに返されるポインタは、新しく割り当てられた配列。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER extension_count_ptrNULL
JVMTI_ERROR_NULL_POINTER extensionsNULL

拡張イベント

typedef void (JNICALL *jvmtiExtensionEvent)
    (jvmtiEnv* jvmti_env, 
      ...);
実装固有のイベントです。イベント・ハンドラの設定には、SetExtensionEventCallbackを使用します。

拡張イベントのイベント・ハンドラは、この定義に一致するような宣言型の可変引数でなければなりません。宣言型の可変引数でない場合、一部のプラットフォームで、呼出し規則の不一致や未定義の動作が発生する可能性があります。

たとえば、GetExtensionEventsから返されたjvmtiParamInfoに、jintパラメータの存在が示されている場合、イベント・ハンドラを次のように宣言する必要があります。
    void JNICALL myHandler(jvmtiEnv* jvmti_env, jint myInt, ...)
最後の「...」は可変引数を表します。

パラメータ
名前 説明
jvmti_env jvmtiEnv * JVM TI環境は、拡張イベントの唯一の固定パラメータ。
...... 拡張イベント固有のパラメータ

拡張イベント・コールバックの設定

jvmtiError
SetExtensionEventCallback(jvmtiEnv* env,
            jint extension_event_index,
            jvmtiExtensionEvent callback)
拡張イベントにコールバック関数を設定し、イベントを有効にします。コールバックがNULLの場合、イベントを無効にします。標準イベントとは異なり、コールバックを設定してイベントを有効にする処理は単一の操作です。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1261.0

権限
必要な機能

パラメータ
名前 説明
extension_event_indexjint 設定するコールバックを識別する。このインデックスは、jvmtiExtensionEventInfoextension_event_indexフィールド。
callback jvmtiExtensionEvent callbackNULL以外の場合、callbackをイベント・コールバック関数に設定し、イベントを有効にする。

callbackNULLの場合、イベントを無効にする。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ILLEGAL_ARGUMENT extension_event_indexGetExtensionEventsから返されたextension_event_indexでない。


権限

権限関数: 権限の型: 権限関数では、JVM TIが使用できる機能(どのJVM TI関数を呼び出せるか、どんなイベントを生成できるか、これらのイベントや関数がどんな機能を提供できるかなど)を変更できます。

各関数およびイベントの「権限」のセクションには、関連付けられている権限の説明が記載されています(存在する場合)。「必要な機能」は、使用可能であり、権限を追加しなくても使用できることを表しています。「任意の機能」は、使用するためにはエージェントに権限が必要であることを表しています。権限を持つためには、エージェントは権限を追加する必要があります。「任意の機能」には、機能セットを拡張する権限の説明が記載されています。

各JVM TI実装が潜在的に使用できる権限は異なります。実装によって、次のようなことが言えます。 しばしば、権限を追加することによって、実行速度、起動時間、メモリー・フットプリントなどに影響が出ることがあります。権限を使用するオーバーヘッドは、権限を所有するオーバーヘッドとはまったく異なる点に注意してください。例として、ステップ実行について考えてみましょう。ステップ実行が有効な場合は(イベントが有効で、アクティブにイベントを送信している状態)、どの実装でも、各命令でイベントを送信し、処理するオーバーヘッドが大きくなります。一方、権限を所有するオーバーヘッドは、実装によって大きかったり小さかったりします。また、権限を使用できるかどうか、および追加できるタイミングは、実装によって異なります。使用例を次に示します。

各JVM TI環境は独自の権限セットを持ちます。最初、そのセットは空です。必要な権限をすべて追加する必要があります。権限の追加は、可能であれば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 : 7;
    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フィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch 1.0
can_generate_field_access_eventsフィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch 1.0
can_get_bytecodesメソッドGetBytecodesのバイト・コードを取得できる 1.0
can_get_synthetic_attributeフィールドまたはメソッドが合成であるかどうかをテストできる - IsFieldSyntheticIsMethodSynthetic 1.0
can_get_owned_monitor_infoモニターの所有に関する情報を取得できる - GetOwnedMonitorInfo 1.0
can_get_current_contended_monitor GetCurrentContendedMonitorが可能 1.0
can_get_monitor_info GetObjectMonitorUsageが可能 1.0
can_pop_frameスタックからフレームをポップできる - PopFrame 1.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_classプリミティブ・クラスでも配列クラスでもない任意のクラスを変更(再変換または再定義)できる。IsModifiableClassを参照。 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所有されているモニターに関する情報とスタックの深さを取得できる - GetOwnedMonitorStackDepthInfo 1.1
can_get_constant_poolあるクラスの定数プールを取得できる - GetConstantPool 1.1
can_set_native_method_prefixネイティブ・メソッドを解決できない場合に適用すべき接頭辞を設定できる - SetNativeMethodPrefixおよびSetNativeMethodPrefixes 1.1
can_retransform_classesRetransformClassesでクラスを再変換できる。特定の実装によって適用されるこの権限の制限(「権限」セクションを参照)に加え、この権限は、この環境でClassFileLoadHookイベントがはじめて有効化される前に設定する必要がある。ClassFileLoadHookがはじめて有効化された時点でこの権限を所有している環境を「再変換可能」と呼ぶ。ClassFileLoadHookがはじめて有効化された時点でこの権限を所有していない環境を「再変換不可能」と呼ぶ。 1.1
can_retransform_any_class RetransformClassesを任意のクラスで呼び出せる(can_retransform_classesも設定する必要がある) 1.1
can_generate_resource_exhaustion_heap_eventsVMがJavaTMプラットフォーム・ヒープからメモリーの割り当てを行えない場合に、イベントを生成できる。ResourceExhaustedを参照。 1.1
can_generate_resource_exhaustion_threads_eventsVMがスレッドを作成できない場合にイベントを生成できる。ResourceExhaustedを参照。 1.1


潜在的な権限の取得

jvmtiError
GetPotentialCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)
この時点でこの環境が所有できる可能性のあるJVM TI機能を、capabilities_ptr経由で返します。返される権限が、VMに実装された完全な権限セットと異なる場合が2つあります。1つの環境しか所有できない権限を別の環境が所有している場合と、現在の段階がライブであり、OnLoad段階でしか追加できない権限が存在している場合です。AddCapabilities関数を使えば、これらの権限のいずれかまたはすべてを設定できます。現在所有されている権限が含まれます。

通常、この関数は、OnLoad関数で使用されます。一部の仮想マシンでは、ライブ段階で追加できる権限のセットが制限されています。この場合、潜在的に使用可能な権限のセットが、OnLoad段階のセットとは異なります。

権限の例を参照してください。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1401.0

権限
必要な機能

パラメータ
名前 説明
capabilities_ptrjvmtiCapabilities* 戻ったとき、追加可能なJVM TIの権限をポイントする。

エージェントはjvmtiCapabilitiesへのポインタを渡す。戻ったとき、jvmtiCapabilitiesが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL

権限の追加

jvmtiError
AddCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)
*capabilities_ptr内で値が1に設定されている権限を追加することで、新しい権限を設定します。以前の権限はすべて保持されます。通常、この関数は、OnLoad関数で使用されます。一部の仮想マシンでは、ライブ段階で追加できる権限のセットが制限されています。

権限の例を参照してください。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1421.0

権限
必要な機能

パラメータ
名前 説明
capabilities_ptrconst jvmtiCapabilities* 追加するJVM TI権限をポイントする。

エージェントはjvmtiCapabilitiesへのポインタを渡す。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NOT_AVAILABLE 必要な権限が潜在的に使用可能な権限でない。
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL

権限の放棄

jvmtiError
RelinquishCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)
*capabilities_ptr内で値が1に設定されている権限を放棄します。実装によっては、単一の環境にしか権限の所有が許可されない場合があります(権限の概要を参照)。この関数は、その他のエージェントが使用できるように、権限を解放します。その他のすべての権限は保持されます。権限は、GetCapabilitiesからは失われます。エージェントが所有していない権限を放棄しようとしても、エラーは発生しません。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1431.0

権限
必要な機能

パラメータ
名前 説明
capabilities_ptrconst jvmtiCapabilities* 放棄するJVM TI権限をポイントする。

エージェントはjvmtiCapabilitiesへのポインタを渡す。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL

権限の取得

jvmtiError
GetCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)
capabilities_ptrを介して、この環境が現在所有している任意のJVM TI機能を返します。所有している各権限は、権限構造体の対応するフィールドの1によって示されます。環境は、AddCapabilitiesを使って追加に成功するまで、権限を所有しません。環境は、RelinquishCapabilitiesを使って放棄しないかぎり、権限を失いません。したがって、この関数は、AddCapabilities呼び出しとRelinquishCapabilities呼出しの最終結果を返します。

権限の例を参照してください。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 891.0

権限
必要な機能

パラメータ
名前 説明
capabilities_ptrjvmtiCapabilities* 戻ったとき、JVM TIの権限をポイントする。

エージェントはjvmtiCapabilitiesへのポインタを渡す。戻ったとき、jvmtiCapabilitiesが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL


タイマー

タイマー関数: タイマーの型: これらの関数は、タイミング情報を提供します。時間が更新される精度は指定されていません。ナノ秒単位の精度が提供されますが、必ずしもナノ秒単位の精密度が得られるとはかぎりません。最大値など、タイマーの詳細情報には、タイマー情報関数を使ってアクセスできます。

タイマー情報

各タイマーの情報関数は、このデータ構造体を返します。

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_forwardjboolean trueの場合、タイマーは外部で調整され、結果として前へスキップする。falseの場合、タイマーの値が実際の時間より速く増加することはない。
may_skip_backwardjboolean trueの場合、タイマーは外部で調整され、結果として後ろへスキップする。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の呼出し中に変化することはありません。

GetCurrentThreadCpuTimeGetThreadCpuTimeの実装は異なることがあり、そのためにGetCurrentThreadCpuTimerInfoGetThreadCpuTimerInfoによって返される値が異なることがあります。詳細については、GetCurrentThreadCpuTimeを参照してください。

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 1341.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_current_thread_cpu_time 現在のスレッドCPU時間を取得できる。

パラメータ
名前 説明
info_ptrjvmtiTimerInfo* 戻ったとき、GetCurrentThreadCpuTimeによって返される時間を説明する情報が入っている。

エージェントはjvmtiTimerInfoへのポインタを渡す。戻ったとき、jvmtiTimerInfoが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_get_current_thread_cpu_timeを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_NULL_POINTER info_ptrNULL

現在のスレッドのCPU時間を取得

jvmtiError
GetCurrentThreadCpuTime(jvmtiEnv* env,
            jlong* nanos_ptr)
現在のスレッドによって使用されているCPU時間を返します。

GetThreadCpuTime関数は、現在のスレッドを含むあらゆるスレッドのCPU時間を提供します。GetCurrentThreadCpuTimeは、現在のスレッドまたは現在のスレッドよりも精密な情報を持つスレッド以外のスレッドのCPU時間を提供できないプラットフォームをサポートします(GetCurrentThreadCpuTimerInfoGetThreadCpuTimerInfoを参照)。多くのプラットフォームでは、この呼出しは次のコードと同等です。
  GetThreadCpuTime(env, NULL, nanos_ptr)

段階コールバック安全位置導入されたバージョン
開始またはライブ段階でしか呼び出せない この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 1351.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_current_thread_cpu_time 現在のスレッドCPU時間を取得できる。

この権限がスレッドの開始後に有効になった場合、実装は、権限が有効になった時間以降の任意の時間を、CPU時間の収集を開始するポイントとして選択できる。

この権限は、can_get_thread_cpu_timeを潜在的に使用できるあらゆるプラットフォームで潜在的に使用可能。

パラメータ
名前 説明
nanos_ptrjlong* 戻ったとき、このスレッドによって使用されるCPU時間(ナノ秒単位)をポイントする。これは符号なしの値である。jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。

エージェントはjlongへのポインタを渡す。戻ったとき、jlongが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_get_current_thread_cpu_timeを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_NULL_POINTER nanos_ptrNULL

スレッドのCPUタイマー情報を取得

jvmtiError
GetThreadCpuTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
GetThreadCpuTimeタイマーの情報を取得します。jvmtiTimerInfo構造体のフィールドに、タイマーの詳細が入ります。この情報は、プラットフォームとGetThreadCpuTimeの実装に固有なので、スレッドごとに変化したり、VMの呼出し中に変化することはありません。

GetCurrentThreadCpuTimeGetThreadCpuTimeの実装は異なることがあり、そのためにGetCurrentThreadCpuTimerInfoGetThreadCpuTimerInfoによって返される値が異なることがあります。詳細については、GetCurrentThreadCpuTimeを参照してください。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1361.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_thread_cpu_time スレッドCPU時間を取得できる。

パラメータ
名前 説明
info_ptrjvmtiTimerInfo* 戻ったとき、GetThreadCpuTimeによって返される時間を説明する情報が入っている。

エージェントはjvmtiTimerInfoへのポインタを渡す。戻ったとき、jvmtiTimerInfoが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_get_thread_cpu_timeを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_NULL_POINTER info_ptrNULL

スレッドのCPU時間を取得

jvmtiError
GetThreadCpuTime(jvmtiEnv* env,
            jthread thread,
            jlong* nanos_ptr)
指定のスレッドによって使用されているCPU時間を返します。

GetThreadCpuTimerInfoにより、このタイマーの情報を取得します。

段階コールバック安全位置導入されたバージョン
ライブ段階でしか呼び出せない いいえ 1371.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_get_thread_cpu_time スレッドCPU時間を取得できる。

この権限がスレッドの開始後に有効になった場合、実装は、権限が有効になった時間以降の任意の時間を、CPU時間の収集を開始するポイントとして選択できる。

パラメータ
名前 説明
threadjthread 照会するスレッド。threadNULLの場合、現在のスレッドが使用される。
nanos_ptrjlong* 戻ったとき、指定されたスレッドによって使用されるCPU時間(ナノ秒単位)をポイントする。これは符号なしの値である。jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。

エージェントはjlongへのポインタを渡す。戻ったとき、jlongが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境は権限can_get_thread_cpu_timeを持たない。AddCapabilitiesを使用する。
JVMTI_ERROR_INVALID_THREAD threadはスレッド・オブジェクトではない。
JVMTI_ERROR_THREAD_NOT_ALIVE threadがライブ・スレッドではない(まだ起動していないか、すでに終了している)。
JVMTI_ERROR_NULL_POINTER nanos_ptrNULL

タイマー情報の取得

jvmtiError
GetTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
GetTimeタイマーの情報を取得します。jvmtiTimerInfo構造体のフィールドに、タイマーの詳細が入ります。この情報は、VMの呼出し中に変更されません。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 1381.0

権限
必要な機能

パラメータ
名前 説明
info_ptrjvmtiTimerInfo* 戻ったとき、GetTimeによって返される時間を説明する情報が入っている。

エージェントはjvmtiTimerInfoへのポインタを渡す。戻ったとき、jvmtiTimerInfoが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER info_ptrNULL

時間の取得

jvmtiError
GetTime(jvmtiEnv* env,
            jlong* nanos_ptr)
システム・タイマーの現在の値(ナノ秒単位)を返します。

返される値は、固定された任意の時間からのナノ秒を表します(固定された任意の時間が将来の時間である場合は負の値になる)。この関数では、ナノ秒単位の精度が提供されますが、必ずしもナノ秒単位の精密度が得られるとはかぎりません。値の変更頻度は保証されません。

GetTimerInfoにより、このタイマーの情報を取得します。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 1391.0

権限
必要な機能

パラメータ
名前 説明
nanos_ptrjlong* 戻ったとき、ナノ秒単位で時間をポイントする。これは符号なしの値である。jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。

エージェントはjlongへのポインタを渡す。戻ったとき、jlongが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER nanos_ptrNULL

使用可能なプロセッサの取得

jvmtiError
GetAvailableProcessors(jvmtiEnv* env,
            jint* processor_count_ptr)
Java仮想マシンが使用できるプロセッサの数を返します。

この値は、仮想マシンの呼出し中に変更される可能性があります。このため、使用可能なプロセッサの数に影響を受けるアプリケーションは、ときどきこのプロパティをポーリングする必要があります。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 1441.0

権限
必要な機能

パラメータ
名前 説明
processor_count_ptrjint* 戻ったとき、仮想マシンが使用できる最大プロセッサ数をポイントする(必ず1以上)。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER processor_count_ptrNULL


クラス・ローダー検索

クラス・ローダー検索の関数: これらの関数を使えば、エージェントは、クラス・ローダーがクラスを検索する際の場所を追加できます。これは、正しいクラス・ローダーでインストゥルメンテーションをインストールする際に便利です。


ブートストラップ・クラス・ローダー検索の追加

jvmtiError
AddToBootstrapClassLoaderSearch(jvmtiEnv* env,
            const char* segment)
この関数では、ブートストラップ・クラス・ローダーを使用してインストゥルメンテーション・クラスを定義できます。Java(tm)仮想マシン仕様のセクション5.3.1を参照してください。ブートストラップ・クラス・ローダーによるクラスの検索が失敗すると、指定されたプラットフォーム依存の検索パスsegmentも検索されます。segmentに指定できるセグメントは1つのみです。この関数を複数回呼び出せば、複数のセグメントを追加できます。セグメントの検索は、この関数が呼び出された順番で行われます。

OnLoad段階でこの関数を使うと、ブートストラップ・クラス・ローダーがクラスの検索に失敗した際に、追加で検索する任意のプラットフォーム依存の検索パス・セグメントを指定できます。このセグメントは通常、ディレクトリとJARファイルのいずれかになります。

ライブ段階でsegmentを使うと、任意のプラットフォーム依存のJARファイルへのパスを指定できます。ブートストラップ・クラス・ローダーがインストゥルメンテーション目的で定義するクラスやリソース以外のものがJARファイルに含まれないように、エージェントで確認するようにしてください。

Java(tm)仮想マシン仕様には、Java仮想マシンが以前にシンボリック参照を解決しようとして失敗した場合、その後このシンボリック参照を解決しようとしても、最初に解決しようとした結果としてスローされたエラーと同じエラーで必ず失敗すると記述されています。したがって、Java仮想マシンが参照を解決できなかったクラスに対応するエントリがJARファイルに含まれる場合、その参照を解決しようとしても最初のエラーと同じエラーで失敗します。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1491.0

権限
必要な機能

パラメータ
名前 説明
segmentconst char* プラットフォーム依存の検索パス・セグメント、修正UTF-8文字列としてエンコードされる。

エージェントは、charの配列を渡す。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ILLEGAL_ARGUMENT segmentが無効なパス。ライブ段階では、既存のJARファイル以外はすべて無効なパスとなる。
JVMTI_ERROR_NULL_POINTER segmentNULL

システム・クラス・ローダー検索の追加

jvmtiError
AddToSystemClassLoaderSearch(jvmtiEnv* env,
            const char* segment)
この関数では、システム・クラス・ローダーを使用してインストゥルメンテーション・クラスを定義できます。Java(tm)仮想マシン仕様のセクション5.3.2を参照してください。クラス・ローダーによるクラスの検索が失敗すると、指定されたプラットフォーム依存の検索パスsegmentも検索されます。segmentに指定できるセグメントは1つのみです。この関数を複数回呼び出せば、複数のセグメントを追加できます。セグメントの検索は、この関数が呼び出された順番で行われます。

OnLoad段階でこの関数を使うと、システム・クラス・ローダーがクラスの検索に失敗した際に、追加で検索する任意のプラットフォーム依存の検索パス・セグメントを指定できます。このセグメントは通常、ディレクトリとJARファイルのいずれかになります。

ライブ段階では、segmentは、システム・クラス・ローダーがクラスの検索に失敗した際に、追加で検索するプラットフォーム依存のJARファイルへのパスになります。システム・クラス・ローダーがインストゥルメンテーション目的で定義するクラスやリソース以外のものがJARファイルに含まれないように、エージェントで確認するようにしてください。

ライブ段階でシステム・クラス・ローダーが検索対象JARファイルの追加をサポートするのは、java.lang.String型の単一パラメータを取るappendToClassPathForInstrumentationという名前のメソッドをシステム・クラス・ローダーが実装している場合です。このメソッドは、publicアクセスを備えていなくてもかまいません。

Java(tm)仮想マシン仕様には、Java仮想マシンが以前にシンボリック参照を解決しようとして失敗した場合、その後このシンボリック参照を解決しようとしても、最初に解決しようとした結果としてスローされたエラーと同じエラーで必ず失敗すると記述されています。したがって、Java仮想マシンが参照を解決できなかったクラスに対応するエントリがJARファイルに含まれる場合、その参照を解決しようとしても最初のエラーと同じエラーで失敗します。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1511.1

権限
必要な機能

パラメータ
名前 説明
segmentconst char* プラットフォーム依存の検索パス・セグメント、修正UTF-8文字列としてエンコードされる。

エージェントは、charの配列を渡す。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ILLEGAL_ARGUMENT segmentが無効なパス。ライブ段階では、既存のJARファイル以外はすべて無効なパスとなる。
JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED システム・クラス・ローダーがサポートしない操作。
JVMTI_ERROR_NULL_POINTER segmentNULL


システム・プロパティ

システム・プロパティ関数: これらの関数は、システム・プロパティを取得および設定します。


システム・プロパティの取得

jvmtiError
GetSystemProperties(jvmtiEnv* env,
            jint* count_ptr,
            char*** property_ptr)
GetSystemPropertyで使用可能なVMシステム・プロパティ・キーのリストが返されます。仮想マシンが次のプロパティ・キーを提供するようにすることを強くお勧めします。 VMによって定義され、使用されるシステム・プロパティへのアクセスを提供します。コマンド行で設定されたプロパティも含まれます。これにより、これらのプロパティを、VMがバイト・コードの実行を開始する前に取得、設定できます。これはシステム・プロパティのVMビューなので、使用可能なプロパティのセットは、通常、java.lang.System.getProperties内のプロパティ・セットとは異なります。java.lang.System.getPropertiesのアクセスには、JNIメソッド呼出しを使用できます。

プロパティのセットは、実行中に増えることがあります。

段階コールバック安全位置導入されたバージョン
OnLoadまたはライブ段階でしか呼び出せない いいえ 1301.0

権限
必要な機能

パラメータ
名前 説明
count_ptrjint* 戻ったとき、返されるプロパティ・キーの数をポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。
property_ptrchar*** 戻ったとき、プロパティ・キーの配列(修正UTF-8文字列としてエンコードされる)をポイントする。

エージェントはchar**へのポインタを渡す。char**は復帰時に、新しく割り当てられたサイズ*count_ptrの配列(各要素も新しく割り当てられる)をポイントしている。この配列は、Deallocateを使って解放するべき。各要素はDeallocateで解放すべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER count_ptrNULL
JVMTI_ERROR_NULL_POINTER property_ptrNULL

システム・プロパティの取得

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またはライブ段階でしか呼び出せない いいえ 1311.0

権限
必要な機能

パラメータ
名前 説明
propertyconst char* 取得されるプロパティのキー。修正UTF-8文字列としてエンコードされる。

エージェントは、charの配列を渡す。
value_ptrchar** 戻ったとき、プロパティの値(修正UTF-8文字列としてエンコードされる)をポイントする。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NOT_AVAILABLE このプロパティを使用できない。GetSystemPropertiesを使って、使用可能なプロパティを検索する。
JVMTI_ERROR_NULL_POINTER propertyNULL
JVMTI_ERROR_NULL_POINTER value_ptrNULL

システム・プロパティの設定

jvmtiError
SetSystemProperty(jvmtiEnv* env,
            const char* property,
            const char* value_ptr)
VMシステム・プロパティの値を設定します。

関数GetSystemPropertiesは、プロパティ・キーのセットを返します。そのうちのいくつかは設定可能です。GetSystemPropertyを参照してください。

段階コールバック安全位置導入されたバージョン
できるOnLoad段階でしか呼び出せない段階 いいえ 1321.0

権限
必要な機能

パラメータ
名前 説明
propertyconst char* プロパティのキー。修正UTF-8文字列としてエンコードされる。

エージェントは、charの配列を渡す。
value_ptrconst char * 設定するプロパティ値。修正UTF-8文字列としてエンコードされる。

エージェントは、charの配列を渡す。value_ptrNULLの場合は値が設定されないが、プロパティが書込み可能でない場合はJVMTI_ERROR_NOT_AVAILABLEが返される。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NOT_AVAILABLE このプロパティを使用できない、またはこのプロパティは書込み可能でない。
JVMTI_ERROR_NULL_POINTER propertyNULL


全般

全般関数: 全般の型: 全般のフラグおよび定数:


段階の取得

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イベントが返されてから、または起動に失敗してから。
起動に失敗した場合、VMは中間の段階を省略して直接デッド段階に進みます。この場合、VMInitイベントもVMDeathイベントも送信されません。

ほとんどのJVM TI関数は、ライブ段階でしか動作しません。次の関数は、OnLoad段階でもライブ段階でも動作します。 次の関数は、OnLoad段階でのみ動作します。 次の関数は、開始段階でもライブ段階でも動作します。 次の関数は、どの段階でも動作します。 JNI関数(呼び出しAPIを除く)は、開始段階またはライブ段階で使用する必要があります。

ほとんどのJVM TIイベントは、ライブ段階でしか送信されません。次のイベントは、その他の段階で扱われます。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 1331.0

権限
必要な機能

パラメータ
名前 説明
phase_ptrjvmtiPhase* 戻ったとき、段階をポイントする。

エージェントはjvmtiPhaseへのポインタを渡す。戻ったとき、jvmtiPhaseが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER phase_ptrNULL

環境の破棄

jvmtiError
DisposeEnvironment(jvmtiEnv* env)
JNI GetEnvで作成されたJVM TI接続をシャットダウンします(「JVM TI環境」を参照)。環境が保持していたリソースをすべて破棄します。この環境によって中断されたスレッドは、この呼出しによって再開されません。これはエージェントが明示的に行う必要があります。この環境によってJVM TI関数呼出し経由で割り当てられたメモリーは、解放されません。これをエージェントから明示的に行うには、Deallocateを呼び出します。この環境によって作成されたrawモニターは破棄されません。これをエージェントから明示的に行うには、DestroyRawMonitorを呼び出します。この環境によって作成されたrawモニター上で待機しているスレッドの状態は、何の影響も受けません。

この環境のネイティブ・メソッド接頭辞はすべて設定解除されます。エージェントは、破棄を呼び出す前に接頭辞付きネイティブ・メソッドをすべて削除しなければなりません。

この環境で保持されている権限はすべて放棄されます。

この環境で有効化されたイベントは送信されなくなりますが、現在実行中のイベント・ハンドラは引き続き実行されます。環境が破棄されたために実行中に無効になる可能性のあるイベント・ハンドラを設計する際には、十分に注意を払う必要があります。

この環境は、この呼出しのあとは使用できません。この呼出しは呼出し元に戻ります。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 1271.0

権限
必要な機能

パラメータ
名前 説明

エラー
この関数は、汎用エラーを返します

環境ローカル記憶領域の設定

jvmtiError
SetEnvironmentLocalStorage(jvmtiEnv* env,
            const void* data)
VMは、個々の環境に関連付けられているポインタ値を格納します。このポインタ値を環境ローカルな記憶領域と呼びます。この関数で設定されない場合、値はNULLになります。エージェントは、環境固有の情報を格納するため、メモリーを割り当てることができます。環境ローカルな記憶領域を設定することにより、GetEnvironmentLocalStorageを使ってアクセスできるようになります。

JVM TIの環境ローカルな記憶領域の値を設定するため、エージェントによって呼び出されます。JVM TIは、エージェントに対して、環境ごとの情報を記録するために利用できる、ポインタ・サイズの環境ローカルな記憶領域を提供します。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 1481.0

権限
必要な機能

パラメータ
名前 説明
dataconst void * 環境ローカルな記憶領域に入力する値。

エージェントがポインタを渡す。dataNULLの場合、値はNULLに設定される。

エラー
この関数は、汎用エラーを返します

環境ローカル記憶領域の取得

jvmtiError
GetEnvironmentLocalStorage(jvmtiEnv* env,
            void** data_ptr)
JVM TIの環境ローカルな記憶領域の値を取得するため、エージェントによって呼び出されます。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる この関数はHeap反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。 1471.0

権限
必要な機能

パラメータ
名前 説明
data_ptrvoid** 環境ローカルな記憶領域の値を返すポインタ。環境ローカルな記憶領域がSetEnvironmentLocalStorageで設定されていない場合、返されるポインタはNULL

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER data_ptrNULL

バージョン番号の取得

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 シフトにより、マイクロ・バージョン番号を抽出する。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 881.0

権限
必要な機能

パラメータ
名前 説明
version_ptrjint* 戻ったとき、JVM TIのバージョンをポイントする。

エージェントはjintへのポインタを渡す。戻ったとき、jintが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER version_ptrNULL

エラー名の取得

jvmtiError
GetErrorName(jvmtiEnv* env,
            jvmtiError error,
            char** name_ptr)
エラー・コードのシンボリック名を返します。

たとえば、GetErrorName(env, JVMTI_ERROR_NONE,&err_name)は、err_nameに文字列"JVMTI_ERROR_NONE"を返します。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 1281.0

権限
必要な機能

パラメータ
名前 説明
errorjvmtiError エラー・コード。
name_ptrchar** 戻ったとき、エラー名をポイントする。名前は、修正UTF-8文字列としてエンコードされるが、ASCIIサブセットに制限される。

エージェントはchar*へのポインタを渡す。戻り時に、char*は、新しく割り当てられた配列をポイントする。この配列は、Deallocateを使って解放するべき。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_ILLEGAL_ARGUMENT errorがjvmtiErrorではない。
JVMTI_ERROR_NULL_POINTER name_ptrNULL

冗長フラグの設定

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に送信される出力です。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 1501.0

権限
必要な機能

パラメータ
名前 説明
flagjvmtiVerboseFlag どの冗長フラグを設定するか。
valuejboolean フラグの新しい値。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
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の値は、その他の表現を持つ。

段階コールバック安全位置導入されたバージョン
どの段階でも呼び出せる いいえ 1291.0

権限
必要な機能

パラメータ
名前 説明
format_ptrjvmtiJlocationFormat* 戻ったとき、jlocation値の形式識別子をポイントする。

エージェントはjvmtiJlocationFormatへのポインタを渡す。戻ったとき、jvmtiJlocationFormatが設定されている。

エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー 説明
JVMTI_ERROR_NULL_POINTER format_ptrNULL


エラー

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_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_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)
新しいクラスのバージョンのメソッドの修飾子が旧クラスのバージョンの修飾子と異なる。


データ型

JVM TIは、JNIによって定義されたデータ型を拡張します。

JVM Tool Interfaceで使用するJNIの型
説明
jboolean Javaプログラミング言語booleanを保持します。符号なし8ビット。
jchar Javaプログラミング言語charを保持します。符号なし16ビット。
jint Javaプログラミング言語intを保持します。符号付き32ビット。
jlong Javaプログラミング言語longを保持します。符号付き64ビット。
jfloat Javaプログラミング言語floatを保持します。32ビット。
jdouble Javaプログラミング言語doubleを保持します。64ビット。
jobjectJavaプログラミング言語オブジェクトを保持する。
jclassJavaプログラミング言語クラスを保持する。
jvalueすべてのプリミティブ型およびjobjectの和集合である。つまり、Javaプログラミング言語の任意の値を保持する。
jfieldIDJavaプログラミング言語のフィールドを識別する。JVM TIの関数やイベントから返されたjfieldIDは、安全に格納できる。
jmethodIDJavaプログラミング言語メソッド、イニシャライザ、またはコンストラクタを識別する。JVM TIの関数やイベントから返されたjmethodIDは、安全に格納できる。ただし、クラスがアンロードされた場合、それらは無効になるので使用してはいけない。
JNIEnvJNI関数テーブルのポインタ。JNIEnv *のポインタはJNI環境。

JVM Tool Interface基底型
説明
jvmtiEnvJVM TI環境のポインタ。「関数」セクションを参照。jvmtiEnv関数テーブルのポインタをポイントする。
jthreadスレッドを保持するjobjectのサブタイプ。
typedef jobject jthread;
jthreadGroupスレッド・グループを保持するjobjectのサブタイプ。
typedef jobject jthreadGroup;
jlocationメソッド内の単調に増加する実行可能位置を表す64ビット値。-1はネイティブ・メソッドを示す。ある特定のVMでの形式については、GetJLocationFormatを参照。
typedef jlong jlocation;
jrawMonitorIDrawモニター。
struct _jrawMonitorID;
typedef struct _jrawMonitorID *jrawMonitorID;
jvmtiError戻りエラー・コードを保持する。可能な値については、「エラー」を参照。
typedef enum { 
    JVMTI_ERROR_NONE = 0,  
    JVMTI_ERROR_INVALID_THREAD = 10,
      ... 
} jvmtiError;
jvmtiEventイベント・タイプの識別子。可能な値については、「イベント」を参照。この仕様の将来のバージョンでは、イベント・タイプ識別子としてゼロが割り当てられないことが保証される。
typedef enum { 
    JVMTI_EVENT_SINGLE_STEP = 1, 
    JVMTI_EVENT_BREAKPOINT = 2, 
      ... 
} jvmtiEvent;
jvmtiEventCallbacksイベント用コールバック。
typedef struct {
    jvmtiEventVMInit VMInit;
    jvmtiEventVMDeath VMDeath;
      ... 
} jvmtiEventCallbacks;
完全な構造については「イベント・コールバック」を参照。

たとえば、VM初期化コールバックは次のように定義される。
typedef void (JNICALL *jvmtiEventVMInit)
    (jvmtiEnv *jvmti_env, 
     JNIEnv* jni_env,
     jthread thread);
コールバック関数の定義については個々のイベントを参照。
jniNativeInterfaceJNI仕様で定義されたJNI関数テーブルJNINativeInterfaceの型識別子。JNI参照実装では、下線付きで定義される。
typedef struct JNINativeInterface_ jniNativeInterface;

構造型の定義
説明
jvmtiAddrLocationMap位置エントリのネイティブ・アドレス
jvmtiCapabilities権限の構造体
jvmtiClassDefinitionクラスの再定義の説明
jvmtiExtensionEventInfo拡張イベント情報
jvmtiExtensionFunctionInfo拡張関数情報
jvmtiFrameInfoスタック・フレーム情報構造体
jvmtiHeapCallbacksヒープ・コールバック関数構造体
jvmtiHeapReferenceInfo参照情報構造体
jvmtiHeapReferenceInfoArray配列参照用の参照情報構造体
jvmtiHeapReferenceInfoConstantPool定数プール参照用の参照情報構造体
jvmtiHeapReferenceInfoFieldフィールド参照用の参照情報構造体
jvmtiHeapReferenceInfoJniLocalJNIローカル参照用の参照情報構造体
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反復制御の列挙
jvmtiJlocationFormatJLocationの形式の列挙
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予約済み
void *reserved3;
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);
31rawモニターの作成
jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env, 
                       const char* name, 
                       jrawMonitorID* monitor_ptr);
32rawモニターの破棄
jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
33rawモニターの開始
jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
34rawモニターの終了
jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
35rawモニターの待機
jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env, 
                       jrawMonitorID monitor, 
                       jlong millis);
36rawモニターの通知
jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
37rawモニターの通知(すべて)
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予約済み
void *reserved40;
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);
46Allocate
jvmtiError (JNICALL *Allocate) (jvmtiEnv* env, 
                       jlong size, 
                       unsigned char** mem_ptr);
47Deallocate
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予約済み
void *reserved94;
95予約済み
void *reserved95;
96予約済み
void *reserved96;
97予約済み
void *reserved97;
98予約済み
void *reserved98;
99予約済み
void *reserved99;
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予約済み
void *reserved118;
119予約済み
void *reserved119;
120JNI関数テーブルの設定
jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env, 
                       const jniNativeInterface* function_table);
121JNI関数テーブルの取得
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);
129JLocation形式の取得
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);


イベント

イベントの処理

エージェントは、アプリケーション・プログラム内で発生する多くのイベントについての通知を受けることができます。

イベントを処理するには、SetEventCallbacksを使ってコールバック関数のセットを指定します。イベントごとに、対応するコールバック関数が呼び出されます。コールバック関数の引数は、イベントに関する追加情報を提供します。

コールバック関数は通常、アプリケーション・スレッド内から呼び出されます。JVM TI実装がイベントをキューに入れることは、決してありません。これは、イベントのコールバック関数を注意深く記述する必要があることを意味しています。このあと、一般的なガイドラインを説明します。さらに詳しい提案については、個々のイベントの説明を参照してください。

JVM TIイベントの中には、JNI参照を使ってオブジェクトを識別するものがあります。JVM TIイベント内のすべての参照は、JNIローカル参照で、イベント・コールバック関数から復帰すると無効になります。記述されていない場合、イベント・コールバック内で送信されたポインタによって参照されるメモリーは、イベント・コールバックの終了後は参照できません。

特に明記されていないかぎり、イベントの配信は、そのイベントが発生したスレッド上で行われます。イベントは発生と同時に送信されます。各イベントの仕様には、そのイベントの送信が可能な段階のセットが含まれています。イベントをトリガーするアクティビティが別の段階で発生しても、イベントは送信されません。

イベントを生成するスレッドの実行ステータスが変更されることはありません(たとえば、イベントによってスレッドが中断されることはない)。エージェントがイベント発生時の中断を必要とする場合、SuspendThreadでスレッドを明示的に中断するのは、エージェントの責任となります。

複数の環境で有効になっているイベントは、これらの環境が作成された順に、各エージェントに送信されます。

イベントの有効化

すべてのイベントは、初期段階では無効になっています。イベントを受信するには、次のようにします。

同じ位置で発生する複数のイベント

多くの状況で、1つのスレッド内の同じ位置で複数のイベントが発生する可能性があります。そのような状況では、このセクションで説明する順序で、イベント・コールバックによりすべてのイベントがレポートされます。

現在位置がメソッドのエントリ・ポイントである場合は、同一スレッド内の現在位置で発生したほかのすべてのイベントより前に、MethodEntryイベントがレポートされます。

現在位置で例外のキャッチが検出された場合(catch節の先頭の場合か、未処理の例外を解除したネイティブ・メソッドが復帰した位置の場合)は、同一スレッド内の現在位置で発生したほかのすべてのイベントより前に、exceptionCatchイベントがレポートされます。

singleStepイベントまたはbreakpointイベントが現在位置でトリガーされる場合、そのイベントは、現在位置のコードが実行される直前に発生するものと定義されています。これらのイベントは、同一スレッド内の現在位置にあるコードの実行によりトリガーされるどのイベント(特に、exceptionfieldAccess、およびfieldModification)よりも前にレポートされます。ステップ・イベントとブレークポイント・イベントの両方が同一のスレッドおよび場所でトリガーされた場合は、ステップ・イベントがブレークポイント・イベントより前にレポートされます。

現在位置がメソッドの終了ポイント(つまり、呼出し側に復帰する前の最後の位置)である場合、MethodExitイベントおよびFramePopイベント(要求されている場合)は、同一スレッド内の現在位置で発生するほかのすべてのイベントのあとにレポートされます。これら2つのイベントについては、レポートされる順序は特に指定されていません。

あるイベントをエージェントが処理している最中に、同じスレッド内の同じ位置で別の(共通位置)イベントがトリガーされる可能性があります。x型のイベントの処理中にそのようなy型のイベントがトリガーされ、かつ上で規定した順序付けに基づいてxyよりも先である場合、現在のスレッドと位置に対して共通位置イベントyが報告されます。xyよりも先でない場合、yは現在のスレッドと位置に対して報告されません。たとえば、SingleStepの処理中に現在位置でブレークポイントが設定された場合、そのブレークポイントは、スレッドが現在位置を離れる前に報告されます。

以下のイベントは、ほかのイベントと同じ位置で発生したと見なされることがありません。

イベント・コールバック

以下のイベント・コールバック構造体では、イベントのハンドラ関数を指定できます。これは、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;
} jvmtiEventCallbacks;


イベントの索引


ステップ実行

void JNICALL
SingleStep(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)
ステップ実行イベントを利用すると、エージェントは、VMで可能な最小の単位でスレッドの実行を追跡できます。ステップ実行イベントは、スレッドが新しい位置に達するたびに生成されます。通常、ステップ実行イベントは、Java(tm)仮想マシン仕様に定義されているように、1つのVM命令が完了したことを示します。ただし、位置の定義が異なる実装もあります。いずれにしても、methodおよびlocationパラメータによって現在の位置を一意に識別できるため、この情報があればソース・ファイルと行番号へのマッピングが可能です。

ネイティブ・メソッド内からは、ステップ実行イベントは生成されません。

段階イベント・タイプ番号有効化導入されたバージョン
ライブ段階でしか送信されない JVMTI_EVENT_SINGLE_STEP60SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_SINGLE_STEP, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_single_step_events ステップ実行イベントを取得できる

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread 新しい命令を実行しようとしているスレッド
methodjmethodID 新しい命令を実行しようとしているメソッド
locationjlocation 新しい命令の位置


ブレークポイント

void JNICALL
Breakpoint(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)
ブレークポイント・イベントは、SetBreakpointを使ってブレークポイントとして指定された位置にスレッドが達した時点で生成されます。methodおよびlocationパラメータは、現在の位置を一意に識別し、ソース・ファイルと行番号(その情報が入手できる場合)にマッピングできます。

段階イベント・タイプ番号有効化導入されたバージョン
ライブ段階でしか送信されない JVMTI_EVENT_BREAKPOINT62SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_BREAKPOINT, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_breakpoint_events Breakpointイベントを設定し、取得できる。

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境。
threadjthread ブレークポイントに達したスレッド
methodjmethodID ブレークポイントに達したメソッド
locationjlocation ブレークポイントの位置


フィールド・アクセス

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_ACCESS63SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_ACCESS, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_field_access_events フィールド・アクセスにウォッチポイントを設定できる - SetFieldAccessWatch

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread フィールドにアクセスするスレッド
methodjmethodID アクセスが発生しているメソッド
locationjlocation アクセスが発生している位置
field_klassjclass アクセスされるフィールドのクラス
objectjobject フィールドがインスタンス・フィールドの場合はアクセスされているフィールドを持つオブジェクト、それ以外の場合はNULL
fieldjfieldID アクセスされているフィールド


フィールドの変更

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_MODIFICATION64SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_MODIFICATION, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_field_modification_events フィールドの変更にウォッチポイントを設定できる - SetFieldModificationWatch

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread フィールドを変更するスレッド
methodjmethodID 変更が発生しているメソッド
locationjlocation 変更が発生している位置
field_klassjclass 変更されているフィールドのクラス
objectjobject フィールドがインスタンス・フィールドの場合は変更されているフィールドを持つオブジェクト、それ以外の場合はNULL
fieldjfieldID 変更されているフィールド
signature_typechar 新しい値のシグニチャの型
new_valuejvalue 新しい値


フレームのポップ

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関数によるフレームのポップはレポートされません。

GetFrameLocationによりレポートされる位置は、復帰しようとしているメソッド内の復帰直前の実行可能位置を識別します。

段階イベント・タイプ番号有効化導入されたバージョン
ライブ段階でしか送信されない JVMTI_EVENT_FRAME_POP61SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FRAME_POP, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_frame_pop_events FramePopイベントを設定し、取得できる。

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread フレームをポップするスレッド
methodjmethodID ポップされるメソッド
was_popped_by_exceptionjboolean フレームが例外のスローによってポップされた場合はtrue。メソッドが戻り命令によって終了した場合はfalse。


メソッド・エントリ

void JNICALL
MethodEntry(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method)
メソッド・エントリ・イベントは、Javaプログラミング言語メソッド(ネイティブ・メソッドを含む)に入る時点で生成されます。

GetFrameLocationによりレポートされる位置は、メソッド内の初期実行可能位置を識別します。

多くのプラットフォームでは、メソッド・エントリ・イベントまたはメソッド終了イベントを有効にすると、パフォーマンスが大幅に低下します。したがって、プロ・ファイリングなど、パフォーマンスを重視する処理での使用はお薦めしません。これらの場合には、バイトコード・インストゥルメンテーションを使用すべきです。

段階イベント・タイプ番号有効化導入されたバージョン
ライブ段階でしか送信されない JVMTI_EVENT_METHOD_ENTRY65SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_ENTRY, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_method_entry_events メソッドに入るときにメソッド・エントリ・イベントを生成できる

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread メソッドに入るスレッド
methodjmethodID 入る先のメソッド


メソッド終了

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を参照)。

methodフィールドは、入るメソッドまたは出るメソッドを一意に識別します。frameフィールドは、メソッドのスタック・フレームへのアクセスを提供します。

GetFrameLocationによりレポートされる位置は、復帰しようとしているメソッド内の復帰直前の実行可能位置を識別します。

多くのプラットフォームでは、メソッド・エントリ・イベントまたはメソッド終了イベントを有効にすると、パフォーマンスが大幅に低下します。したがって、プロ・ファイリングなど、パフォーマンスを重視する処理での使用はお薦めしません。これらの場合には、バイトコード・インストゥルメンテーションを使用すべきです。

段階イベント・タイプ番号有効化導入されたバージョン
ライブ段階でしか送信されない JVMTI_EVENT_METHOD_EXIT66SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_EXIT, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_method_exit_events メソッドの終了時にメソッド終了イベントを生成できる。

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread メソッドを終了するスレッド
methodjmethodID 終了されるメソッド
was_popped_by_exceptionjboolean フレームが例外のスローによってポップされた場合はtrue。メソッドが戻り命令によって終了した場合はfalse。
return_valuejvalue 終了されるメソッドの戻り値。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_BIND67SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_NATIVE_METHOD_BIND, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_native_method_bind_events ネイティブ・メソッドが実装にバインドされているときイベントを生成できる。

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境は、初期段階中に送信されるとNULLになる。
threadjthread バインドを要求するスレッド
methodjmethodID バインドされるネイティブ・メソッド
addressvoid* VMのバインド先のアドレス(ネイティブ・メソッドの実装アドレス)
new_address_ptrvoid** 参照アドレスが変更された場合(つまり、*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_methodcatch_locationは、スローされた例外を処理するcatch節が存在する場合に、その位置を識別します。そのようなcatch節が存在しない場合、各フィールドは0に設定されます。スレッドがこのcatch節に到達するという保証はありません。呼出しスタック上で、スロー位置とcatch節の間にネイティブ・メソッドが存在していれば、それらのネイティブ・メソッドのいずれかによって例外がリセットされる可能性があります。同様に、非キャッチとして報告された例外(catch_klassなどが0に設定された例外)は、実際にはネイティブ・メソッドによってキャッチされる可能性があります。エージェントからこれらの発生をチェックするには、ExceptionCatchイベントを監視します。finally節は、キャッチ/再スローとして実装される点に注意してください。したがって、それらはキャッチ位置で報告されます。

段階イベント・タイプ番号有効化導入されたバージョン
ライブ段階でしか送信されない JVMTI_EVENT_EXCEPTION58SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_exception_events 例外スロー・イベントおよび例外キャッチ・イベントを取得できる

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread 例外を生成するスレッド
methodjmethodID 例外を生成するメソッド
locationjlocation 例外が発生した位置
exceptionjobject スローされる例外
catch_methodjmethodID 例外をキャッチするメソッド。既知のキャッチがない場合はNULL
catch_locationjlocation 例外をキャッチする位置。既知のキャッチがない場合はゼロ


例外キャッチ

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_CATCH59SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION_CATCH, NULL)1.0

権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限 効果
can_generate_exception_events 例外スロー・イベントおよび例外キャッチ・イベントを取得できる

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread 例外をキャッチするスレッド
methodjmethodID 例外をキャッチするメソッド
locationjlocation 例外がキャッチされる位置
exceptionjobject キャッチされる例外


スレッドの開始

void JNICALL
ThreadStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
スレッド開始イベントは、新しいスレッドによって、スレッドの初期メソッドが実行される前に、生成されます。

スレッド開始イベントが生成される前に、GetAllThreadsによって返される配列に、そのスレッドが含まれている可能性があります。また、スレッド開始イベントの前に、その他のイベントがスレッド上に生成される可能性があります。

イベントは新しく開始されたthreadに送信されます。

段階イベント・タイプ番号有効化導入されたバージョン
開始段階とライブ段階で送信される JVMTI_EVENT_THREAD_START52SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL)1.0

権限
必要な機能

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境。
threadjthread 開始するスレッド


スレッドの終了

void JNICALL
ThreadEnd(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
スレッド終了イベントは、停止しようとしているスレッドによって、スレッドの初期メソッドの実行完了後に、生成されます。

スレッド終了イベントが生成されたあと、GetAllThreadsによって返される配列に、そのスレッドが含まれている可能性があります。スレッド終了イベントのあと、スレッド上にイベントは生成されません。

イベントは終了するthreadに送信されます。

段階イベント・タイプ番号有効化導入されたバージョン
開始段階とライブ段階で送信される JVMTI_EVENT_THREAD_END53SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_END, NULL)1.0

権限
必要な機能

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境。
threadjthread 終了するスレッド


クラスのロード

void JNICALL
ClassLoad(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)
クラス・ロード・イベントは、クラスが最初にロードされた時点で生成されます。特定のスレッドによりクラス・ロード・イベントが生成される順序は、そのスレッド内でクラスがロードされる順序と一致することが保証されています。配列クラスの作成では、クラス・ロード・イベントは生成されません。プリミティブ・クラス(java.lang.Integer.TYPEなど)の作成では、クラス・ロード・イベントは生成されません。

このイベントは、クラスのロードの早い段階で送信されます。このため、クラスは慎重に使用する必要があります。たとえば、メソッドやフィールドがまだロードされていないため、メソッド、フィールド、サブクラスなどへの照会で、正しい結果が得られません。Java言語仕様のクラスとインタフェースのロードを参照してください。ほとんどの場合、ClassPrepareの方が有効です。

段階イベント・タイプ番号有効化導入されたバージョン
開始段階とライブ段階で送信される JVMTI_EVENT_CLASS_LOAD55SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_LOAD, NULL)1.0

権限
必要な機能

パラメータ
名前 説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread クラスをロードするスレッド
klassjclass ロードされるクラス


クラスの準備

void JNICALL
ClassPrepare(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)
クラス準備イベントは、クラスの準備が完了した時点で生成されます。この時点では、クラスのフィールド、メソッド、および実装されたインタフェースが利用可能ですが、クラスのコードはまだ何も実行されていません。配列クラスは、フィールドやメソッドを持つことがないため、配列クラスについてクラス準備イベントが生成されることはありません。プリミティブ・クラス(たとえば、java.lang.Integer.TYPE)についても、クラス準備イベントは生成されません。

段階イベント・タイプ番号有効化導入されたバージョン
開始段階とライブ段階で送信される JVMTI_EVENT_CLASS_PREPARE56SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_PREPARE, NULL)1.0

権限
必要な機能