機械翻訳について

JVMTM Tool Interface

バージョン 18.0


JVM Tool Interfaceとは

JVMTM Tool Interface (JVM TI)は、開発ツールや監視ツールで使用されるプログラミング・インタフェースです。 JavaTM仮想マシン(VM)で動作するアプリケーションの状態検査と実行制御の両方の機能を提供します。
JVM TIは、プロファイリング・ツール、デバッグ・ツール、監視ツール、スレッド分析ツール、カバレッジ分析ツールなど、VMの状態その他にアクセスする必要がある各種ツールのVMインタフェースとして機能します。
JVM TIは、JavaTM仮想マシンのすべての実装で使用できるとはかぎりません。
JVM TIは双方向のインタフェースです。 JVM TIのクライアント(以下エージェントと呼ぶ)は、興味のある事象についてイベント経由で通知を受け取ることができます。 JVM TIは、多数の関数を介して、アプリケーションのクエリーや制御を(イベントへの応答として、あるいはイベントから独立して)行えます。
個々のエージェントは同一のプロセスで実行され、検査対象のアプリケーションを実行する仮想マシンと直接通信します。 この通信には、ネイティブ・インタフェース(JVM TI)が使用されます。 ネイティブのインプロセス・インタフェースにより、ツール側への侵入は最小限に抑えながら、最大限の制御が可能になります。 通常、エージェントは比較的コンパクトです。 エージェントは、ターゲット・アプリケーションの通常の実行を妨げることなく、ツールの機能の大部分を実装する別のプロセスによって制御できます。

アーキテクチャ

ツールへの書込みは、JVM TIを使って直接行われるか、高度インタフェースを使って間接的に行われます。 Java Platform Debugger Architectureには、JVM TIのほかに、より高いレベルのアウトプロセス・デバッガ・インタフェースも含まれています。 多くのツールには、JVM TIよりも高いレベルのインタフェースの方が適しています。 Java Platform Debugger Architectureの詳細については、Java Platform Debugger ArchitectureのWebサイトを参照してください。

エージェントの作成

エージェントの作成には、C言語の呼出し規則とC/C++の定義をサポートする任意のネイティブ言語を使用できます。
JVM TIを使用するために必要な関数、イベント、データ型、定数の定義は、インクルード・ファイルjvmti.hで定義されます。 これらの定義を使用するには、J2SETMインクルード・ディレクトリをインクルード・パスに追加し、
#include <jvmti.h>
    
をソース・コードに追加してください。

エージェントの配備

エージェントはプラットフォーム固有の方法で配備されますが、通常はそのプラットフォームでダイナミック・ライブラリに相当するものになります。 たとえば、WindowsTMオペレーティング・システムの場合、エージェント・ライブラリは「ダイナミック・リンク・ライブラリ」(DLL)になります。 LinuxTMオペレーティング環境では、エージェント・ライブラリは共有オブジェクト(.soファイル)です。
VM起動時にエージェントを起動するには、コマンド行オプションを使ってエージェント・ライブラリの名前を指定します。 実装によっては、ライブ段階エージェントを起動するメカニズムをサポートしている可能性があります。 その起動方法の詳細は、実装に固有となります。

静的リンク・エージェント(導入されたバージョン: 1.2.3)

ネイティブJVMTIエージェントは、VMと静的にリンクできます。 ライブラリ・イメージとVMイメージとの結合方法は、実装に依存します。 イメージがVMと結合されたエージェントLが静的リンクとして定義されるのは、そのエージェントがAgent_OnLoad_Lという名前の関数をエクスポートする場合のみです。
静的リンク・エージェントLからAgent_OnLoad_Lという名前の関数とAgent_OnLoadという名前の関数がエクスポートされた場合、Agent_OnLoad関数は無視されます。 エージェントLが静的リンクの場合、Agent_OnLoad関数で規定されたのと同じ引数と期待される戻り値を指定して、Agent_OnLoad_L関数が呼び出されます。 静的リンクのエージェントLは、同名のエージェントが動的にロードされるのを禁止します。
VMは、その実行中に動的エントリ・ポイントAgent_OnUnLoadが呼び出されていたのと同じポイントで、エージェントのAgent_OnUnload_L関数を呼び出します(そのような関数がエクスポートされていた場合)。 静的にロードされたエージェントはアンロードできません。 それでも、エージェントのシャットダウンに関する他のなんらかのタスクを行えるように、Agent_OnUnload_L関数が呼び出されます。 静的リンク・エージェントLからAgent_OnUnLoad_Lという名前の関数とAgent_OnUnLoadという名前の関数がエクスポートされた場合、Agent_OnUnLoad関数は無視されます。
エージェントLが静的リンクの場合、Agent_OnAttach関数で規定されたのと同じ引数と期待される戻り値を指定して、Agent_OnAttach_L関数が呼び出されます。 静的リンク・エージェントLからAgent_OnAttach_Lという名前の関数とAgent_OnAttachという名前の関数がエクスポートされた場合、Agent_OnAttach関数は無視されます。

エージェントのコマンド行オプション

以下の「コマンド行オプション」という語は、JNI呼び出しAPIのJNI_CreateJavaVM関数において、JavaVMInitArgs引数で指定されるオプションを意味します。
エージェントを適切にロードして実行するには、VMの起動時に次の2つのうちいずれかのコマンド行オプションが必要です。 これらの引数は、エージェントを含むライブラリと、起動時に渡されるオプションの文字列を指定します。
-agentlib:<agent-lib-name>=<options>
-agentlib:の後の名前は、ロードするライブラリの名前です。 ライブラリの検索(その完全名と場所の両方)は、プラットフォーム固有の方法で進行します。 通常、<agent-lib-name>はオペレーティング・システム固有のファイル名に展開されます。 <options>は、起動時にエージェントに渡されます。 たとえば、オプション-agentlib:foo=opt1,opt2が指定されている場合、VMは、WindowsTMの下のシステムPATHから共有ライブラリfoo.dll、またはLinuxTMの下のLD_LIBRARY_PATHからlibfoo.soをロードしようとします。 エージェントのライブラリが実行可能ファイルに静的にリンクされている場合、実際のロード・タスクは発生しません。
-agentpath:<path-to-agent>=<options>
-agentpath: の後ろには、ライブラリをロードする絶対パスを指定します。 ライブラリ名の展開は行われません。 <options>は、起動時にエージェントに渡されます。 たとえば、オプション-agentpath:c:\myLibs\foo.dll=opt1,opt2が指定された場合、VMは、共有ライブラリc:\myLibs\foo.dllをロードしようとします。 エージェントのライブラリが実行可能ファイルに静的にリンクされている場合、実際のロード・タスクは発生しません。
動的共有ライブラリ・エージェントの場合、ライブラリ内の起動ルーチンAgent_OnLoadが呼び出されます。 エージェントのライブラリが実行可能ファイルに静的にリンクされている場合、システムはAgent_OnLoad_<agent-lib-name>エントリ・ポイント(<agent-lib-name>はエージェントのベース名)を呼び出そうとします。 上の例(-agentpath:c:\myLibs\foo.dll=opt1,opt2)の場合、システムはAgent_OnLoad_foo起動ルーチンを見つけて呼び出そうとします。
バイト・コード・インストゥルメンテーション(bytecode instrumentation)のために必要な場合、ツール内でJavaプログラミング言語コードを使用しやすくするため、-agentlib: または-agentpath:を指定してロードされたライブラリから、JNIネイティブ・メソッド実装が検索されます。
エージェント・ライブラリは、その他のすべてのライブラリが検索されたあと検索されます。非エージェント・メソッドのネイティブ・メソッド実装を上書きまたは遮断するエージェントは、NativeMethodBindイベントを使用できます。
これらのスイッチは上記の処理のみを行います。VMやJVM TIの状態を変更することはありません。 JVM TIやJVM TIの側面を有効にするためにコマンド行オプションを指定する必要はありません。これは、プログラム内で権限を使用して処理されます。

エージェントの起動

VMは、起動関数を呼び出すことで各エージェントを起動します。 OnLoad段階でエージェントを起動する場合は、関数Agent_OnLoad(静的リンク・エージェントの場合はAgent_OnLoad_L)が呼び出されます。 ライブ段階でエージェントを起動する場合は、関数Agent_OnAttach(静的リンク・エージェントの場合はAgent_OnAttach_L)が呼び出されます。 起動関数の呼出しは、エージェントごとに1回だけ行われます。

エージェントの起動(OnLoad段階)

OnLoad段階でエージェントを起動する場合、そのエージェント・ライブラリは次のプロトタイプを持つ起動関数をエクスポートする必要があります。
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障害(起動の失敗を含むが、制御されていない停止)が含まれます。 実装では、Agent_OnAttach/ Agent_OnAttach_Lファンクションがエラー(ゼロ以外の値が返されました)を報告した場合に、この関数をコールしないことを選択することもできます。 この関数とVM終了イベントの違いに注意してください。VM終了イベントが送信されるためには、VMが少なくとも初期化のポイントまで実行済であり、かつVMDeathのコールバックを設定し、このイベントを有効化した有効なJVM TI環境が存在している必要があります。 Agent_OnUnloadまたはAgent_OnUnload_<agent-lib-name>ではこれらの条件は一切不要です。また、その他の理由でライブラリがアンロードされる場合もこの関数が呼び出されます。 VM終了イベントが送信される場合、それは、この関数が呼び出される前に送信されます(VMの終了によってこの関数が呼び出されると仮定した場合)。 この関数を使えば、エージェントによって割り当てられたリソースをクリーンアップできます。

JAVA_TOOL_OPTIONS

埋め込みVMや単にスクリプト内の深い場所で起動されるVMなどでは、コマンド行のアクセスや変更が常に可能であるとはかぎらないため、JAVA_TOOL_OPTIONS変数が用意されています。これを使えば、そうした場合でもエージェントを起動できます。
環境変数などの名前付き文字列をサポートするプラットフォームでは、JAVA_TOOL_OPTIONS変数がサポートされている可能性があります。 この変数は、空白文字の境界で複数のオプションに分解されます。 空白文字には、空白、タブ、復帰、復帰改行、垂直タブ、用紙送りなどがあります。 一連の空白文字は単一の空白文字と同等とみなされます。 空白文字は、引用符で囲まれていないかぎり、オプションには含められません。 引用方法は次のとおりです。 JNI_CreateJavaVM(JNI呼出しAPI内)は、JavaVMInitArgs引数に指定されたオプションの先頭に、これらのオプションを付加します。 セキュリティに問題がある場合、プラットフォームはこの機能を無効化することがあります。たとえばリファレンス実装は、UNIXシステムで実効ユーザーIDまたはグループIDが実際のIDと異なる場合に、この機能を無効化します。 この機能はツールの初期化(具体的にはネイティブまたはJavaプログラミング言語エージェントの起動など)をサポートするためのものです。 複数のツールがこの機能の使用を要求する可能性があるため、変数を上書きするのではなく、かわりに変数にオプションを追加すべきです。 変数が処理されるのは、JNI呼出しAPIのVM作成呼出し時であるため、ランチャによって処理されるオプション(VM選択オプションなど)は処理されません。

環境

JVM TI仕様では、複数JVM TIエージェントの同時使用がサポートされています。 各エージェントはそれぞれ独自のJVM TI環境を持ちます。 つまり、JVM TIの状態はエージェントごとに異なります。ある環境を変更しても、他の環境はその影響を受けません。 JVM TI環境の状態を次に示します。 エージェントのJVM TI状態はそれぞれ独立しているものの、エージェントはVMの共有状態を検査および変更するほか、実行先となるネイティブ環境も共有します。 このため、あるエージェントが他のエージェントの結果を混乱させたり、他のエージェントの失敗の原因となる可能性があります。 他のエージェントとの互換性のレベルを規定するのは、エージェント開発者の責任です。 JVM TI実装には、エージェント間の破壊的な相互作用を回避する機能はありません。 これらの問題が発生する可能性を減らす技法については、このドキュメントでは説明しません。
エージェントは、JNI呼び出しAPI関数 GetEnvにインタフェースIDとしてJVM TIのバージョン情報を渡すことによって、JVM TI環境を作成します。 JVM TI環境の作成と使用の詳細については、「JVM TI関数のアクセス」を参照してください。 通常、JVM TI環境は、Agent_OnLoadからGetEnvを呼び出すことによって作成されます。

バイト・コード・インストゥルメンテーション

このインタフェースには、プロファイリングをサポートするインタフェースに通常期待されるいくつかのイベントが含まれていません。 例として、完全な速度によるメソッドの開始および終了イベントがあります。 このインタフェースではかわりに、バイトコード・インストゥルメンテーション(ターゲット・プログラムを構成するJava仮想マシン・バイトコード命令を変更する機能)のサポートが提供されます。 これらの変更の目的は通常、メソッドのコードに「イベント」を追加すること(たとえば、メソッドの先頭にMyProfiler.methodEntered()呼出しを追加すること)です。 変更は単に追加されるため、アプリケーションの状態や動作が変更されることはありません。 挿入されるエージェント・コードは標準のバイトコードなので、VMをフル・スピードで実行できます(ターゲット・プログラムのみでなくインストゥルメンテーションも最適化される)。 インストゥルメンテーションにバイトコード実行からの切替えが含まれていなければ、高コストの状態遷移が不要となります。 その結果、イベントのパフォーマンスが高くなります。 さらにこのアプローチは、完全な制御機能をエージェントに提供します。コードの「関心のある」部分(エンド・ユーザーのコードなど)にインストゥルメンテーションを限定可能で、しかも条件付きにできます。 インストゥルメンテーションは、全体をJavaプログラミング言語コード内で実行することも、ネイティブ・エージェント内への呼出しを行うこともできます。 インストゥルメンテーションは、単純にカウンタを保持することも、イベントの統計サンプリングを行うこともできます。
インストゥルメンテーションの挿入は、次の3とおりのうちのいずれかの方法で行います。
このインタフェースに用意されたクラス変更機能は、インストゥルメンテーションのメカニズムを提供し(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を使えば、ラッパー・メソッドによるネイティブ・メソッドの計測が可能となります。

バイトコード・モジュール内のコードのインストゥルメンテーション

エージェントは、モジュールAddModuleReadsAddModuleExportsAddModuleOpensAddModuleUsesAddModuleProvidesを使用して、モジュールを更新して、読み込んだモジュールのセット、他のモジュールにエクスポートまたは開くパッケージのセット、または使用して提供するサービスを展開できます。
ブートストラップ・クラス・ローダーの検索パスまたはメイン・クラスをロードするクラス・ローダーの検索パスにサポート・クラスをデプロイするエージェントの助けとして、Java仮想マシンはClassFileLoadHookイベントによって変換されたクラスのモジュールを読み込むように調整します両方のクラス・ローダーの名前のないモジュール。

修正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によって解放してください。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
46
1.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を使用して割り当てられたメモリーを含む)を解放するために使用します。 割り当てられたすべてのメモリーを解除するまで、メモリーを再生することはできません。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
47
1.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";
            }
        
ライブ段階でしか呼び出せない
いいえ
17
1.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プログラミング言語スレッドのことです。 can_generate_early_vmstart機能が有効で、java.lang.Threadクラスがまだ初期化されていない場合、関数は開始フェーズでNULLを返します。
スレッドを引数に取るJVM TI関数のほとんどは、NULLを現在のスレッドを意味するものとして受け入れます。
開始またはライブ段階でしか呼び出せない
いいえ
18
1.1
権限
必要な機能
パラメータ
名前説明
thread_ptrjthread* 戻り時には、現在のスレッド、またはNULLをポイントします。
エージェントは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を参照)。
ライブ段階でしか呼び出せない
いいえ
4
1.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を呼び出すまで戻りません。 スレッドが現在中断されている場合、この関数は何も行わず、エラーを返します。
ライブ段階でしか呼び出せない
いいえ
5
1.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配列内に返されます。 現在中断しているスレッドの状態は変わりません。
ライブ段階でしか呼び出せない
いいえ
92
1.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()によって中断されているスレッドの実行を再開します。その他のスレッドには影響はありません。
ライブ段階でしか呼び出せない
いいえ
6
1.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()経由で中断されたすべてのスレッドの実行が再開されます。
ライブ段階でしか呼び出せない
いいえ
93
1.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のインスタンスを含む指定されたスレッドを強制終了するために使用します。
ライブ段階でしか呼び出せない
いいえ
7
1.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と同様)。
ライブ段階でしか呼び出せない
いいえ
8
1.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構造体のフィールドに、指定されたスレッドの詳細が入ります。
ライブ段階でしか呼び出せない
いいえ
9
1.0
権限
必要な機能

jvmtiThreadInfo - スレッド情報構造体
フィールド説明
namechar* スレッド名。修正UTF-8文字列としてエンコードされる。
priorityjint スレッドの優先順位。 スレッド優先順位定数jvmtiThreadPriorityを参照。
is_daemonjboolean デーモン・スレッドかどうか
thread_groupjthreadGroup このスレッドが属するスレッド・グループ。 スレッドが停止している場合はNULL
context_class_loaderjobject このスレッドに関連付けられているコンテキスト・クラス・ローダー。
パラメータ
名前説明
threadjthread 照会するスレッド。 threadNULLの場合、現在のスレッドが使用される。
info_ptrjvmtiThreadInfo* 戻ったとき、指定されたスレッドについての情報が入っている。
エージェントは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)
指定されたスレッドが所有するモニターについての情報を取得します。
ライブ段階でしか呼び出せない
いいえ
10
1.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)
指定されたスレッドが所有するモニターに関する情報と、それらのモニターをロックしているスタック・フレームの深さを取得します。
ライブ段階でしか呼び出せない
いいえ
153
1.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を使ってオブジェクトのモニターに入るか、モニターを獲得し直すのを待機している場合に、そのオブジェクトを取得します。
ライブ段階でしか呼び出せない
いいえ
11
1.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にアタッチされます-- 「VMへのアタッチ」のJNIドキュメントを参照してください。
ライブ段階でしか呼び出せない
いいえ
12
1.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は、エージェントに対して、スレッドごとの情報を記録するために利用できる、ポインタ・サイズのスレッド・ローカルな記憶領域を提供します。
開始またはライブ段階でしか呼び出せない
いいえ
103
1.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のスレッド・ローカルな記憶領域の値を取得するため、エージェントによって呼び出されます。
開始またはライブ段階でしか呼び出せない
いいえ
102
1.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内のトップ・レベルの(親がない)スレッド・グループをすべて返します。
ライブ段階でしか呼び出せない
いいえ
13
1.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構造体のフィールドに、指定されたスレッド・グループの詳細が入ります。
ライブ段階でしか呼び出せない
いいえ
14
1.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)
このスレッド・グループ内のライブ・スレッドとアクティブなサブグループを取得します。
ライブ段階でしか呼び出せない
いいえ
15
1.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™仮想マシン仕様のセクション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関数を使用できます。 このマッピングは、遅延してもかまいません。
ライブ段階でしか呼び出せない
いいえ
104
1.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);
        
ライブ段階でしか呼び出せない
いいえ
100
1.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を参照してください。
ライブ段階でしか呼び出せない
いいえ
101
1.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)
指定されたスレッドの呼出しスタックに現在入っているフレームの数を取得します。
アクティブにバイト・コードを実行しているスレッド(現在のスレッドではなく、中断されていないスレッドなど)のためにこの関数が呼び出された場合、一時的な情報が返されます。
ライブ段階でしか呼び出せない
いいえ
16
1.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™仮想マシン仕様の用語で説明すると、次のようになります。 ただし、呼出し先のメソッドで発生した引数の変更内容は保持されます。実行を続行すると、最初の実行指示が呼び出しとなります。
PopFrameの呼び出しとスレッドの再開の間、スタックの状態は未定義です。 最初のフレームよりも前にフレームをポップするには、次の3つのステップを繰り返す必要があります。
被呼出しメソッドを呼び出すことによって獲得されたロック(これがsynchronizedメソッドの場合)と、被呼出しメソッド内のsynchronizedブロックに入ることによって獲得されたロックは解放されます。 ノート: これは、ネイティブ・ロックやjava.util.concurrent.locksロックには適用されません。
最終的に、ブロックは実行されません。
グローバル状態への変更には対応しないので、変更は行われません。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
被呼出しメソッドと呼出し側のメソッドのどちらも、非ネイティブのJavaプログラミング言語のメソッドとします。
この関数は、JVM TIイベントを生成しません。
ライブ段階でしか呼び出せない
いいえ
80
1.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プログラミング言語のフレームについて、現在実行中の命令の位置を返します。
ライブ段階でしか呼び出せない
いいえ
19
1.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プログラミング言語のメソッドに対応するフレームだけが通知を受信できます。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。
ライブ段階でしか呼び出せない
いいえ
20
1.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™仮想マシン仕様のセクション3.6に定義されているとおり、関数の呼出し時に、指定されたスレッドの現在のメソッドになります。
指定されたスレッドは、中断されているか、現在のスレッドでなければいけません。 メソッドの復帰は、Javaプログラミング言語のコードの実行がこのスレッド上で再開されたときに行われます。 これらの関数のいずれかを呼び出してからスレッドの実行が再開されるまでの間のスタックの状態は未定義です。
被呼出しメソッドでは、これ以上の命令は実行されません。 特に、最終的にブロックは実行されません。 ノート: これにより、アプリケーション内で整合性のない状態が発生することがあります。
被呼出しメソッドを呼び出すことによって獲得されたロック(これがsynchronizedメソッドの場合)と、被呼出しメソッド内のsynchronizedブロックに入ることによって獲得されたロックは解放されます。 ノート: これは、ネイティブ・ロックやjava.util.concurrent.locksロックには適用されません。
通常復帰の場合と同様に、MethodExitなどのイベントが生成されます。
被呼出しメソッドは、非ネイティブのJavaプログラミング言語のメソッドとします。 スタック上にフレームが1つだけある状態でスレッドへの強制復帰を行なった場合、スレッドが再開時に終了します。

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

jvmtiError
ForceEarlyReturnObject(jvmtiEnv* env,
            jthread thread,
            jobject value)
この関数を使うと、結果の型がObjectまたはObjectのサブクラスであるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
81
1.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のいずれかであるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
82
1.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であるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
83
1.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であるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
84
1.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であるメソッドから復帰できます。
ライブ段階でしか呼び出せない
いいえ
85
1.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と宣言されていなければいけません。
ライブ段階でしか呼び出せない
いいえ
86
1.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™仮想マシン仕様のセクション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関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
115
1.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関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
116
1.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関数を使用します。 タグが設定されていないオブジェクトは、タグ値としてゼロを返します。
開始またはライブ段階でしか呼び出せない
いいえ
106
1.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関数を使用します。
開始またはライブ段階でしか呼び出せない
いいえ
107
1.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)
ヒープ内の指定されたタグを持つオブジェクトを返します。 オブジェクトとタグの並行配列の形式になります。
ライブ段階でしか呼び出せない
いいえ
114
1.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イベントが送信されているという保証はありません。 特に、ファイナライズ待ちのオブジェクトが解放されない可能性があります。
ライブ段階でしか呼び出せない
いいえ
108
1.0
権限
必要な機能
パラメータ
なし
エラー
この関数は、汎用エラーを返します


ヒープ(1.0)

ヒープ(1.0)の関数: ヒープ(1.0)の関数型: ヒープ(1.0)の型: これらの機能とデータ型は、元のJVM TIバージョン1.0で導入されました。 これらは非推奨であり、将来のリリースでエラーを返すように変更されます。 強力で柔軟なバージョン 何を行いますか: により、JVM TIバージョン1.2 (Java SE 6)で置き換えられました
現在のヒープ関数を使用してください
ヒープ・オブジェクトのフィルタの列挙(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™仮想マシン仕様のセクション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関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
109
1.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関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
110
1.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関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
111
1.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関数を実行しようとしているスレッドは通常ストールされます。
ライブ段階でしか呼び出せない
いいえ
112
1.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のサブクラスである局所変数の値を取得できます。
ライブ段階でしか呼び出せない
いいえ
21
1.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を返します。
ライブ段階でしか呼び出せない
いいえ
155
1.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のいずれかである局所変数の値を取得できます。
ライブ段階でしか呼び出せない
いいえ
22
1.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である局所変数の値を取得できます。
ライブ段階でしか呼び出せない
いいえ
23
1.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である局所変数の値を取得できます。
ライブ段階でしか呼び出せない
いいえ
24
1.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である局所変数の値を取得できます。
ライブ段階でしか呼び出せない
いいえ
25
1.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のサブクラスである局所変数の値を設定できます。
ライブ段階でしか呼び出せない
いいえ
26
1.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のいずれかである局所変数の値を設定できます。
ライブ段階でしか呼び出せない
いいえ
27
1.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である局所変数の値を設定できます。
ライブ段階でしか呼び出せない
いいえ
28
1.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である局所変数の値を設定できます。
ライブ段階でしか呼び出せない
いいえ
29
1.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である局所変数の値を設定できます。
ライブ段階でしか呼び出せない
いいえ
30
1.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イベントが生成されます。
ライブ段階でしか呼び出せない
いいえ
38
1.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で指定されたバイト・コードに設定されているブレークポイントを解除します。
ライブ段階でしか呼び出せない
いいえ
39
1.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を使用します。
ライブ段階でしか呼び出せない
いいえ
41
1.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で指定されるフィールドに対するフィールド・アクセスの監視を取り消します。
ライブ段階でしか呼び出せない
いいえ
42
1.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つだけ設定できます。
ライブ段階でしか呼び出せない
いいえ
43
1.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を使って以前に設定したフィールド変更の監視を取り消します。
ライブ段階でしか呼び出せない
いいえ
44
1.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
GetAllModules(jvmtiEnv* env,
            jint* module_count_ptr,
            jobject** modules_ptr)
仮想マシンにロードされたすべてのモジュールの配列を返します。 配列には、クラス・ローダーごとに名前のないモジュールが含まれています。 配列内のモジュールの数はmodule_count_ptr経由で返され、配列自体はmodules_ptr経由で返されます。
ライブ段階でしか呼び出せない
いいえ
3
9
権限
必要な機能
パラメータ
名前説明
module_count_ptrjint* 返り時、返されるモジュールの数を指します。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。
modules_ptrjobject** 返り時には、モジュールごとに1つ、参照の配列をポイントします。
エージェントはjobject*へのポインタを渡す。 戻ると、jobject*は、サイズ*module_count_ptrの新しく割り当てられた配列を指し示します。 この配列は、Deallocateを使って解放するべき。 modules_ptrによって返されるオブジェクトはJNIローカル参照であり、managedでなければなりません。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NULL_POINTER module_count_ptrNULLです。
JVMTI_ERROR_NULL_POINTER modules_ptrNULLです。

名前付きモジュールを取得

jvmtiError
GetNamedModule(jvmtiEnv* env,
            jobject class_loader,
            const char* package_name,
            jobject* module_ptr)
指定されたパッケージを含むクラス・ローダーに定義された名前付きモジュールのjava.lang.Moduleオブジェクトを返します。 モジュールはmodule_ptr経由で返されます。
名前付きモジュールがクラス・ローダーに定義されていて、パッケージが含まれている場合は、その名前付きモジュールが返されます。そうでない場合は、NULLが返されます。
ライブ段階でしか呼び出せない
いいえ
40
9
権限
必要な機能
パラメータ
名前説明
class_loader jobject クラス・ローダー。 class_loaderNULLまたはjava.lang.ClassLoaderのサブクラスでない場合、この関数はJVMTI_ERROR_ILLEGAL_ARGUMENTを返します。
class_loaderNULLの場合は、ブートストラップ・ローダーとみなされます。
package_nameconst char* パッケージの名前。「変更されたUTF-8」文字列としてエンコードされます。 パッケージ名は内部形式(JVMS 4.2.1)です。識別子はピリオドではなくスラッシュで区切られます。
エージェントは、charの配列を渡す。
module_ptrjobject* 戻り時には、java.lang.Moduleオブジェクトを指すか、NULLをポイントします。
エージェントはjobjectへのポインタを渡す。 戻ったとき、jobjectが設定されている。 module_ptrによって返されるオブジェクトは、JNIローカル参照であり、managedでなければなりません。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_ILLEGAL_ARGUMENT クラス・ローダーがNULLでなく、クラス・ローダー・オブジェクトでない場合。
JVMTI_ERROR_NULL_POINTER package_nameNULLです。
JVMTI_ERROR_NULL_POINTER module_ptrNULLです。

モジュールの読み込みを追加

jvmtiError
AddModuleReads(jvmtiEnv* env,
            jobject module,
            jobject to_module)
モジュールを更新して別のモジュールを読み込みます。 moduleが名前のないモジュールである場合、この関数はno-opです。 この関数は、モジュールが読み取るモジュールのセットを拡張する必要がある、指定されたモジュール内のコードの計測を容易にします。
ライブ段階でしか呼び出せない
いいえ
94
9
権限
必要な機能
パラメータ
名前説明
modulejobject 更新するモジュール。
to_modulejobject 読み込む追加モジュール。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_INVALID_MODULE moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_INVALID_MODULE to_moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_UNMODIFIABLE_MODULE モジュールを変更できない場合。 IsModifiableModuleを参照してください。
JVMTI_ERROR_NULL_POINTER moduleNULLです。
JVMTI_ERROR_NULL_POINTER to_moduleNULLです。

モジュールのエクスポートを追加

jvmtiError
AddModuleExports(jvmtiEnv* env,
            jobject module,
            const char* pkg_name,
            jobject to_module)
パッケージを別のモジュールにエクスポートするモジュールを更新します。 この関数は、moduleが名前のないモジュールまたはオープン・モジュールである場合、no-opです。 この関数は、モジュールがエクスポートするパッケージのセットを展開する必要がある、指定されたモジュールでのコードの計測を容易にします。
ライブ段階でしか呼び出せない
いいえ
95
9
権限
必要な機能
パラメータ
名前説明
modulejobject 更新するモジュール。
pkg_nameconst char* エクスポートされたパッケージ名。
エージェントは、charの配列を渡す。
to_modulejobject パッケージがエクスポートされるモジュール。 to_modulejava.lang.Moduleのサブクラスでない場合、この関数はJVMTI_ERROR_INVALID_MODULEを返します。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_INVALID_MODULE moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_INVALID_MODULE to_moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_ILLEGAL_ARGUMENT パッケージpkg_nameがモジュールに属していない場合。
JVMTI_ERROR_UNMODIFIABLE_MODULE モジュールを変更できない場合。 IsModifiableModuleを参照してください。
JVMTI_ERROR_NULL_POINTER moduleNULLです。
JVMTI_ERROR_NULL_POINTER pkg_nameNULLです。
JVMTI_ERROR_NULL_POINTER to_moduleNULLです。

モジュールの追加が開きます

jvmtiError
AddModuleOpens(jvmtiEnv* env,
            jobject module,
            const char* pkg_name,
            jobject to_module)
パッケージを別のモジュールに開くためにモジュールを更新します。 この関数は、moduleが名前のないモジュールまたはオープン・モジュールである場合、no-opです。 この機能では、モジュールでコードのインストゥルメンテーションが容易になります。このインストゥルメンテーションでは、モジュールが開いたパッケージのセットを他のモジュールに展開する必要があります。
ライブ段階でしか呼び出せない
いいえ
96
9
権限
必要な機能
パラメータ
名前説明
modulejobject 更新するモジュール。
pkg_nameconst char* 開くパッケージのパッケージ名。
エージェントは、charの配列を渡す。
to_modulejobject パッケージを開くモジュール。 to_modulejava.lang.Moduleのサブクラスでない場合、この関数はJVMTI_ERROR_INVALID_MODULEを返します。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_INVALID_MODULE moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_INVALID_MODULE to_moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_ILLEGAL_ARGUMENT パッケージpkg_nameがモジュールに属していない場合。
JVMTI_ERROR_UNMODIFIABLE_MODULE モジュールを変更できない場合。 IsModifiableModuleを参照してください。
JVMTI_ERROR_NULL_POINTER moduleNULLです。
JVMTI_ERROR_NULL_POINTER pkg_nameNULLです。
JVMTI_ERROR_NULL_POINTER to_moduleNULLです。

モジュール使用の追加

jvmtiError
AddModuleUses(jvmtiEnv* env,
            jobject module,
            jclass service)
モジュールを更新して、モジュールが使用する一連のサービスにサービスを追加します。 モジュールが名前のないモジュールである場合、この関数はno-opです。 この関数は、モジュールが使用している一連のサービスを拡張する必要がある名前付きモジュールでのコードの計装を容易にします。
ライブ段階でしか呼び出せない
いいえ
97
9
権限
必要な機能
パラメータ
名前説明
modulejobject 更新するモジュール。
servicejclass 使用するサービス。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_INVALID_MODULE moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_INVALID_CLASS serviceがクラス・オブジェクトでない場合。
JVMTI_ERROR_UNMODIFIABLE_MODULE モジュールを変更できない場合。 IsModifiableModuleを参照してください。
JVMTI_ERROR_NULL_POINTER moduleNULLです。
JVMTI_ERROR_NULL_POINTER serviceNULLです。

モジュールの追加機能

jvmtiError
AddModuleProvides(jvmtiEnv* env,
            jobject module,
            jclass service,
            jclass impl_class)
モジュールが提供する一連のサービスにサービスを追加するためのモジュールを更新します。 モジュールが名前のないモジュールである場合、この関数はno-opです。 この機能は、モジュール化されたモジュールでコードの計測を容易にします。このモジュールでは、提供されているサービスの変更が必要です。
ライブ段階でしか呼び出せない
いいえ
98
9
権限
必要な機能
パラメータ
名前説明
modulejobject 更新するモジュール。
servicejclass 提供するサービス。
impl_classjclass 提供されたサービスの実装クラス。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_INVALID_MODULE moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_INVALID_CLASS serviceがクラス・オブジェクトでない場合。
JVMTI_ERROR_INVALID_CLASS impl_classがクラス・オブジェクトでない場合。
JVMTI_ERROR_UNMODIFIABLE_MODULE モジュールを変更できない場合。 IsModifiableModuleを参照してください。
JVMTI_ERROR_NULL_POINTER moduleNULLです。
JVMTI_ERROR_NULL_POINTER serviceNULLです。
JVMTI_ERROR_NULL_POINTER impl_classNULLです。

変更可能モジュール

jvmtiError
IsModifiableModule(jvmtiEnv* env,
            jobject module,
            jboolean* is_modifiable_module_ptr)
モジュールが変更可能かどうかを判定します。 モジュールが変更可能な場合、このモジュールはAddModuleReadsAddModuleExportsAddModuleOpensAddModuleUses、およびAddModuleProvidesで更新できます。 モジュールが変更可能でない場合、これらの機能でモジュールを更新することはできません。 名前のないモジュールが変更可能かどうかを判断するために呼び出されると、この関数の結果は常にJNI_TRUEになります。
ライブ段階でしか呼び出せない
いいえ
99
9
権限
必要な機能
パラメータ
名前説明
modulejobject 問合せするモジュール。
is_modifiable_module_ptrjboolean* 戻ったとき、この関数のboolean型の結果をポイントする。
エージェントはjbooleanへのポインタを渡す。 戻ったとき、jbooleanが設定されている。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_INVALID_MODULE moduleがモジュール・オブジェクトでない場合。
JVMTI_ERROR_NULL_POINTER moduleNULLです。
JVMTI_ERROR_NULL_POINTER is_modifiable_module_ptrNULLです。


クラス

クラス関数: クラスの型: クラスのフラグおよび定数:

ロード済みクラスの取得

jvmtiError
GetLoadedClasses(jvmtiEnv* env,
            jint* class_count_ptr,
            jclass** classes_ptr)
仮想マシンにロードされている全クラスの配列を返します。 配列内のクラスの数はclass_count_ptr、配列自体はclasses_ptrによって返されます。
クラスまたはインタフェースの作成は、次のいずれかによってトリガーできます:
配列クラスは、Java仮想マシンによって直接作成されます。 作成は、クラス・ローダーを使用するか、リフレクションなどの特定のJava SEプラットフォームAPIでメソッドを呼び出すことでトリガーできます。
返されるリストには、「非表示のクラスまたはインタフェース」を含むすべてのクラスとインタフェース、およびすべてのタイプの(プリミティブ型の配列を含む)の配列クラスが含まれます。 プリミティブ・クラス(たとえば、java.lang.Integer.TYPE)は、返されるリストに含まれません。
ライブ段階でしか呼び出せない
いいえ
78
1.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)
このクラス・ローダーがClassLoader::loadClassClass::forNameおよびバイトコード・リンケージを介して名前で検索できるすべてのクラスの配列を返します。 つまり、initiating_loaderが開始ローダーとして記録されているすべてのクラスです。 返される配列内の各クラスは、このクラス・ローダーによって直接定義されて作成されたものか、または別のクラス・ローダーに委譲して作成されたものです。 Java™仮想マシン仕様のセクション5.3を参照してください。
返されるリストには、要素タイプが非表示のクラスまたはインタフェースである「非表示のクラスまたはインタフェース」または配列クラスは含まれません。これらは、どのクラス・ローダーでも検出できないためです。
配列内のクラスの数はclass_count_ptr、配列自体はclasses_ptrによって返されます。
Lookup::defineHiddenClassを参照してください。
ライブ段階でしか呼び出せない
いいえ
79
1.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によって示されるクラスの名前とジェネリック・シグネチャを返します。
クラスがクラスまたはインタフェースの場合:
klassで指定されたクラスが配列クラスを表す場合、返される名前は、配列のネストの深さを表す1つ以上の"["文字と、その後に要素タイプのクラス・シグネチャで構成される文字列です。 たとえば、java.lang.String []のクラス・シグネチャは"[Ljava/lang/String;"で、int []のクラス・シグネチャは"[I"です。
klassによって示されるクラスがプリミティブ型またはvoidを表す場合、返される名前は「対応するプリミティブ型の型シグネチャ文字」です。 たとえば、java.lang.Integer.TYPEは"I"です。
開始またはライブ段階でしか呼び出せない
いいえ
48
1.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など)。 設定されている場合、その他のすべてのビットはゼロ。
開始またはライブ段階でしか呼び出せない
いいえ
49
1.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を返します。
開始またはライブ段階でしか呼び出せない
いいえ
50
1.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™仮想マシン仕様の第4章に定義されています。
クラスが配列クラスの場合、そのpublic、privateおよびprotected修飾子は、そのコンポーネント型の修飾子と同じです。 プリミティブ型の配列の場合、このコンポーネント型は、プリミティブ・クラスの1つ(たとえば、java.lang.Integer.TYPE)で表現されます。
クラスがプリミティブ・クラスの場合、そのpublic修飾子は常にtrueになります。また、そのprotected修飾子およびprivate修飾子は常にfalseになります。
クラスが配列クラスまたはプリミティブ・クラスの場合、そのfinal修飾子は常にtrueになり、interface修飾子は常にfalseになります。 その他の修飾子の値は、この仕様では判定されません。
開始またはライブ段階でしか呼び出せない
いいえ
51
1.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)の場合、空のメソッド・リストが返されます。
開始またはライブ段階でしか呼び出せない
いいえ
52
1.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を使って、配列の長さを判別してください。
開始またはライブ段階でしか呼び出せない
いいえ
53
1.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)の場合、空のインタフェース・リストが返されます。
開始またはライブ段階でしか呼び出せない
いいえ
54
1.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™仮想マシン仕様の第4章で定義されているように、マイナー・バージョン番号とメジャー・バージョン番号を返します。
開始またはライブ段階でしか呼び出せない
いいえ
145
1.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™仮想マシン仕様の第4章に記載されたconstant_pool項目の形式で定数プールのrawバイトを返します。 定数プールの形式は、クラス・ファイル形式のバージョンによって異なる可能性があるので、クラスのメジャー・バージョン番号、マイナー・バージョン番号に互換性があることを確認するようにしてください。
返される定数プールのレイアウトや内容が、定義元のクラス・ファイル内の定数プールと同じでないこともあります。 GetConstantPool()から返される定数プールのエントリ数は、定義元の定数プールのエントリ数と異なる場合があります。 エントリの順序が異なる場合もあります。 GetConstantPool()から返される定数プールは、GetBytecodes()が使用する定数プールに一致します。 つまり、GetBytecodes()から返されるバイト・コードに含まれる定数プール・インデックスは、GetConstantPool()から返される定数プールのエントリを参照します。 RetransformClassesおよびRedefineClassesは定数プールを変更できるため、この関数から返される定数プールは、それに応じて変更される可能性があります。 したがって、途中でクラスの再変換または再定義が行われた場合は、GetConstantPool()とGetBytecodes()の間の対応関係が維持されません。 ある特定のバイト・コードが使用する定数プール・エントリの値は、定義元クラス・ファイルの対応する値に一致します(インデックスが一致しない場合でも)。 バイト・コードが直接的にも間接的にも使用しない定数プール・エントリ(注釈に関連付けられているUTF-8文字列など)は、返された定数プール内に存在していなくてもかまいません。
開始またはライブ段階でしか呼び出せない
いいえ
146
1.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を返します。
開始またはライブ段階でしか呼び出せない
いいえ
55
1.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になります。
開始またはライブ段階でしか呼び出せない
いいえ
56
1.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)、配列クラス、およびいくつかの実装定義クラスは決して変更できません。
開始またはライブ段階でしか呼び出せない
いいえ
45
1.1
権限
必要な機能
任意の機能
権限効果
can_redefine_any_class 所有していれば、すべてのクラス(プリミティブ、配列、および一部の実装定義クラスを除く)はRedefineClassesで変更可能です。
can_retransform_any_class 所有していれば、すべてのクラス(プリミティブ、配列、およびいくつかの実装定義クラスを除く)はRetransformClassesで変更可能です。
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を介して返します。
開始またはライブ段階でしか呼び出せない
いいえ
57
1.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のクラス・ファイルに存在するデバッグ拡張情報がそのまま含まれます。
開始またはライブ段階でしか呼び出せない
いいえ
90
1.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以外のイベントが送信されることはありません。
再変換によって、メソッド本体、定数プール、属性(明示的に禁止されていない場合)が変更される可能性があります。 再変換では、フィールドまたはメソッドの追加、削除、名前変更、メソッドのシグネチャの変更、修飾子の変更、継承の変更を行わないようにする必要があります。 再変換では、NestHostNestMembersRecordまたはPermittedSubclasses属性を変更しないでください。 これらの制限は将来のバージョンで解除される可能性があります。 未サポートの再変換が試みられた場合に返されるエラー・コードについては、後述のエラー戻り値の説明を参照してください。 クラス・ファイルのバイトが検証またはインストールされるのは、それらのバイトがClassFileLoadHookイベントのチェーンを通過した後なので、返されるエラー・コードは再変換の結果を反映したものになります。 JVMTI_ERROR_NONE以外のエラー・コードが返された場合、再変換対象のどのクラスについても、新しい定義がインストールされることはありません。 この関数が(エラー・コードJVMTI_ERROR_NONEで)復帰した場合は、再変換対象のすべてのクラスで新しい定義がインストールされます。
ライブ段階でしか呼び出せない
いいえ
152
1.1
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_retransform_classes RetransformClassesでクラスを再変換できる。 特定の実装によって適用されるこの権限の制限(「権限」セクションを参照)に加え、この権限は、この環境でClassFileLoadHookイベントがはじめて有効化される前に設定する必要がある。 ClassFileLoadHookがはじめて有効化された時点でこの権限を所有している環境を「再変換可能」と呼ぶ。 ClassFileLoadHookがはじめて有効化された時点でこの権限を所有していない環境を「再変換不可能」と呼ぶ。
任意の機能
can_retransform_any_class RetransformClassesは、変更可能なクラスで呼び出すことができます。 IsModifiableClassを参照してください。(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_ATTRIBUTE_CHANGED 再変換されるクラス・ファイルに、クラス属性のサポートされていない相違があります。
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イベントは送信されません。
再定義では、メソッド本体、定数プール、属性(明示的に禁止されていない場合)を変更できます。 再定義では、フィールドまたはメソッドの追加、削除、名前変更、メソッドのシグネチャの変更、修飾子の変更、継承の変更を行わないようにする必要があります。 再定義では、NestHostNestMembersRecordまたはPermittedSubclasses属性を変更しないでください。 これらの制限は将来のバージョンで解除される可能性があります。 未サポートの再定義が試みられた場合に返されるエラー・コードについては、後述のエラー戻り値の説明を参照してください。 クラス・ファイルのバイトが検証またはインストールされるのは、それらのバイトがClassFileLoadHookイベントのチェーンを通過した後なので、返されるエラー・コードは、class_definitionsに渡されたバイトに適用された変換の結果を反映したものになります。 JVMTI_ERROR_NONE以外のエラー・コードが返された場合、再定義対象のどのクラスについても、新しい定義がインストールされることはありません。 この関数が(エラー・コードJVMTI_ERROR_NONEで)復帰した場合は、再定義対象のすべてのクラスで新しい定義がインストールされます。
ライブ段階でしか呼び出せない
いいえ
87
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_redefine_classes RedefineClassesでクラスを再定義できる。
任意の機能
can_redefine_any_class RedefineClassesは、変更可能なすべてのクラスでコールできます。 IsModifiableClassを参照してください。(can_redefine_classesも設定する必要があります)

jvmtiClassDefinition - クラスの再定義の説明
フィールド説明
klassjclass このクラスのクラス・オブジェクト
class_byte_countjint 定義するクラスのバイト数(下)
class_bytesconst unsigned char* クラスを定義するバイト(Java™仮想マシン仕様の第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_ATTRIBUTE_CHANGED 新しいクラス・バージョンに、クラス属性でサポートされていない相違があります。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED 新しいクラスのバージョンの修飾子が異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED 新しいクラスのバージョンのメソッドの修飾子が旧クラスのバージョンの修飾子と異なる。
JVMTI_ERROR_UNMODIFIABLE_MODULE モジュールを変更することはできません。 IsModifiableModuleを参照してください。
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の単一呼出しの間に変わる可能性があります。
開始またはライブ段階でしか呼び出せない
いいえ
154
1.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経由で返します。 このハッシュ・コードを使えばオブジェクト参照のハッシュ・テーブルを保守できますが、その場合、一部の実装でパフォーマンスが大幅に低下する可能性があります。ほとんどの場合、オブジェクトに情報を関連付けるための手段としては、タグのほうが効率的です。 この関数は、特定のオブジェクトに対し、その存続期間を通じて同じハッシュ・コード値を保証します。
開始またはライブ段階でしか呼び出せない
いいえ
58
1.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構造体のフィールドに、モニターの使用に関する情報が入ります。
ライブ段階でしか呼び出せない
いいえ
59
1.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™仮想マシン仕様、章4.3.2」field descriptorsと呼ばれます。
開始またはライブ段階でしか呼び出せない
いいえ
60
1.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、スーパー・クラス、または実装されたインタフェースのいずれかです。
開始またはライブ段階でしか呼び出せない
いいえ
61
1.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™仮想マシン仕様の第4章に定義されています。
開始またはライブ段階でしか呼び出せない
いいえ
62
1.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を介してそのフィールドが合成であるかどうかを示す値を返します。 合成フィールドはコンパイラによって生成されますが、元のソース・コード内には存在しません。
開始またはライブ段階でしか呼び出せない
いいえ
63
1.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™仮想マシン仕様、第4.3.3章」method descriptorsと呼ばれます。 Java言語仕様に定義されたメソッドのシグニチャとは異なる点に注意してください。
開始またはライブ段階でしか呼び出せない
いいえ
64
1.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を介して返します。
開始またはライブ段階でしか呼び出せない
いいえ
65
1.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™仮想マシン仕様の第4章に定義されています。
開始またはライブ段階でしか呼び出せない
いいえ
66
1.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™仮想マシン仕様のセクション4.7.3max_localsの説明を参照してください。
開始またはライブ段階でしか呼び出せない
いいえ
68
1.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つ使用します。
開始またはライブ段階でしか呼び出せない
いいえ
69
1.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を介して返されます。
開始またはライブ段階でしか呼び出せない
いいえ
70
1.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を引いた値をポイントします。
開始またはライブ段階でしか呼び出せない
いいえ
71
1.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)
局所変数の情報を返します。
ライブ段階でしか呼び出せない
いいえ
72
1.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経由で返されます。
開始またはライブ段階でしか呼び出せない
いいえ
75
1.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を介して返します。
開始またはライブ段階でしか呼び出せない
いいえ
76
1.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を介して返します。 合成メソッドは、コンパイラによって生成されますが、元のソース・コード内には存在しません。
開始またはライブ段階でしか呼び出せない
いいえ
77
1.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が廃止メソッド・バージョンを参照しているかどうかを判定します。
開始またはライブ段階でしか呼び出せない
いいえ
91
1.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_接頭辞が適用されます。
接頭辞は解決時に使用されますが、その解決はいつでも遅延される可能性があります。したがって、ネイティブ・メソッドの接頭辞は、対応する接頭辞付きのネイティブ・メソッドが存在しているかぎり、設定されたままにしておく必要があります。
どの段階でも呼び出せる
いいえ
73
1.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の複数のJVMTI環境からのプレフィクスの適用で説明されているのと同じ方法で処理されます。
以前の接頭辞はすべて置換されます。 したがって、prefix_count0を指定してこの関数を呼び出すと、この環境の接頭辞機能が無効になります。
SetNativeMethodPrefixとこの関数が、接頭辞を設定するための2つの方法です。 1つの接頭辞を指定してSetNativeMethodPrefixを呼び出すのは、prefix_count1を指定してこの関数を呼び出すのと同じです。 NULLを指定してSetNativeMethodPrefixを呼び出すのは、prefix_count0を指定してこの関数を呼び出すのと同じです。
どの段階でも呼び出せる
いいえ
74
1.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またはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
31
1.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またはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
32
1.0
権限
必要な機能
パラメータ
名前説明
monitorjrawMonitorID モニター
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NOT_MONITOR_OWNER モニターの所有者ではない。
JVMTI_ERROR_INVALID_MONITOR monitorがjrawMonitorIDではない。

rawモニターの開始

jvmtiError
RawMonitorEnter(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターの排他的所有権を取得します。 同じスレッドで複数回モニターを入力することができます。 スレッドは、モニターを入力回数分だけ終了する必要があります。 モニターがOnLoad (接続されたスレッドが生成される前)の段階で入力され、接続されたスレッドが生成された時点で終了していない場合、入力はメイン・スレッドで行われたと認識されます。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
33
1.0
権限
必要な機能
パラメータ
名前説明
monitorjrawMonitorID モニター
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_INVALID_MONITOR monitorがjrawMonitorIDではない。

rawモニターの終了

jvmtiError
RawMonitorExit(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターの排他的所有権を解放します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
34
1.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が経過するまで、現在のスレッドを待機させます。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
35
1.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つのスレッドに通知します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
36
1.0
権限
必要な機能
パラメータ
名前説明
monitorjrawMonitorID モニター
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NOT_MONITOR_OWNER モニターの所有者ではない。
JVMTI_ERROR_INVALID_MONITOR monitorがjrawMonitorIDではない。

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

jvmtiError
RawMonitorNotifyAll(jvmtiEnv* env,
            jrawMonitorID monitor)
rawモニターを待機中のすべてのスレッドに通知します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
37
1.0
権限
必要な機能
パラメータ
名前説明
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として定義されるため、コンパイラによっては最適化によってテーブルへのアクセス機能が除去され、その結果、この関数が無効になる可能性があります。 テーブルはコピーされます。テーブルのローカル・コピーを変更しても、何の効果もありません。 この関数の影響を受けるのは関数テーブルのみであり、環境の他の側面はすべて何の影響も受けません。 前述の例を参照してください。
開始またはライブ段階でしか呼び出せない
いいえ
120
1.0
権限
必要な機能
パラメータ
名前説明
function_tableconst jniNativeInterface * 新しいJNI関数テーブルをポイントする。
エージェントはjniNativeInterfaceへのポインタを渡す。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NULL_POINTER function_tableNULL

JNI関数テーブルの取得

jvmtiError
GetJNIFunctionTable(jvmtiEnv* env,
            jniNativeInterface** function_table)
JNI関数テーブルを取得します。 JNI関数テーブルは、割り当てられたメモリーにコピーされます。 SetJNIFunctionTableが呼び出されていた場合、(元の関数テーブルではなく)変更後の関数テーブルが返されます。 コピーされるのは関数テーブルのみであり、環境の他の側面はコピーされません。 前述の例を参照してください。
開始またはライブ段階でしか呼び出せない
いいえ
121
1.0
権限
必要な機能
パラメータ
名前説明
function_table jniNativeInterface ** 戻ったとき、*function_tableは新しく割り当てられたJNI関数テーブルのコピーをポイントする。
エージェントはjniNativeInterface*へのポインタを渡す。 戻り時に、jniNativeInterface*は、新しく割り当てられた配列をポイントする。 この配列は、Deallocateを使って解放するべき。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NULL_POINTER function_tableNULL


イベント管理

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

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

jvmtiError
SetEventCallbacks(jvmtiEnv* env,
            const jvmtiEventCallbacks* callbacks,
            jint size_of_callbacks)
イベントごとに呼び出される関数を設定します。 コールバックを指定するには、置換用の関数テーブルを提供します。 関数テーブルはコピーされます。テーブルのローカル・コピーを変更しても、何の効果もありません。 これはアトミックなアクションであり、一度にすべてのコールバックが設定されます。 この関数を呼び出すまで、イベントは送信されません。 エントリがNULLの場合またはイベントがsize_of_callbacksを超えている場合、イベントは送信されません。 イベントの詳細は、このドキュメントの後のほうで説明します。 イベントが送信されるためには、イベントを有効化し、そのコールバックを登録する必要があります。この関数とSetEventNotificationModeの呼出し順序は、結果に影響を与えません。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
122
1.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が無効化される
event_threadNULLの場合、イベントはグローバルに有効化または無効化されます。それ以外の場合、特定のスレッドに対して有効化または無効化されます。 あるイベントが特定のスレッドで生成されるのは、そのイベントがスレッド・レベル、グローバル・レベルのいずれかで有効化された場合です。
個々のイベントについての情報は、後述する説明を参照してください。
次のイベントは、この関数を使ってスレッド・レベルでは制御できません。
最初は、スレッド・レベルで有効にされているイベントも、グローバル・レベルで有効にされているイベントもありません。
この関数を呼び出す前に、必要な権限(後述の「イベントを有効化する権限」を参照)を所有している必要があります。
イベントの詳細については、後述します。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
2
1.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
can_generate_sampled_object_alloc_eventsSampledObjectAlloc
パラメータ
名前説明
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にもう残っていない場合、単にイベントが送信されず、エラーも返されません。
サポートされるイベントは次のとおりです。
ライブ段階でしか呼び出せない
いいえ
123
1.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またはライブ段階でしか呼び出せない
いいえ
124
1.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またはライブ段階でしか呼び出せない
いいえ
125
1.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, ...)
最後の「...」は可変引数を表します。 myHandler内のjint引数は、Cプログラミング言語のva_*構文を使用して抽出する必要があります。
パラメータ
名前説明
jvmti_env jvmtiEnv * JVM TI環境は、拡張イベントの唯一の固定パラメータ。
...... 拡張イベント固有のパラメータ

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

jvmtiError
SetExtensionEventCallback(jvmtiEnv* env,
            jint extension_event_index,
            jvmtiExtensionEvent callback)
拡張イベントにコールバック関数を設定し、イベントを有効にします。 コールバックがNULLの場合、イベントを無効にします。 標準イベントとは異なり、コールバックを設定してイベントを有効にする処理は単一の操作です。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
126
1.0
権限
必要な機能
パラメータ
名前説明
extension_event_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 can_generate_early_vmstart : 1;
    unsigned int can_generate_early_class_hook_events : 1;
    unsigned int can_generate_sampled_object_alloc_events : 1;
    unsigned int : 4;
    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_classes RedefineClassesでクラスを再定義できる。 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_events FramePopイベントを設定し、取得できる。 1.0
can_generate_breakpoint_events Breakpointイベントを設定し、取得できる。 1.0
can_suspend スレッドを中断し、再開できる。 1.0
can_redefine_any_class RedefineClassesは、変更可能なすべてのクラスでコールできます。 IsModifiableClassを参照してください。(can_redefine_classesも設定する必要があります) 1.0
can_get_current_thread_cpu_time 現在のスレッドCPU時間を取得できる 1.0
can_get_thread_cpu_time スレッドCPU時間を取得できる 1.0
can_generate
_method_entry_events
メソッドに入るときにメソッド・エントリ・イベントを生成できる 1.0
can_generate
_method_exit_events
メソッドの終了時にメソッド終了イベントを生成できる。 1.0
can_generate
_all_class_hook_events
ロードされたすべてのクラスに対して、ClassFileLoadHookイベントを生成できる。 1.0
can_generate
_compiled_method_load_events
メソッドのコンパイル時またはアンロード時にイベントを生成できる 1.0
can_generate
_monitor_events
モニターの使用率に関するイベントを生成できる。 1.0
can_generate
_vm_object_alloc_events
オブジェクトのVM割当てに関するイベントを生成できる。 1.0
can_generate
_native_method_bind_events
ネイティブ・メソッドが実装にバインドされているときイベントを生成できる。 1.0
can_generate
_garbage_collection_events
ガベージ・コレクションの開始または終了時にイベントを生成できる。 1.0
can_generate
_object_free_events
ガベージ・コレクタがオブジェクトを解放するときにイベントを生成できる。 1.0
can_force_early_return 早期復帰の強制のカテゴリで説明しているように、メソッドから早期復帰できます。 1.1
can_get_owned_monitor_stack_depth_info 所有されているモニターに関する情報とスタックの深さを取得できる - GetOwnedMonitorStackDepthInfo 1.1
can_get_constant_pool あるクラスの定数プールを取得できる - GetConstantPool 1.1
can_set_native_method_prefix ネイティブ・メソッドを解決できない場合に適用すべき接頭辞を設定できる - SetNativeMethodPrefixおよびSetNativeMethodPrefixes 1.1
can_retransform_classes RetransformClassesでクラスを再変換できる。 特定の実装によって適用されるこの権限の制限(「権限」セクションを参照)に加え、この権限は、この環境でClassFileLoadHookイベントがはじめて有効化される前に設定する必要がある。 ClassFileLoadHookがはじめて有効化された時点でこの権限を所有している環境を「再変換可能」と呼ぶ。 ClassFileLoadHookがはじめて有効化された時点でこの権限を所有していない環境を「再変換不可能」と呼ぶ。 1.1
can_retransform_any_class RetransformClassesは、変更可能なクラスで呼び出すことができます。 IsModifiableClassを参照してください。(can_retransform_classesも設定する必要があります) 1.1
can_generate_resource_exhaustion_heap_events VMがJavaTMプラットフォーム・ヒープからメモリーの割り当てを行えない場合に、イベントを生成できる。 ResourceExhaustedを参照してください。 1.1
can_generate_resource_exhaustion_threads_events VMがスレッドを作成できない場合にイベントを生成できる。 ResourceExhaustedを参照してください。 1.1
can_generate_early_vmstart VMStartイベントを早期に生成できます。 VMStartを参照してください。 9
can_generate_early_class_hook_events 初期段階でClassFileLoadHookイベントを生成できます。 この機能とcan_generate_all_class_hook_eventsが有効になっていると、初期段階にロードされたクラスに対してClassFileLoadHookイベントを通知できます。 ClassFileLoadHookを参照してください。 9
can_generate_sampled_object_alloc_events サンプリングされた配賦イベントを生成できます。 この機能が有効な場合は、ヒープ・サンプリング・メソッドSetHeapSamplingIntervalをコールでき、SampledObjectAllocイベントを生成できます。 11

潜在的な権限の取得

jvmtiError
GetPotentialCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)
この時点でこの環境が所有できる可能性のあるJVM TI機能を、capabilities_ptr経由で返します。 返される権限が、VMに実装された完全な権限セットと異なる場合が2つあります。1つの環境しか所有できない権限を別の環境が所有している場合と、現在の段階がライブであり、OnLoad段階でしか追加できない権限が存在している場合です。 AddCapabilities関数を使えば、これらの権限のいずれかまたはすべてを設定できます。 現在所有されている権限が含まれます。
通常、この関数は、OnLoad関数で使用されます。 一部の仮想マシンでは、ライブ段階で追加できる権限のセットが制限されています。 この場合、潜在的に使用可能な権限のセットが、OnLoad段階のセットとは異なります。
権限の例を参照してください。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
140
1.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またはライブ段階でしか呼び出せない
いいえ
142
1.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またはライブ段階でしか呼び出せない
いいえ
143
1.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呼出しの最終結果を返します。
権限の例を参照してください。
どの段階でも呼び出せる
いいえ
89
1.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を参照してください。
開始またはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
134
1.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)
開始またはライブ段階でしか呼び出せない
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
135
1.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を参照してください。
ライブ段階でしか呼び出せない
いいえ
136
1.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により、このタイマーの情報を取得します。
ライブ段階でしか呼び出せない
いいえ
137
1.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の呼出し中に変更されません。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
138
1.0
権限
必要な機能
パラメータ
名前説明
info_ptrjvmtiTimerInfo* 戻ったとき、GetTimeによって返される時間を説明する情報が入っている。
エージェントはjvmtiTimerInfoへのポインタを渡す。 戻ったとき、jvmtiTimerInfoが設定されている。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NULL_POINTER info_ptrNULL

時間の取得

jvmtiError
GetTime(jvmtiEnv* env,
            jlong* nanos_ptr)
システム・タイマーの現在の値(ナノ秒単位)を返します。
返される値は、固定された任意の時間からのナノ秒を表します(固定された任意の時間が将来の時間である場合は負の値になる)。 この関数では、ナノ秒単位の精度が提供されますが、必ずしもナノ秒単位の精密度が得られるとはかぎりません。 値の変更頻度は保証されません。
GetTimerInfoにより、このタイマーの情報を取得します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
139
1.0
権限
必要な機能
パラメータ
名前説明
nanos_ptrjlong* 戻ったとき、ナノ秒単位で時間をポイントする。 これは符号なしの値である。 jlong (符号付きの値)としてテストまたは出力した場合、負の数値として表示される場合がある。
エージェントはjlongへのポインタを渡す。 戻ったとき、jlongが設定されている。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NULL_POINTER nanos_ptrNULL

使用可能なプロセッサの取得

jvmtiError
GetAvailableProcessors(jvmtiEnv* env,
            jint* processor_count_ptr)
Java仮想マシンが使用できるプロセッサの数を返します。
この値は、仮想マシンの呼出し中に変更される可能性があります。 このため、使用可能なプロセッサの数に影響を受けるアプリケーションは、ときどきこのプロパティをポーリングする必要があります。
どの段階でも呼び出せる
いいえ
144
1.0
権限
必要な機能
パラメータ
名前説明
processor_count_ptrjint* 戻ったとき、仮想マシンが使用できる最大プロセッサ数をポイントする(必ず1以上)。
エージェントはjintへのポインタを渡す。 戻ったとき、jintが設定されている。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NULL_POINTER processor_count_ptrNULL


クラス・ローダー検索

クラス・ローダー検索の関数: これらの関数を使えば、エージェントは、クラス・ローダーがクラスを検索する際の場所を追加できます。 これは、正しいクラス・ローダーでインストゥルメンテーションをインストールする際に便利です。

ブートストラップ・クラス・ローダー検索の追加

jvmtiError
AddToBootstrapClassLoaderSearch(jvmtiEnv* env,
            const char* segment)
この関数では、ブートストラップ・クラス・ローダーを使用してインストゥルメンテーション・クラスを定義できます。 Java™仮想マシン仕様のセクション5.3.1を参照してください。 ブートストラップ・クラス・ローダーによるクラスの検索が失敗すると、指定されたプラットフォーム依存の検索パスsegmentも検索されます。 segmentに指定できるセグメントは1つのみです。 この関数を複数回呼び出せば、複数のセグメントを追加できます。セグメントの検索は、この関数が呼び出された順番で行われます。
OnLoad段階でこの関数を使うと、ブートストラップ・クラス・ローダーがクラスの検索に失敗した際に、追加で検索する任意のプラットフォーム依存の検索パス・セグメントを指定できます。 このセグメントは通常、ディレクトリとJARファイルのいずれかになります。
ライブ段階でsegmentを使うと、任意のプラットフォーム依存のJARファイルへのパスを指定できます。 ブートストラップ・クラス・ローダーがインストゥルメンテーション目的で定義するクラスやリソース以外のものがJARファイルに含まれないように、エージェントで確認するようにしてください。
Java™仮想マシン仕様には、Java仮想マシンが以前にシンボリック参照を解決しようとして失敗した場合、その後このシンボリック参照を解決しようとしても、最初に解決しようとした結果としてスローされたエラーと同じエラーで必ず失敗すると記述されています。 したがって、Java仮想マシンが参照を解決できなかったクラスに対応するエントリがJARファイルに含まれる場合、その参照を解決しようとしても最初のエラーと同じエラーで失敗します。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
149
1.0
権限
必要な機能
パラメータ
名前説明
segmentconst char* プラットフォーム依存の検索パス・セグメント、修正UTF-8文字列としてエンコードされる。
エージェントは、charの配列を渡す。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_ILLEGAL_ARGUMENT segmentが無効なパス。 ライブ段階では、既存のJARファイル以外はすべて無効なパスとなる。
JVMTI_ERROR_NULL_POINTER segmentNULL

システム・クラス・ローダー検索の追加

jvmtiError
AddToSystemClassLoaderSearch(jvmtiEnv* env,
            const char* segment)
この関数では、システム・クラス・ローダーを使用してインストゥルメンテーション・クラスを定義できます。 Java™仮想マシン仕様のセクション5.3.2を参照してください。 クラス・ローダーによるクラスの検索が失敗すると、指定されたプラットフォーム依存の検索パスsegmentも検索されます。 segmentに指定できるセグメントは1つのみです。 この関数を複数回呼び出せば、複数のセグメントを追加できます。セグメントの検索は、この関数が呼び出された順番で行われます。
OnLoad段階でこの関数を使うと、システム・クラス・ローダーがクラスの検索に失敗した際に、追加で検索する任意のプラットフォーム依存の検索パス・セグメントを指定できます。 このセグメントは通常、ディレクトリとJARファイルのいずれかになります。
ライブ段階では、segmentは、システム・クラス・ローダーがクラスの検索に失敗した際に、追加で検索するプラットフォーム依存のJARファイルへのパスになります。 システム・クラス・ローダーがインストゥルメンテーション目的で定義するクラスやリソース以外のものがJARファイルに含まれないように、エージェントで確認するようにしてください。
ライブ段階でシステム・クラス・ローダーが検索対象JARファイルの追加をサポートするのは、java.lang.String型の単一パラメータを取るappendToClassPathForInstrumentationという名前のメソッドをシステム・クラス・ローダーが実装している場合です。 このメソッドは、publicアクセスを備えていなくてもかまいません。
Java™仮想マシン仕様には、Java仮想マシンが以前にシンボリック参照を解決しようとして失敗した場合、その後このシンボリック参照を解決しようとしても、最初に解決しようとした結果としてスローされたエラーと同じエラーで必ず失敗すると記述されています。 したがって、Java仮想マシンが参照を解決できなかったクラスに対応するエントリがJARファイルに含まれる場合、その参照を解決しようとしても最初のエラーと同じエラーで失敗します。
OnLoadまたはライブ段階でしか呼び出せない
いいえ
151
1.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またはライブ段階でしか呼び出せない
いいえ
130
1.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またはライブ段階でしか呼び出せない
No
131
1.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段階でしか呼び出せない段階
No
132
1.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イベントは、ライブ段階でしか送信されません。 次のイベントは、その他の段階で扱われます。
どの段階でも呼び出せる
No
133
1.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モニター上で待機しているスレッドの状態は、何の影響も受けません。
この環境のネイティブ・メソッド接頭辞はすべて設定解除されます。エージェントは、破棄を呼び出す前に接頭辞付きネイティブ・メソッドをすべて削除しなければなりません。
この環境で保持されている権限はすべて放棄されます。
この環境で有効化されたイベントは送信されなくなりますが、現在実行中のイベント・ハンドラは引き続き実行されます。 環境が破棄されたために実行中に無効になる可能性のあるイベント・ハンドラを設計する際には、十分に注意を払う必要があります。
この環境は、この呼出しのあとは使用できません。 この呼出しは呼出し元に戻ります。
どの段階でも呼び出せる
No
127
1.0
権限
必要な機能
パラメータ
なし
エラー
この関数は、汎用エラーを返します

環境ローカル記憶領域の設定

jvmtiError
SetEnvironmentLocalStorage(jvmtiEnv* env,
            const void* data)
VMは、個々の環境に関連付けられているポインタ値を格納します。 このポインタ値を環境ローカルな記憶領域と呼びます。 この関数で設定されない場合、値はNULLになります。 エージェントは、環境固有の情報を格納するため、メモリーを割り当てることができます。 環境ローカルな記憶領域を設定することにより、GetEnvironmentLocalStorageを使ってアクセスできるようになります。
JVM TIの環境ローカルな記憶領域の値を設定するため、エージェントによって呼び出されます。 JVM TIは、エージェントに対して、環境ごとの情報を記録するために利用できる、ポインタ・サイズの環境ローカルな記憶領域を提供します。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
148
1.0
権限
必要な機能
パラメータ
名前説明
dataconst void * 環境ローカルな記憶領域に入力する値。
エージェントがポインタを渡す。 dataNULLの場合、値はNULLに設定される。
エラー
この関数は、汎用エラーを返します

環境ローカル記憶領域の取得

jvmtiError
GetEnvironmentLocalStorage(jvmtiEnv* env,
            void** data_ptr)
JVM TIの環境ローカルな記憶領域の値を取得するため、エージェントによって呼び出されます。
どの段階でも呼び出せる
この関数はヒープ反復関数のコールバックから、またはGarbageCollectionStartイベント、GarbageCollectionFinishイベント、ObjectFreeイベントから呼び出せます。
147
1.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 シフトにより、マイクロ・バージョン番号を抽出する。
どの段階でも呼び出せる
No
88
1.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"を返します。
どの段階でも呼び出せる
No
128
1.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に送信される出力です。
どの段階でも呼び出せる
No
150
1.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の値は、その他の表現を持つ。
どの段階でも呼び出せる
No
129
1.0
権限
必要な機能
パラメータ
名前説明
format_ptrjvmtiJlocationFormat* 戻ったとき、jlocation値の形式識別子をポイントする。
エージェントはjvmtiJlocationFormatへのポインタを渡す。 戻ったとき、jvmtiJlocationFormatが設定されている。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_NULL_POINTER format_ptrNULL


ヒープ・モニタリング

ヒープ・モニタリング関数:

ヒープ・サンプリング間隔の設定

jvmtiError
SetHeapSamplingInterval(jvmtiEnv* env,
            jint sampling_interval)
オブジェクトが割り当てられたときにSampledObjectAllocイベントを生成します。 各スレッドは、割り当てられたバイトのカウンタを保持します。 このイベントは、最後のサンプル以降にそのカウンタがsampling_intervalの平均を超える場合にのみ生成されます。
sampling_intervalを0に設定すると、新しい間隔が考慮されたときに、システムでサポートされている各割当てによってイベントが生成されます。
新しいサンプリング間隔の更新には、様々な数の割当てを行い、内部データ構造の更新を呼び出します。 そのため、サンプリング間隔を平均とみなすことが重要です。 これには間隔0が含まれ、各割当てに対してイベントがすぐに生成されない可能性があります。
OnLoadまたはライブ段階でしか呼び出せない
No
156
11
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 この関数を使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_sampled_object_alloc_events サンプリングされた配賦イベントを生成できます。 この機能が有効な場合は、ヒープ・サンプリング・メソッドSetHeapSamplingIntervalをコールでき、SampledObjectAllocイベントを生成できます。
パラメータ
名前説明
sampling_intervaljint サンプリング間隔(バイト)。 Samplerは統計アプローチを使用して、特定のスレッドによって割り当てられた各sampling_intervalバイトに対して1回、平均イベントを生成します。
新しいサンプリング間隔が考慮されると、サンプリング間隔として0では、割当てごとにサンプルが生成されます。
ノート: この機能のオーバーヘッドは、サンプリング間隔と直接相関しています。 1024バイトなどの高いサンプリング間隔では、高いオーバーヘッドが発生します。 1024 Kbなどの間隔が短いと、オーバーヘッドは大幅に減少します。 サンプリングは、パフォーマンスに影響を与える可能性があることを理解したうえでのみ使用してください。
エラー
この関数は、汎用エラー、または次のエラーのいずれかを返します
エラー説明
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 環境に権限can_generate_sampled_object_alloc_eventsがありません。 AddCapabilitiesを使用する。
JVMTI_ERROR_ILLEGAL_ARGUMENT sampling_intervalがゼロ未満です。


エラー

JVM TI関数はすべて、jvmtiErrorエラー・コードを返します。
エージェントは、有効なパラメータを持つJVM TI関数を、適切なコンテキスト(たとえば、呼出し側スレッドが接続されていて、段階が適切)で呼び出します。 実装によって、一部のエラー条件の検出が困難であったり、非効率的であったり、不可能であったりします。 実装は、「関数固有の必須エラー」に一覧されているエラーを検出する必要があります。 その他のエラーは、エラー条件に対する推奨されている応答を表します。

汎用エラー

次のエラーは、どの関数からも返される可能性があるエラーです。
JVMTI_ERROR_NONE (0)
エラーは発生しなかった。 関数の実行が正常に終了したときに返されるエラー・コード。
JVMTI_ERROR_NULL_POINTER (100)
ポインタがNULL
JVMTI_ERROR_OUT_OF_MEMORY (110)
関数でメモリーの割当てが試行されたが、これ以上割り当てられるメモリーがなかった。
JVMTI_ERROR_ACCESS_DENIED (111)
この仮想マシンでは必要な機能が有効になっていない。
JVMTI_ERROR_UNATTACHED_THREAD (115)
この関数の呼出しに使われているスレッドが、仮想マシンに接続されていない。 呼出しは、接続されたスレッドから行う必要がある。 JNI呼び出しAPIのAttachCurrentThreadを参照。
JVMTI_ERROR_INVALID_ENVIRONMENT (116)
指定されたJVM TI環境はもう接続されていない、または環境ではない。
JVMTI_ERROR_WRONG_PHASE (112)
現在の段階では、必要な機能を使用できない。 仮想マシンが実行を完了している場合、常に返される。
JVMTI_ERROR_INTERNAL (113)
予期しない内部エラーが発生した。

関数固有の必須エラー

一部のJVM TI関数は、次のエラーを返します。これらのエラーは、条件が満たされたとき、実装によって返される必要があります。
JVMTI_ERROR_INVALID_PRIORITY (12)
無効な優先順位。
JVMTI_ERROR_THREAD_NOT_SUSPENDED (13)
スレッドは中断されていない。
JVMTI_ERROR_THREAD_SUSPENDED (14)
スレッドはすでに中断されている。
JVMTI_ERROR_THREAD_NOT_ALIVE (15)
この操作を行うには、スレッドが活動中(開始され、まだ終了していない)でなければならない。
JVMTI_ERROR_CLASS_NOT_PREPARED (22)
クラスがロードされているが、まだ準備されていない。
JVMTI_ERROR_NO_MORE_FRAMES (31)
指定された深さに、Javaプログラミング言語またはJNIスタック・フレームが存在しない。
JVMTI_ERROR_OPAQUE_FRAME (32)
フレームの情報が入手できない(ネイティブ・フレームの場合など)。
JVMTI_ERROR_DUPLICATE (40)
すでに設定された項目。
JVMTI_ERROR_NOT_FOUND (41)
目的の要素(フィールドやブレークポイントなど)が見つからない。
JVMTI_ERROR_NOT_MONITOR_OWNER (51)
このスレッドはrawモニターを所有していない。
JVMTI_ERROR_INTERRUPT (52)
呼出しの完了前に割り込まれた。
JVMTI_ERROR_UNMODIFIABLE_CLASS (79)
クラスは変更できない。
JVMTI_ERROR_UNMODIFIABLE_MODULE (80)
モジュールは変更できません。
JVMTI_ERROR_NOT_AVAILABLE (98)
この機能はこの仮想マシンでは使用できない。
JVMTI_ERROR_ABSENT_INFORMATION (101)
要求された情報が入手できない。
JVMTI_ERROR_INVALID_EVENT_TYPE (102)
指定されたイベント・タイプのIDが認識されない。
JVMTI_ERROR_NATIVE_METHOD (104)
要求された情報がネイティブ・メソッドで使用できない。
JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED (106)
クラス・ローダーがこの操作をサポートしない。

関数固有のエージェント・エラー

次のエラーは、一部のJVM TI関数から返される可能性があるエラーです。 これらのエラーは、エージェントによって無効なパラメータが渡された場合や、無効なコンテキストで使用された場合に返されます。 これらのエラーは、実装なしで検出できます。
JVMTI_ERROR_INVALID_THREAD (10)
渡されたスレッドは有効なスレッドではない。
JVMTI_ERROR_INVALID_FIELDID (25)
無効なフィールド。
JVMTI_ERROR_INVALID_MODULE (26)
モジュールが無効です。
JVMTI_ERROR_INVALID_METHODID (23)
無効なメソッド。
JVMTI_ERROR_INVALID_LOCATION (24)
無効な位置。
JVMTI_ERROR_INVALID_OBJECT (20)
無効なオブジェクト。
JVMTI_ERROR_INVALID_CLASS (21)
無効なクラス。
JVMTI_ERROR_TYPE_MISMATCH (34)
使用した関数と変数の型が合わない。
JVMTI_ERROR_INVALID_SLOT (35)
無効なスロット。
JVMTI_ERROR_MUST_POSSESS_CAPABILITY (99)
この環境で使用される権限がfalse。
JVMTI_ERROR_INVALID_THREAD_GROUP (11)
スレッド・グループが無効。
JVMTI_ERROR_INVALID_MONITOR (50)
無効なrawモニター。
JVMTI_ERROR_ILLEGAL_ARGUMENT (103)
不正な引数。
JVMTI_ERROR_INVALID_TYPESTATE (65)
スレッドの状態が変更されたため、不整合が生じている。
JVMTI_ERROR_UNSUPPORTED_VERSION (68)
新しいクラス・ファイルのバージョンがこのVMでサポートされていない。
JVMTI_ERROR_INVALID_CLASS_FORMAT (60)
新しいクラス・ファイルの形式が正しくない(VMはClassFormatErrorを返す)。
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION (61)
新しいクラス・ファイルの定義が循環定義になる(VMはClassCircularityErrorを返す)。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED (63)
新しいクラス・ファイルでメソッドの追加が必要。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED (64)
新しいクラスのバージョンによってフィールドが変更される。
JVMTI_ERROR_FAILS_VERIFICATION (62)
クラス・バイトが検証に失敗する。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED (66)
新しいクラスのバージョンの直接スーパー・クラスが異なる、または直接実装されているインタフェースが異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED (67)
新しいクラスのバージョンでは旧クラスのバージョンで宣言したメソッドを宣言しない。
JVMTI_ERROR_NAMES_DONT_MATCH (69)
新しいクラス・ファイル内で定義されたクラス名が、旧クラス・オブジェクト内の名前と異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED (70)
新しいクラスのバージョンの修飾子が異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED (71)
新しいクラスのバージョンのメソッドの修飾子が旧クラスのバージョンの修飾子と異なる。
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGED (72)
新しいクラス・バージョンに、クラス属性でサポートされていない相違があります。


データ型

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ビット。
jobject
Javaプログラミング言語オブジェクトを保持する。
jclass
Javaプログラミング言語クラスを保持する。
jvalue
すべてのプリミティブ型およびjobjectの和集合である。 つまり、Javaプログラミング言語の任意の値を保持する。
jfieldID
Javaプログラミング言語のフィールドを識別する。JVM TIの関数やイベントから返されたjfieldIDは、安全に格納できる。
jmethodID
Javaプログラミング言語メソッド、イニシャライザ、またはコンストラクタを識別する。JVM TIの関数やイベントから返されたjmethodIDは、安全に格納できる。 ただし、クラスがアンロードされた場合、それらは無効になるので使用してはいけない。
JNIEnv
JNI関数テーブルのポインタ。 JNIEnv *のポインタはJNI環境。

JVM Tool Interface基底型
説明
jvmtiEnv
JVM TI環境のポインタ。 「関数」セクションを参照。jvmtiEnv関数テーブルのポインタをポイントする。
jthread
スレッドを保持するjobjectのサブタイプ。
typedef jobject jthread;
jthreadGroup
スレッド・グループを保持するjobjectのサブタイプ。
typedef jobject jthreadGroup;
jlocation
メソッド内の単調に増加する実行可能位置を表す64ビット値。-1はネイティブ・メソッドを示す。 ある特定のVMでの形式については、GetJLocationFormatを参照。
typedef jlong jlocation;
jrawMonitorID
rawモニター。
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);
コールバック関数の定義については個々のイベントを参照。
jniNativeInterface
JNI仕様で定義された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すべてのモジュールを取得
jvmtiError (JNICALL *GetAllModules) (jvmtiEnv* env,
                       jint* module_count_ptr,
                       jobject** modules_ptr);
4すべてのスレッドの取得
jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env,
                       jint* threads_count_ptr,
                       jthread** threads_ptr);
5スレッドの中断
jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env,
                       jthread thread);
6スレッドの再開
jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env,
                       jthread thread);
7スレッドの停止
jvmtiError (JNICALL *StopThread) (jvmtiEnv* env,
                       jthread thread,
                       jobject exception);
8スレッドの割り込み
jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env,
                       jthread thread);
9スレッド情報の取得
jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env,
                       jthread thread,
                       jvmtiThreadInfo* info_ptr);
10所有モニター情報の取得
jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env,
                       jthread thread,
                       jint* owned_monitor_count_ptr,
                       jobject** owned_monitors_ptr);
11現在競合しているモニターの取得
jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env,
                       jthread thread,
                       jobject* monitor_ptr);
12エージェント・スレッドの実行
jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env,
                       jthread thread,
                       jvmtiStartFunction proc,
                       const void* arg,
                       jint priority);
13トップ・レベルのスレッド・グループの取得
jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env,
                       jint* group_count_ptr,
                       jthreadGroup** groups_ptr);
14スレッド・グループ情報の取得
jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env,
                       jthreadGroup group,
                       jvmtiThreadGroupInfo* info_ptr);
15子スレッド・グループの取得
jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env,
                       jthreadGroup group,
                       jint* thread_count_ptr,
                       jthread** threads_ptr,
                       jint* group_count_ptr,
                       jthreadGroup** groups_ptr);
16フレーム・カウントの取得
jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env,
                       jthread thread,
                       jint* count_ptr);
17スレッド状態の取得
jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env,
                       jthread thread,
                       jint* thread_state_ptr);
18現在のスレッドの取得
jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env,
                       jthread* thread_ptr);
19フレームの位置の取得
jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jmethodID* method_ptr,
                       jlocation* location_ptr);
20フレームのポップの通知
jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env,
                       jthread thread,
                       jint depth);
21局所変数の取得 - オブジェクト型
jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jobject* value_ptr);
22局所変数の取得 - 整数型
jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jint* value_ptr);
23局所変数の取得 - 長整数型
jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jlong* value_ptr);
24局所変数の取得 - 浮動小数点数型
jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jfloat* value_ptr);
25局所変数の取得 - 倍精度浮動小数点数型
jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jdouble* value_ptr);
26局所変数の設定 - オブジェクト型
jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jobject value);
27局所変数の設定 - 整数型
jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jint value);
28局所変数の設定 - 長整数型
jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jlong value);
29局所変数の設定 - 浮動小数点数型
jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jfloat value);
30局所変数の設定 - 倍精度浮動小数点数型
jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jdouble value);
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名前付きモジュールを取得
jvmtiError (JNICALL *GetNamedModule) (jvmtiEnv* env,
                       jobject class_loader,
                       const char* package_name,
                       jobject* module_ptr);
41フィールド・アクセスの監視の設定
jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
42フィールド・アクセスの監視のクリア
jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
43フィールド変更の監視の設定
jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
44フィールド変更の監視のクリア
jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
45変更可能クラスかどうかの検査
jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env,
                       jclass klass,
                       jboolean* is_modifiable_class_ptr);
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モジュールの読み込みを追加
jvmtiError (JNICALL *AddModuleReads) (jvmtiEnv* env,
                       jobject module,
                       jobject to_module);
95モジュールのエクスポートを追加
jvmtiError (JNICALL *AddModuleExports) (jvmtiEnv* env,
                       jobject module,
                       const char* pkg_name,
                       jobject to_module);
96モジュールの追加が開きます
jvmtiError (JNICALL *AddModuleOpens) (jvmtiEnv* env,
                       jobject module,
                       const char* pkg_name,
                       jobject to_module);
97モジュール使用の追加
jvmtiError (JNICALL *AddModuleUses) (jvmtiEnv* env,
                       jobject module,
                       jclass service);
98モジュールの追加機能
jvmtiError (JNICALL *AddModuleProvides) (jvmtiEnv* env,
                       jobject module,
                       jclass service,
                       jclass impl_class);
99変更可能モジュール
jvmtiError (JNICALL *IsModifiableModule) (jvmtiEnv* env,
                       jobject module,
                       jboolean* is_modifiable_module_ptr);
100すべてのスタック・トレースの取得
jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env,
                       jint max_frame_count,
                       jvmtiStackInfo** stack_info_ptr,
                       jint* thread_count_ptr);
101スレッド・リストのスタック・トレースの取得
jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env,
                       jint thread_count,
                       const jthread* thread_list,
                       jint max_frame_count,
                       jvmtiStackInfo** stack_info_ptr);
102スレッド・ローカルな記憶領域の取得
jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env,
                       jthread thread,
                       void** data_ptr);
103スレッド・ローカルな記憶領域の設定
jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env,
                       jthread thread,
                       const void* data);
104スタック・トレースの取得
jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env,
                       jthread thread,
                       jint start_depth,
                       jint max_frame_count,
                       jvmtiFrameInfo* frame_buffer,
                       jint* count_ptr);
105予約済み
void *reserved105;
106タグの取得
jvmtiError (JNICALL *GetTag) (jvmtiEnv* env,
                       jobject object,
                       jlong* tag_ptr);
107タグの設定
jvmtiError (JNICALL *SetTag) (jvmtiEnv* env,
                       jobject object,
                       jlong tag);
108ガベージ・コレクションの強制
jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env);
109オブジェクトから到達可能なオブジェクトの反復
jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env,
                       jobject object,
                       jvmtiObjectReferenceCallback object_reference_callback,
                       const void* user_data);
110到達可能なオブジェクトの反復
jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env,
                       jvmtiHeapRootCallback heap_root_callback,
                       jvmtiStackReferenceCallback stack_ref_callback,
                       jvmtiObjectReferenceCallback object_ref_callback,
                       const void* user_data);
111ヒープの反復
jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env,
                       jvmtiHeapObjectFilter object_filter,
                       jvmtiHeapObjectCallback heap_object_callback,
                       const void* user_data);
112クラスのインスタンスの反復
jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env,
                       jclass klass,
                       jvmtiHeapObjectFilter object_filter,
                       jvmtiHeapObjectCallback heap_object_callback,
                       const void* user_data);
113予約済み
void *reserved113;
114タグを使ったオブジェクトの取得
jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env,
                       jint tag_count,
                       const jlong* tags,
                       jint* count_ptr,
                       jobject** object_result_ptr,
                       jlong** tag_result_ptr);
115参照の追跡
jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env,
                       jint heap_filter,
                       jclass klass,
                       jobject initial_object,
                       const jvmtiHeapCallbacks* callbacks,
                       const void* user_data);
116ヒープ内での反復
jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env,
                       jint heap_filter,
                       jclass klass,
                       const jvmtiHeapCallbacks* callbacks,
                       const void* user_data);
117予約済み
void *reserved117;
118予約済み
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);
156ヒープ・サンプリング間隔の設定
jvmtiError (JNICALL *SetHeapSamplingInterval) (jvmtiEnv* env,
                       jint sampling_interval);


イベント

イベントの処理

エージェントは、アプリケーション・プログラム内で発生する多くのイベントについての通知を受けることができます。
イベントを処理するには、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;
    jvmtiEventReserved reserved85;
    jvmtiEventSampledObjectAlloc SampledObjectAlloc;
} jvmtiEventCallbacks;

イベントの索引


ステップ実行

void JNICALL
SingleStep(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)
ステップ実行イベントを利用すると、エージェントは、VMで可能な最小の単位でスレッドの実行を追跡できます。 ステップ実行イベントは、スレッドが新しい位置に達するたびに生成されます。 通常、ステップ実行イベントは、Java™仮想マシン仕様に定義されているように、1つのVM命令が完了したことを示します。 ただし、位置の定義が異なる実装もあります。 いずれにしても、methodおよびlocationパラメータによって現在の位置を一意に識別できるため、この情報があればソース・ファイルと行番号へのマッピングが可能です。
ネイティブ・メソッド内からは、ステップ実行イベントは生成されません。
ライブ段階でしか送信されない
JVMTI_EVENT_SINGLE_STEP
60
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_SINGLE_STEP, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(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_BREAKPOINT
62
SetEventNotificationMode(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_ACCESS
63
SetEventNotificationMode(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_MODIFICATION
64
SetEventNotificationMode(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関数によるフレームのポップはレポートされません。
深さ0についてGetFrameLocationによって報告されるロケーションは、リターン・メソッド内の実行可能なロケーションを、リターン直前に識別します。
ライブ段階でしか送信されない
JVMTI_EVENT_FRAME_POP
61
SetEventNotificationMode(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プログラミング言語メソッド(ネイティブ・メソッドを含む)に入る時点で生成されます。
深さ0についてGetFrameLocationによって報告されるロケーションは、メソッド内の初期実行可能ファイルのロケーションを識別します。
多くのプラットフォームでは、メソッド・エントリ・イベントまたはメソッド終了イベントを有効にすると、パフォーマンスが大幅に低下します。したがって、プロ・ファイリングなど、パフォーマンスを重視する処理での使用はお薦めしません。 これらの場合には、バイトコード・インストゥルメンテーションを使用すべきです。
ライブ段階でしか送信されない
JVMTI_EVENT_METHOD_ENTRY
65
SetEventNotificationMode(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を参照)。
深さ0についてGetFrameLocationによって報告されるロケーションは、リターン・メソッド内の実行可能ファイルのロケーションを、リターン直前に識別します。
多くのプラットフォームでは、メソッド・エントリ・イベントまたはメソッド終了イベントを有効にすると、パフォーマンスが大幅に低下します。したがって、プロ・ファイリングなど、パフォーマンスを重視する処理での使用はお薦めしません。 これらの場合には、バイトコード・インストゥルメンテーションを使用すべきです。
ライブ段階でしか送信されない
JVMTI_EVENT_METHOD_EXIT
66
SetEventNotificationMode(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_BIND
67
SetEventNotificationMode(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_EXCEPTION
58
SetEventNotificationMode(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_CATCH
59
SetEventNotificationMode(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_START
52
SetEventNotificationMode(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_END
53
SetEventNotificationMode(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_LOAD
55
SetEventNotificationMode(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_PREPARE
56
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_PREPARE, NULL)
1.0
権限
必要な機能
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread クラス準備イベントを生成するスレッド
klassjclass 準備されるクラス


クラス・ファイル・ロードフック

void JNICALL
ClassFileLoadHook(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jclass class_being_redefined,
            jobject loader,
            const char* name,
            jobject protection_domain,
            jint class_data_len,
            const unsigned char* class_data,
            jint* new_class_data_len,
            unsigned char** new_class_data)
このイベントは、VMがクラス・ファイル・データを取得したとき、そのクラスのメモリー内部表現を構築する前の時点で送信されます。 また、このイベントは、任意のJVM TI環境内から呼び出されたRetransformClasses関数またはRedefineClasses関数によってクラスが変更されようとしているときにも送信されます。 エージェントは、VMによって送信された既存のクラス・ファイル・データを実装して、プロ・ファイリング\/デバッグ・フックを含めることができます。 使用方法については、バイト・コード・インストゥルメンテーションの説明を参照してください。
can_generate_early_class_hook_eventscan_generate_all_class_hook_eventsの機能が有効になると、このイベントは初期段階で送信されることがあります。 それ以外の場合は、VMが初期化される前にこのイベントが送信されることがあります(スタートphase)。 この関数と互換性のないクラス(例: ROM化クラスまたは実装定義クラス)、これらのクラスに対してこのイベントは生成されません。
エージェントは、メモリー割当て関数Allocateを使用して、修正したクラス・ファイル・データのバッファ用の領域を割り当てる必要があります。新しいクラス・ファイル・データのバッファを解放する処理は、VMにより、Deallocateを使用して実行されるからです。
エージェントは、クラス・ファイルを変更する場合、新しく実装されたクラス・ファイル・データ・バッファをポイントするようにnew_class_dataを設定し、この呼び出しから戻る前に、new_class_data_lenにそのバッファの長さを設定する必要があります。 変更が不要な場合、エージェントはnew_class_dataを設定しません。 複数のエージェントがこのイベントを有効にしている場合、結果はチェーンになります。 つまり、new_class_dataが設定されている場合は、これが次のエージェントのclass_dataになります。
ライブ段階でクラス・ロードを処理する場合、GetNamedModule関数を使用して、クラス・ローダーとパッケージ名をモジュールにマップできます。 クラスが再定義または再変換されるとき、class_being_redefinedは非NULLなので、JNI GetModule関数を使用してモジュールを取得することもできます。
このイベントが各環境に送信される順番は、ほかのイベントの場合とは異なります。 このイベントは次の順番で環境に送信されます。 このイベントがRetransformClassesによって起動された場合、再変換可能な環境だけにこのイベントが送信されます。
初期段階、開始段階、およびライブ段階で送信される
JVMTI_EVENT_CLASS_FILE_LOAD_HOOK
54
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)
1.0
権限
必要な機能
任意の機能
権限効果
can_generate_all_class_hook_events ロードされたすべてのクラスに対して、ClassFileLoadHookイベントを生成できる。
can_generate_early_class_hook_events 初期段階でClassFileLoadHookイベントを生成できます。 この機能とcan_generate_all_class_hook_eventsが有効になっていると、初期段階にロードされたクラスに対してClassFileLoadHookイベントを通知できます。 ClassFileLoadHookを参照してください。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境。
class_being_redefinedjclass 再定義または再変換されるクラス。 クラスのロードによって送信された場合はNULL
loaderjobject クラスをロードするクラス・ローダー。 ブートストラップ・クラス・ローダーの場合はNULL
nameconst char* ロード対象クラスの名前。VM内部修飾名(「java/util/List」など)。modified UTF-8文字列としてエンコードされる。 ノート: クラスの定義時にNULL名が使用されたか名前が指定されなかった場合、nameNULLになる。
protection_domainjobject クラスのProtectionDomain
class_data_lenjint 現在のクラス・ファイル・データのバッファの長さ。
class_dataconst unsigned char* 現在のクラス・ファイル・データのバッファのポインタ。
new_class_data_lenjint* 新しいクラス・ファイル・データのバッファの長さのポインタ。
new_class_dataunsigned char** 実装済みクラス・ファイル・データのバッファのポインタへのポインタ。


VM開始イベント

void JNICALL
VMStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)
VM開始イベントは、VMの開始を知らせます。 この時点で、JNIはライブ状態になっていますが、VMはまだ完全に初期化されていません。 このイベントが生成されたら、エージェントは任意のJNI関数を自由に呼び出せます。 このイベントは開始段階の始まりを示します。開始段階で許可されたJVM TI関数を呼び出せます。
このイベントのタイミングは、エージェントがcan_generate_early_vmstart機能を追加したかどうかによって異なります。 ケイパビリティが追加されている場合、VMは可能な限り早くイベントをポストします。 VMはバイトコードを実行できますが、java.base以外のモジュール、またはjava.baseの任意のクラスでもクラスをロードできるポイントに初期化されていない可能性があります。 このフェーズでロード時間計測を行うエージェントは、このフェーズで実行される可能性があるコードを計測する際には、細心の注意を払わなければなりません。 JNI FindClassでは、クラスをロードすることができない可能性があり、予期しない動作や、一部のVM実装での安定性の問題が発生する可能性があるため、細心の注意を払ってください。 機能が追加されていない場合、VMはjava.base以外のモジュールでクラスをロードできるか、VMが初期化を完了するまで、このイベントのポストを遅延します。 複数のJVM TI環境を作成するエージェント。この機能は、一部の環境には追加されていますが、機能を備えたJVM TI環境で開始する前に開始フェーズで開始することもできます。
VMの起動に失敗した場合、このイベントは送信されません。
開始段階とライブ段階で送信される
JVMTI_EVENT_VM_START
57
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_START, NULL)
1.0
権限
必要な機能
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境。


VM初期化イベント

void JNICALL
VMInit(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
VM初期化イベントはVM初期化の完了を示します。 このイベントが生成されたら、エージェントは任意のJNI関数またはJVM TI関数を自由に呼び出せます。 VM初期化イベントと同時かそれより先に発生するイベントが存在する可能性がありますが、先行イベントが存在する場合、その処理は慎重に行うべきです。VMの初期化が完了していないからです。 メイン・アプリケーション・スレッドのスレッド開始イベントは、VM初期化イベントのハンドラが復帰するまで発生しないことが保証されています。
VMの起動に失敗した場合、このイベントは送信されません。
ライブ段階でしか送信されない
JVMTI_EVENT_VM_INIT
50
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL)
1.0
権限
必要な機能
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境。
threadjthread 初期スレッド


VM終了イベント

void JNICALL
VMDeath(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)
VM終了イベントは、VMの終了をエージェントに通知します。 VMDeathイベントのあとは、イベントは発生しません。
VMの起動に失敗した場合、このイベントは送信されません。 こうした場合、Agent_OnUnloadは呼び出される点に注意してください。
ライブ段階でしか送信されない
JVMTI_EVENT_VM_DEATH
51
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL)
1.0
権限
必要な機能
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境


コンパイル済みメソッドのロード

typedef struct {
    const void* start_address;
    jlocation location;
} jvmtiAddrLocationMap;
void JNICALL
CompiledMethodLoad(jvmtiEnv *jvmti_env,
            jmethodID method,
            jint code_size,
            const void* code_addr,
            jint map_length,
            const jvmtiAddrLocationMap* map,
            const void* compile_info)
メソッドがVMによってコンパイルされ、メモリー内にロードされる時点で送信されます。 アンロードされた場合、CompiledMethodUnloadイベントが送信されます。 移動した場合、新しいCompiledMethodLoadイベントに続いて、CompiledMethodUnloadイベントが送信されます。 単一のメソッドが複数の形式でコンパイルされることがあり、このイベントがその形式ごとに送信される点に注意してください。 また、複数のメソッドが単一のアドレス範囲にインラインされることがあり、このイベントが各メソッドごとに送信される点にも注意してください。
これらのイベントは、最初の発生のあと、GenerateEventsによって送信できます。
開始段階とライブ段階で送信される
JVMTI_EVENT_COMPILED_METHOD_LOAD
68
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_LOAD, NULL)
1.0

jvmtiAddrLocationMap - 位置エントリのネイティブ・アドレス
フィールド説明
start_addressconst void* 位置に対応するコードの開始ネイティブ・アドレス
locationjlocation 対応する位置。 位置の意味については、GetJLocationFormatを参照。
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_compiled_method_load_events メソッドのコンパイル時またはアンロード時にイベントを生成できる
パラメータ
名前説明
methodjmethodID コンパイルおよびロードされているメソッド
code_sizejint コンパイルされたコードのサイズ
code_addrconst void* コンパイルされたメソッド・コードがロードされるアドレス
map_lengthjint アドレス・マップ内のjvmtiAddrLocationMapエントリの数。 マッピング情報が提供されない場合はゼロ。
mapconst jvmtiAddrLocationMap* ネイティブ・アドレスと位置のマッピング。 各エントリのネイティブ・アドレス範囲は、start_addressから次のエントリのstart_address-1まで。 マッピング情報が提供されない場合はNULL
compile_infoconst void* VM固有のコンパイル情報。 参照されるコンパイル情報は、VMによって管理され、収集のためにエージェントに依存していてはならない。 この情報の内容と寿命は、VM実装によって定義される。


コンパイル済みメソッドのアンロード

void JNICALL
CompiledMethodUnload(jvmtiEnv *jvmti_env,
            jmethodID method,
            const void* code_addr)
コンパイル済メソッドがメモリーからアンロードされた時点で送信されます。 このイベントは、アンロードを実行したスレッド上で送信されない可能性があります。 このイベントは、アンロード発生後少し経ってから送信される可能性がありますが、新しく生成されたコンパイル済メソッドによってメモリーが再利用される前に送信されます。 このイベントは、クラスのアンロード後に送信される可能性があります。
開始段階とライブ段階で送信される
JVMTI_EVENT_COMPILED_METHOD_UNLOAD
69
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_UNLOAD, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_compiled_method_load_events メソッドのコンパイル時またはアンロード時にイベントを生成できる
パラメータ
名前説明
methodjmethodID アンロード対象のコンパイル済メソッド。 コンパイル済メソッドの識別専用。クラスはアンロードされるため、メソッドを以後のJNIまたはJVM TI関数の引数として使用できない。
code_addrconst void* コンパイルされたメソッド・コードがロードされたアドレス。 コンパイル済メソッドの識別専用。領域が回収済の可能性がある。


動的コード生成

void JNICALL
DynamicCodeGenerated(jvmtiEnv *jvmti_env,
            const char* name,
            const void* address,
            jint length)
仮想マシンのコンポーネントが動的に生成された時点で送信されます。 これは、コンパイル済のJavaプログラミング言語コードには対応しません。CompiledMethodLoadを参照してください。 これは、コマンド行オプションに応じて異なる内容で生成されるインタープリタなどの、ネイティブ・コード用です。
このイベントには、制御権限はありません。 VMは、これらのイベントを生成できない場合、何も送信しません。
これらのイベントは、最初の発生のあと、GenerateEventsによって送信できます。
初期段階、開始段階、およびライブ段階で送信される
JVMTI_EVENT_DYNAMIC_CODE_GENERATED
70
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_DYNAMIC_CODE_GENERATED, NULL)
1.0
権限
必要な機能
パラメータ
名前説明
nameconst char* コードの名前。修正UTF-8文字列としてエンコードされる。 エンドユーザーへの表示用。 名前は一意でない可能性がある。
addressconst void* コードのネイティブ・アドレス
lengthjint コードの長さ(バイト単位)


データ・ダンプ要求

void JNICALL
DataDumpRequest(jvmtiEnv *jvmti_env)
VMによって送信され、エージェントにデータをダンプするよう要求します。 これは単に示唆しているだけであり、エージェントはこのイベントに必ずしも反応する必要はありません。 これは、ユーザーからのコマンド行シグナルを処理する場合に便利です。 たとえば、Java 2 SDKでは、Win32上のCTRL-BreakとLinux上のCTRL-\を使用すると、VMはこのイベントをエージェントに送信します。
ライブ段階でしか送信されない
JVMTI_EVENT_DATA_DUMP_REQUEST
71
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_DATA_DUMP_REQUEST, NULL)
1.0
権限
必要な機能
パラメータ
なし


競合するモニター開始

void JNICALL
MonitorContendedEnter(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object)
スレッドがJavaプログラミング言語モニターに入ろうとしたとき、そのモニターがすでに別のスレッドによって獲得されている場合に送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_CONTENDED_ENTER
75
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_monitor_events モニターの使用率に関するイベントを生成できる。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread モニターに入ろうとするスレッドのJNIローカル参照
objectjobject モニターのJNIローカル参照


競合するモニター開始済み

void JNICALL
MonitorContendedEntered(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object)
別のスレッドがJavaプログラミング言語モニターを解放するのを待ったあとで、スレッドがそのJavaモニターに入るときに送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_CONTENDED_ENTERED
76
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_monitor_events モニターの使用率に関するイベントを生成できる。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread モニターに入るスレッドのJNIローカル参照
objectjobject モニターのJNIローカル参照


モニター待機

void JNICALL
MonitorWait(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jlong timeout)
スレッドがオブジェクトを待機しようとしているときに送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_WAIT
73
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAIT, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_monitor_events モニターの使用率に関するイベントを生成できる。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread 待機しようとするスレッドのJNIローカル参照
objectjobject モニターのJNIローカル参照
timeoutjlong スレッドが待機する時間(単位はミリ秒)。


モニター待機終了

void JNICALL
MonitorWaited(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jboolean timed_out)
スレッドがオブジェクトの待機を終了するときに送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_MONITOR_WAITED
74
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAITED, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_monitor_events モニターの使用率に関するイベントを生成できる。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread 待機を終了したスレッドのJNIローカル参照
objectjobject モニターのJNIローカル参照。
timed_outjboolean モニターがタイム・アウトになった場合true


リソース不足

void JNICALL
ResourceExhausted(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jint flags,
            const void* reserved,
            const char* description)
実行中のアプリケーションが必要とするVMリソースが使い果たされたときに送信されます。 任意の権限によって必要とされるものを除けば、不足を報告するリソース・セットは実装に依存します。
次のビット・フラグは、リソース不足のプロパティを定義します。
リソース不足フラグ
定数説明
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR0x0001 このイベントが返されたあと、VMはjava.lang.OutOfMemoryErrorをスローする。
JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP0x0002 VMが、JavaTMプラットフォームのヒープからメモリーを割り当てることができなかった。 ヒープとは、すべてのクラス・インスタンスおよび配列のメモリーの割当て元となる実行時データ領域のことである。
JVMTI_RESOURCE_EXHAUSTED_THREADS0x0004 VMがスレッドを作成できなかった。
ライブ段階でしか送信されない
JVMTI_EVENT_RESOURCE_EXHAUSTED
80
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_RESOURCE_EXHAUSTED, NULL)
1.1
権限
必要な機能
任意の機能
権限効果
can_generate_resource_exhaustion_heap_events VMがヒープからメモリーの割り当てを行えない場合に、イベントを生成できる。
can_generate_resource_exhaustion_threads_events VMがスレッドを作成できない場合にイベントを生成できる。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
flagsjint リソース不足フラグで指定される、リソース不足のプロパティを定義するフラグ。
reservedconst void* 予約済み。
descriptionconst char* リソース不足の説明。修正UTF-8文字列としてエンコードされる。


VMオブジェクト割当て

void JNICALL
VMObjectAlloc(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jclass object_klass,
            jlong size)
メソッドによって仮想マシンが、Javaプログラミング言語コードに対して可視のオブジェクトを直接割り当てる場合に送信されます。 通常、オブジェクトの割当ては、割り当てるメソッドのバイト・コードを実装することによって検出されます。 JNI関数呼出しにより、ネイティブ・コードで生成されたオブジェクト割当ては、JNI関数の遮断によって検出されます。 バイト・コードに関連付けられておらず、ネイティブでないメソッドは、VMによって直接実行されます。 このイベントは、これらのメソッドによって送信されます。 仮想マシンが、これらのメソッドの一部またはすべてに対してバイト・コードを実装できない場合、このイベントが送信されることがあります。 SampledObjectAllocイベントは、バイトコード・メソッドの実行、JNIメソッドの実行、およびVMメソッドによる直接の割当てなど、すべてのJavaオブジェクトの割当てに対してトリガーされることに注意してください。
次に、このイベントが送信される典型的な事例を示します。 次の場合、このイベントは生成されません。
ライブ段階でしか送信されない
JVMTI_EVENT_VM_OBJECT_ALLOC
84
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_vm_object_alloc_events オブジェクトのVM割当てに関するイベントを生成できる。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境
threadjthread オブジェクトを割り当てるスレッド。
objectjobject 割り当てられたオブジェクトのJNIローカル参照
object_klassjclass オブジェクトのクラスのJNIローカル参照
sizejlong オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。


サンプル・オブジェクト割当

void JNICALL
SampledObjectAlloc(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jclass object_klass,
            jlong size)
割当済オブジェクトがサンプリングされたときに送信されます。 デフォルトでは、サンプリング間隔は512KBに設定されています。 サンプリングは、パターン・ベースのバイアスを回避するために半ランダムであり、長期間のサンプリングに対して全体の平均間隔を概算にします。
各スレッドは、最後のイベント送信以降に割り当てられたバイト数を追跡します。 バイト数がサンプリング間隔を超えると、別のイベントが送信されます。 つまり、平均では、最後のサンプル以降、スレッドが512KBバイトを割り当てるたびに1つのオブジェクトがサンプリングされます。
Samplerが擬似乱数であることに注意してください: 512KBごとに正確にサンプリングするわけではありません。 この目的は、固定パターン(つまり、同じオブジェクト・セットが512KBごとに割り当てられます。)で割当てが行われても高品質なサンプリングを保証することです。
別のサンプリング間隔が必要な場合、ユーザーは新しいサンプリング間隔を表す厳密な正の整数値でSetHeapSamplingIntervalをコールできます。
このイベントは、サンプリングされた割当てが実行された後に送信されます。 これによって、オブジェクト、割当てのスタック・トレース、スレッド割当て、割当てサイズおよびオブジェクト・クラスが提供されます。
このシステムの一般的なユースケースは、ヒープ割当ての発生場所を決定することです。 弱い参照および関数GetStackTraceと組み合せると、ユーザーはどのスタック・トレースから割り当てられ、プログラムの実行中に有効なオブジェクトであるかを追跡できます。
ライブ段階でしか送信されない
JVMTI_EVENT_SAMPLED_OBJECT_ALLOC
86
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, NULL)
11
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_sampled_object_alloc_events サンプリングされた配賦イベントを生成できます。 この機能が有効な場合は、ヒープ・サンプリング・メソッドSetHeapSamplingIntervalをコールでき、SampledObjectAllocイベントを生成できます。
パラメータ
名前説明
jni_env JNIEnv * イベントの現在のスレッドのJNI環境。
threadjthread オブジェクトを割り当てるスレッド。
objectjobject 割り当てられたオブジェクトのJNIローカル参照
object_klassjclass オブジェクトのクラスのJNIローカル参照
sizejlong オブジェクトのサイズ(バイト単位)。 GetObjectSizeを参照。


オブジェクトの解放

void JNICALL
ObjectFree(jvmtiEnv *jvmti_env,
            jlong tag)
オブジェクトの解放イベントは、ガベージ・コレクタがオブジェクトを解放した時点で送信されます。 イベントは、タグ付きオブジェクトの場合にのみ送信されます(「ヒープ関数」を参照)。
イベント・ハンドラは、特別に使用が許可されているJVM TI関数以外の関数およびJNI関数を使用できません(rawモニター関数、メモリー管理関数、環境ローカル記憶領域関数を参照)。
ライブ段階でしか送信されない
JVMTI_EVENT_OBJECT_FREE
83
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_object_free_events ガベージ・コレクタがオブジェクトを解放するときにイベントを生成できる。
パラメータ
名前説明
tagjlong 解放されるオブジェクトのタグ


ガベージ・コレクションの開始

void JNICALL
GarbageCollectionStart(jvmtiEnv *jvmti_env)
ガベージ・コレクションの開始イベントは、ガベージ・コレクションによる一時停止が開始されたとき送信されます。 処理を停止する(stop-the-world)コレクション、つまりすべてのスレッドがJava仮想マシンのステータスの変更を終了している間に収集されるコレクションだけがレポートされます。 このため、コレクタによっては、これらのイベントを生成しません。 このイベントは、VMがまだ停止している間に送信されるので、イベント・ハンドラは、JNI関数、およびJVM TI関数(特別にそのような使用が許可されているものを除く)を使用してはいけません(rawモニター、メモリー管理、および環境ローカル記憶領域関数を参照)。
このイベントは、常にGarbageCollectionFinishと一致するペア(どちらのイベントも有効と見なされる)として送信され、これらの間に、ガベージ・コレクション・イベントは発生しません。
ライブ段階でしか送信されない
JVMTI_EVENT_GARBAGE_COLLECTION_START
81
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_START, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_garbage_collection_events ガベージ・コレクションの開始または終了時にイベントを生成できる。
パラメータ
なし


ガベージ・コレクションの完了

void JNICALL
GarbageCollectionFinish(jvmtiEnv *jvmti_env)
ガベージ・コレクションの終了イベントは、ガベージ・コレクションによる一時停止が終了したとき送信されます。 このイベントは、VMがまだ停止している間に送信されるので、イベント・ハンドラは、JNI関数、およびJVM TI関数(特別にそのような使用が許可されているものを除く)を使用してはいけません(rawモニター、メモリー管理、および環境ローカル記憶領域関数を参照)。
一部のエージェントは、許可されていないJVM TIまたはJNI関数を使用する必要のある、ガベージ・コレクション後の操作を行う必要があります。 そのような場合、rawモニターで待機するエージェント・スレッドを作成でき、ガベージ・コレクションの終了イベントでは、単にrawモニターに通知します。
このイベントは、常にGarbageCollectionStartと一致するペア(どちらのイベントも有効と見なされる)として送信されます。
ライブ段階でしか送信されない
JVMTI_EVENT_GARBAGE_COLLECTION_FINISH
82
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL)
1.0
権限
任意の機能: すべての仮想マシンに実装することはないと考えられます。 このイベントを使用するためには、次の権限(GetCapabilitiesから返される)がtrueである必要があります。
権限効果
can_generate_garbage_collection_events ガベージ・コレクションの開始または終了時にイベントを生成できる。
パラメータ
なし


定数の索引

JVMTI_CLASS_STATUS_ARRAY
JVMTI_CLASS_STATUS_ERROR
JVMTI_CLASS_STATUS_INITIALIZED
JVMTI_CLASS_STATUS_PREPARED
JVMTI_CLASS_STATUS_PRIMITIVE
JVMTI_CLASS_STATUS_VERIFIED
JVMTI_DISABLE
JVMTI_ENABLE
JVMTI_HEAP_FILTER_CLASS_TAGGED
JVMTI_HEAP_FILTER_CLASS_UNTAGGED
JVMTI_HEAP_FILTER_TAGGED
JVMTI_HEAP_FILTER_UNTAGGED
JVMTI_HEAP_OBJECT_EITHER
JVMTI_HEAP_OBJECT_TAGGED
JVMTI_HEAP_OBJECT_UNTAGGED
JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT
JVMTI_HEAP_REFERENCE_CLASS
JVMTI_HEAP_REFERENCE_CLASS_LOADER
JVMTI_HEAP_REFERENCE_CONSTANT_POOL
JVMTI_HEAP_REFERENCE_FIELD
JVMTI_HEAP_REFERENCE_INTERFACE
JVMTI_HEAP_REFERENCE_JNI_GLOBAL
JVMTI_HEAP_REFERENCE_JNI_LOCAL
JVMTI_HEAP_REFERENCE_MONITOR
JVMTI_HEAP_REFERENCE_OTHER
JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN
JVMTI_HEAP_REFERENCE_SIGNERS
JVMTI_HEAP_REFERENCE_STACK_LOCAL
JVMTI_HEAP_REFERENCE_STATIC_FIELD
JVMTI_HEAP_REFERENCE_SUPERCLASS
JVMTI_HEAP_REFERENCE_SYSTEM_CLASS
JVMTI_HEAP_REFERENCE_THREAD
JVMTI_HEAP_ROOT_JNI_GLOBAL
JVMTI_HEAP_ROOT_JNI_LOCAL
JVMTI_HEAP_ROOT_MONITOR
JVMTI_HEAP_ROOT_OTHER
JVMTI_HEAP_ROOT_STACK_LOCAL
JVMTI_HEAP_ROOT_SYSTEM_CLASS
JVMTI_HEAP_ROOT_THREAD
JVMTI_ITERATION_ABORT
JVMTI_ITERATION_CONTINUE
JVMTI_ITERATION_IGNORE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_MASK
JVMTI_JAVA_LANG_THREAD_STATE_NEW
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING
JVMTI_JAVA_LANG_THREAD_STATE_WAITING
JVMTI_JLOCATION_JVMBCI
JVMTI_JLOCATION_MACHINEPC
JVMTI_JLOCATION_OTHER
JVMTI_KIND_ALLOC_ALLOC_BUF
JVMTI_KIND_ALLOC_BUF
JVMTI_KIND_IN
JVMTI_KIND_IN_BUF
JVMTI_KIND_IN_PTR
JVMTI_KIND_OUT
JVMTI_KIND_OUT_BUF
JVMTI_PHASE_DEAD
JVMTI_PHASE_LIVE
JVMTI_PHASE_ONLOAD
JVMTI_PHASE_PRIMORDIAL
JVMTI_PHASE_START
JVMTI_PRIMITIVE_TYPE_BOOLEAN
JVMTI_PRIMITIVE_TYPE_BYTE
JVMTI_PRIMITIVE_TYPE_CHAR
JVMTI_PRIMITIVE_TYPE_DOUBLE
JVMTI_PRIMITIVE_TYPE_FLOAT
JVMTI_PRIMITIVE_TYPE_INT
JVMTI_PRIMITIVE_TYPE_LONG
JVMTI_PRIMITIVE_TYPE_SHORT
JVMTI_REFERENCE_ARRAY_ELEMENT
JVMTI_REFERENCE_CLASS
JVMTI_REFERENCE_CLASS_LOADER
JVMTI_REFERENCE_CONSTANT_POOL
JVMTI_REFERENCE_FIELD
JVMTI_REFERENCE_INTERFACE
JVMTI_REFERENCE_PROTECTION_DOMAIN
JVMTI_REFERENCE_SIGNERS
JVMTI_REFERENCE_STATIC_FIELD
JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR
JVMTI_RESOURCE_EXHAUSTED_THREADS
JVMTI_THREAD_MAX_PRIORITY
JVMTI_THREAD_MIN_PRIORITY
JVMTI_THREAD_NORM_PRIORITY
JVMTI_THREAD_STATE_ALIVE
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
JVMTI_THREAD_STATE_IN_NATIVE
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
JVMTI_THREAD_STATE_INTERRUPTED
JVMTI_THREAD_STATE_PARKED
JVMTI_THREAD_STATE_RUNNABLE
JVMTI_THREAD_STATE_SLEEPING
JVMTI_THREAD_STATE_SUSPENDED
JVMTI_THREAD_STATE_TERMINATED
JVMTI_THREAD_STATE_VENDOR_1
JVMTI_THREAD_STATE_VENDOR_2
JVMTI_THREAD_STATE_VENDOR_3
JVMTI_THREAD_STATE_WAITING
JVMTI_THREAD_STATE_WAITING_INDEFINITELY
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
JVMTI_TIMER_ELAPSED
JVMTI_TIMER_TOTAL_CPU
JVMTI_TIMER_USER_CPU
JVMTI_TYPE_CCHAR
JVMTI_TYPE_CVOID
JVMTI_TYPE_JBOOLEAN
JVMTI_TYPE_JBYTE
JVMTI_TYPE_JCHAR
JVMTI_TYPE_JCLASS
JVMTI_TYPE_JDOUBLE
JVMTI_TYPE_JFIELDID
JVMTI_TYPE_JFLOAT
JVMTI_TYPE_JINT
JVMTI_TYPE_JLONG
JVMTI_TYPE_JMETHODID
JVMTI_TYPE_JNIENV
JVMTI_TYPE_JOBJECT
JVMTI_TYPE_JSHORT
JVMTI_TYPE_JTHREAD
JVMTI_TYPE_JVALUE
JVMTI_VERBOSE_CLASS
JVMTI_VERBOSE_GC
JVMTI_VERBOSE_JNI
JVMTI_VERBOSE_OTHER
JVMTI_VERSION_INTERFACE_JNI
JVMTI_VERSION_INTERFACE_JVMTI
JVMTI_VERSION_MASK_INTERFACE_TYPE
JVMTI_VERSION_MASK_MAJOR
JVMTI_VERSION_MASK_MICRO
JVMTI_VERSION_MASK_MINOR
JVMTI_VERSION_SHIFT_MAJOR
JVMTI_VERSION_SHIFT_MICRO
JVMTI_VERSION_SHIFT_MINOR
JVMTI_VISIT_ABORT
JVMTI_VISIT_OBJECTS


変更履歴

最終更新日: 09/05/07
バージョン: 17.0.0
JVM TI仕様は発展中のドキュメントであり、メジャー、マイナー、マイクロの各バージョン番号を持ちます。 リリース版の仕様はメジャー・バージョンとマイナー・バージョンで一意に識別されます。 この仕様に含まれる関数、イベント、権限には「導入されたバージョン」値が示されていますが、これは、その機能が導入されたメジャー・バージョンとマイナー・バージョンです。 VMが実装する仕様のバージョンを実行時に取得するには、GetVersionNumber関数を使用します。
バージョン
日付
変更点
2002年11月14日 XML文書に変換。
2002年11月14日 ヒープ・ダンプ関数の記述に誤りがあったため、一時的に内容を削除。
2002年11月18日 詳しいスループットを追加。
2002年11月18日 JVMTI_THREAD_STATUS_RUNNINGをJVMTI_THREAD_STATUS_RUNNABLEに変更。
2002年11月19日 AsyncGetStackTraceを追加。
2002年11月19日 GetStackTraceの戻り値jframeIDを追加。
2002年11月19日 GetCurrentFrame関数とGetCallingFrame関数の記述にGetStackTraceと重複する点があったため、一時的に内容を削除。
2002年11月19日 重複したClearAllBreakpointsを削除。
2002年11月19日 GetSystemPropertiesを追加。
2002年11月19日 スレッド・ローカルな記憶領域関数がjthreadを使用するように変更。
2002年11月20日 GetJLocationFormatを追加。
2002年11月22日 イベントと概要のテキストを追加。
2002年11月22日 型と定数の定義のクロス・リファレンスを追加。
2002年11月24日 DTDを追加。
2002年11月24日 権限関数のセクションを追加。
2002年11月29日 各関数およびイベントに権限を割当て。
2002年11月29日 JNI遮断関数を追加。
2002年11月30日 SetEventNotificationMode権限を自動生成。
2002年11月30日 VMObjectAllocイベントを追加。
2002年11月30日 DynamicCodeGeneratedイベントを追加。
2002年11月30日 宣言の定数を追加。
2002年11月30日 メソッドの終了とフレーム・ポップが例外を送信するように変更。
2002年12月1日 ForceGarbageCollectionを追加。
2002年12月2日 Xrunセクションの改訂: GetStackTraceの説明をわかりやすく変更し、例を追加。幅の問題を修正。「エージェント」を矛盾なく使用。
2002年12月8日 以前の概要情報を削除。 JVM TI環境」セクションを追加。
2002年12月8日 DisposeEnvironmentを追加します。
2002年12月9日 多数の細かい更新。
2002年12月15日 ヒープ・プロファイリング関数を追加: 注釈の取得/設定、ライブ・オブジェクト/ヒープの反復処理。 ヒープ・プロファイリング関数のプレースホルダーを追加: ヒープ・ルート。 ヒープ・プロファイリング・イベントを追加: オブジェクトの解放。 ヒープ・プロファイリング・イベントを再設計: VMオブジェクト割当て。 ヒープ・プロファイリング・イベントのプレースホルダーを追加: ガベージ・コレクションの開始/終了。 ネイティブ・メソッド・バインド・イベントを追加。
2002年12月19日 関数の中断/再開の説明を改訂。 jvmdiタグ付きの元の情報を追加。 その他の修正。
2002年12月24日 型にセマンティックスを追加。
2002年12月27日 ローカル参照のセクションを追加。 型からパラメータの説明を自動生成。
2002年12月28日 RunAgentThreadがthreadStartを送信することを文書化。
2002年12月29日 重複したローカル参照と割当て解除の警告を削除。 GetRawMonitorNameを割当て済みバッファに変換。 GenerateEventsを追加。
2002年12月30日 rawモニターを型に変更し、名前をjrawMonitorIDに変更。
2003年1月1日 元の情報を追加。 JVMDIの問題の参照を整理。 Deallocateの警告が自動生成されるようになったので削除。
2003年1月2日 jthreadの表現の問題を修正。
2003年1月3日 権限を64ビットにバッファ・アウト(自動処理)。
2003年1月4日 列挙の定数を列挙型に変更。 パラメータは列挙型。 型のセクションを整理し、索引を作成。 残っているデータ定義エンティティをコールバックで置換え。
2003年1月7日 GenerateEventsの説明を修正。 より多くの内部セマンティックスを有効化。
2003年1月9日 以前のGetSystemPropertiesを、固定情報ではなく割り当てられた情報を使用する2つの関数で置換え。 SetSystemPropertyを追加。 より多くの内部セマンティックスを有効化。
2003年1月12日 SetEventNotificationModeの末尾に可変引数を追加。
2003年1月20日 割当てサイズがjlongであることを反映するように仕様を修正。
2003年1月22日 RunAgentThreadの引数としてNULLを許可。
2003年1月22日 標準命名規則Removed AsyncGetStackTraceの名前を修正。
2003年1月29日 jthreadを使用するためGetThreadを削除。
2003年1月31日 GetMethodNameと同様にNULLを許可するようにGetFieldNameを変更。
v40
2003年2月29日
概要のテキストを書き直し、起動、環境、およびバイト・コード・インストゥルメンテーションに関するセクションを追加。 EGディスカッションに従ってコマンド行引数を変更。 権限のセクションに概要情報を追加。 拡張メカニズムのカテゴリと関数を追加。 SuspendAllThreadsの削除を指定(説明を改訂)。 IterateOverLiveObjectsの名前をIterateOverReachableObjectsに変更し、この変更に応じてテキストも変更。 IterateOverHeapの説明を改訂。 CompiledMethodLoadの説明を改訂。 関数呼出しの必要条件について検討。 SetAllocationHooksの説明を改訂。 全体にわたって「解決予定」として問題を追加。 その他。
v41
2003年3月6日
GetOwnedMonitorInfoの呼出しから構造体を削除。 大部分のエラー・ドキュメントを自動生成。手書きの(不規則な)エラー・ドキュメントを削除。 権限の使用に関する説明を改善(空の初期セット)。 jintパラメータに最小値を追加。 権限can_access_thread_local_storageを削除。 エラーJVMTI_ERROR_NOT_IMPLEMENTEDをJVMTI_ERROR_MUST_POSSESS_CAPABILITYに名称変更。*NOT_IMPLEMENTEDについても同様。 説明を修正。
v42
2003年3月8日
GetClassSignatureの名前をGetClassNameに変更。 IterateOverClassObjectsの名前をIterateOverInstancesOfClassに変更。 GetMaxStackを削除(オペランド・スタックはJVM TIでは使用されない)。 説明を修正: 起動時間の定義、PopFrameからのネイティブ・フレーム・ポップの削除、その他の改訂。
v43
2003年3月8日
細かい編集上の問題を修正。
v44
2003年3月10日
段階の情報を追加。 イベント番号を再マップ(コンパクト化)。
v45
2003年3月11日
段階の情報をさらに追加 -「すべて」を許可。 rawモニターの照会およびイベントを削除。 説明の細かい修正。
v46
2003年3月12日
GetPhaseを追加。 文書全体で「段階」を使用。 GetRawMonitorNameを削除。 GetObjectMonitorsを削除。
v47
2003年3月12日
リンク、XML、スペル・チェックによる修正。 コールバック構造体を自動生成。
v48
2003年3月13日
1文字のXMLを修正。
v49
2003年3月13日
イベント・パラメータ名と対応するように関数パラメータ名を変更(fooBarBazをfoo_bar_bazに変更)。
v50
2003年3月14日
壊れたリンクを修正。 スレッド・マーカーを修正。
v51
2003年3月14日
コンパイラの問題を回避するため、128より小さくなるように定数を変更。
v52
2003年3月23日
権限について全面的に見直し。 GetStackTraceをGetStackTraceとGetStackFramesに分割。
v54
2003年4月8日
フレームの参照に、jframeIDではなく深さを使用。 不適切になったGetCurrentFrame、GetCallerFrame、およびGetStackFramesを削除。 イベントからフレーム引数を削除。
v55
2003年4月9日
テストにより、バッファを使用するほうが効率がよいとわかったため、GetObjectWithAnnotationを削除。 GetObjectsWithAnnotationsにannotation_countを追加
v56
2003年4月10日
GetObjectsWithAnnotationsに挿入されたあいまいな記述を削除
v58
2003年4月13日
メソッドのjclass/jmethodIDという表現を単なるjmethodIDで置換え。すべてのイベントの第1引数としてJvmtiEnv*を渡す。不適切な箇所からJNIEnv*を削除。 can_access_framesをcan_access_local_variablesで置換え。純粋なスタック・アクセスから削除。 can_get_synthetic_attributeを使用。説明を修正。 長さゼロの配列は割当て解除する必要があることを明記。 RelinquishCapabilitiesの説明を明確化。 JVMTI_ERROR_VM_DEADをJVMTI_ERROR_WRONG_PHASEに一般化。
v59
2003年4月27日
OBSOLETE_METHOD_IDの不要な間接参照を削除。
v60
2003年5月4日
OnLoad時のDestroyRawMonitorを許可。
v61
2003年5月7日
DestroyRawMonitorにモニターの所有者でない場合に返されるエラーを追加。
v62
2003年5月13日
rawモニターのセマンティックスを改訂。 GetThreadStatusのフラグを変更。 GetClassLoaderは、ブートストラップ・クラス・ローダーの場合NULLを返す。 GetClassNameの問題を追加。 局所変数シグニチャを定義。 GetObjectsWithAnnotationsの注釈配列内のゼロを禁止。 GetObjectsWithAnnotationsの仕様を削除。 SetAllocationHooksを削除します。 SuspendAllThreadsを削除します。
v63
2003年5月14日
データ型jvmtiEventCallbacksを定義。 ゼロ長の割当てはNULLを返す。 SetAllocationHooksはJVMDIでは保持されるがJVM TIからは削除。 JVMTI_THREAD_STATUS_FLAG_INTERRUPTEDを追加。
v64
2003年5月15日
レビューにより表現を変更。
v65
2003年5月15日
最初のアルファ版。 jmethodIDとjfieldIDを一意に変更。jclassは使用しない。
v66
2003年5月27日
細かいXSLTエラーを修正。
v67
2003年6月13日
jfieldIDの一意化を取り消し(jmethodIDはそのまま)。
v68
2003年6月17日
6月11日のExpert Groupミーティングによる変更 -- ヒープ関数の見直し: シングル・コールバック、GetHeapRootsの削除、到達可能なイテレータの追加、「注釈」の名前を「タグ」に変更。 ほとんどの関数で、NULLスレッド・パラメータは現在のスレッド。 タイマーを追加。 ForceExitを削除。 GetEnvironmentLocalStorageを追加。 冗長フラグおよびイベントを追加。 AddToBootstrapClassLoaderSearchを追加。 ClassFileLoadHookを更新。
v69
2003年6月18日
問題点のセクションを改訂。 GetClassNameの名前をGetClassSignatureに戻し、説明を修正。 GetClassSignature、GetFieldSignature、GetMethodSignature、およびGetLocalVariableTableにジェネリック・シグニチャを追加。 EstimateCostOfCapabilitiesを削除。 システム・プロパティ関数がシステム・プロパティのVMビューで動作することを明示。 Agent_OnLoadの説明を改訂。 イベントのJNIEnv*から定数を削除。 メタデータ・アクセサを追加。
v70
2003年6月18日
GetStackTraceにstart_depthを追加。 システム・プロパティを新しいカテゴリに移動。 GetObjectSizeを追加。 コマンド行フラグからXを削除。 XML、HTML、スペル・チェックによる修正。
v71
2003年6月19日
JVMTI_HEAP_ROOT_THREADを6に修正。 各説明が関数名に一致するように変更。 あいまいな表現を修正。
v72
2003年6月26日
SetThreadLocalStorageとSetEnvironmentLocalStorageでは、値をNULLに設定できなければならない。 NotifyFramePop、GetFrameLocationm、およびフレームについて記述する必要があるすべての局所変数の操作を修正。 全体にわたって、文法を修正し、説明を明瞭化する必要がある。 大文字と小文字の区別、および句読点に一貫性を持たせる必要がある。 マイクロ・バージョン番号と、メジャー、マイナー、およびマイクロ・バージョン番号にアクセスするマスクが必要。 エラー・コード・リストに、実装によって返されるエラー・コードを示す必要がある。 コマンド行プロパティをプロパティ関数内で可視にする必要がある。 現在のスレッドからのポップを禁止。 ポップできないとき、実装が不透明なフレーム・エラーを返すことを許可。 NativeMethodBindイベントは、どの段階でも送信できなければならない。 DynamicCodeGeneratedイベントは、どの段階でも送信できなければならない。 VMInitの前に、次の関数の実行が許可されなければならない: Set/GetEnvironmentLocalStorage GetMethodDeclaringClass GetClassSignature GetClassModifiers IsInterface IsArrayClass GetMethodName GetMethodModifiers GetMaxLocals GetArgumentsSize GetLineNumberTable GetMethodLocation IsMethodNative IsMethodSynthetic。 XSLに対するその他の変更: 引数の説明で、ポインタの前ではなく後ろにアスタリスクを表示する必要がある。 NotifyFramePop、GetFrameLocationm、およびその他の局所変数の操作にNO_MORE_FRAMESエラーを追加する必要がある。 活動状態でないスレッドは、無効なスレッドとは異なったエラーを返す必要がある。
v73
2003年7月7日
VerboseOutputイベントがメッセージ・パラメータを検出しなかった。 細かい修正。
v74
2003年7月14日
Technical Publications Departmentによる修正。 スレッド・ローカルおよび環境ローカルな記憶領域にNULLを設定することを許可。
v75
2003年7月23日
オーバーロードされたJVM_OnLoadの代わりに新しいAgent_OnLoadを使用。 コールバックにJNICALLを追加(XSL)。 イベントとコールバックの両方についてJNICALLの要件を文書化(XSL)。 RedefineClassesをメソッドと属性に限定。 VerboseOutputイベントを削除。 VMObjectAlloc: イベント送信時に制限し、メソッド・パラメータを削除。 Tech Pubsによる編集に対する対応を完了。
v76
2003年7月24日
ClassFileLoadHookイベントが再定義のブール型ではなくクラスを送信するように変更。
v77
2003年7月24日
XMLファイル。 テキストの細かい部分の改訂と修正。
v78
2003年7月24日
JVM TIからGetExceptionHandlerTableとGetThrownExceptionsを削除。 スタック・フレームがJVM仕様のフレームであることを明記。 can_get_source_infoをcan_get_source_file_name、can_get_line_numbers、およびcan_get_source_debug_extensionに分割。 PopFrameはネイティブ呼出しメソッドを持つことができない。 GetClassloaderClassesから正確でない記述を削除(Java™仮想マシン仕様のセクション4.4を参照)。
v79
2003年7月24日
XMLおよびテキストを修正。 スタック・フレームの説明をスタック・フレーム・カテゴリに移動。
v80
2003年7月26日
GetClassloaderClassesにNULL (ブートストラップ・ローダー)を許可。 クラスからの参照に新しいヒープ参照の種類を追加。 タイマー情報の構造体とクエリー関数を追加。 AvailableProcessorsを追加。 GetOtherThreadCpuTimeの名前をGetThreadCpuTimeに変更。 SetEventNotificationモードにJVMTI_ERROR_INVALID_THREADとJVMTI_ERROR_THREAD_NOT_ALIVEを明示的に追加。 VM_INITイベントに初期スレッドを追加。 AddToBootstrapClassLoaderSearchからプラットフォームの仮定条件を削除。
v81
2003年7月26日
レビューにより、文法と表現を変更。
v82
2003年7月27日
レビューにより、文法と表現をさらに変更。 Agent_OnUnloadを追加。
v83
2003年7月28日
Agent_OnUnloadの戻り型をvoidに変更。
v84
2003年7月28日
JVMTI_REFERENCE_ARRAYの名前をJVMTI_REFERENCE_ARRAY_ELEMENTに変更。
v85
2003年7月28日
AvailableProcessors()のjava.lang.Runtime.availableProcessors()の表現を借用。 イベントIDがゼロにならないことを保証。 解決された問題を削除。 レビューにより、タイマー情報関数の名前を変更、説明を補足。
v86
2003年7月29日
XMLで制御される実装に対して、仕様に影響のない変更を追加: SetThreadLocalStorageはVMモードで実行する必要がある。
0.1.87
5 2003年8月
GetErrorNameを追加。 jvmtiExtensionEventに可変引数の警告を追加。 jvmtiExtensionEventのjvmtiEnv*から定数を削除。 使用されないcan_get_exception_info権限を削除。 jvmtiStartFunctionにjvmtiEnv*とJNIEnv*を渡す。 jvmtiExtensionFunctionInfo.funcの宣言型を修正。 拡張関数はエラー・コードを返す。 バージョン番号付け方式を新規化。
0.2.88
5 2003年8月
ClassUnloadイベントを削除。
0.2.89
8 2003年8月
ヒープ参照イテレータのコールバックは、出力オブジェクト参照の無視を許可する列挙型を返す。 JNIEnvを拡張イベント/拡張関数のパラメータ型として許可。
0.2.90
15 2003年8月
タイプ・ミスを修正。
0.2.91
2 2003年9月
すべてのメタデータ関数を削除: GetClassMetadata、GetFieldMetadata、およびGetMethodMetadata。
0.2.92
1 2003年10月
関数Allocateにマーク付け。 Deallocate、RawMonitor*、SetEnvironmentLocalStorage、およびGetEnvironmentLocalStorageをヒープ・コールバックおよびGCイベント内で安全に使用できるものとする。
0.2.93
24 2003年11月
ヒープ反復関数およびコールバックにパススルーが不透明なユーザー・データ・ポインタを追加。 CompiledMethodUnloadイベントで、コード・アドレスを送信する。 GarbageCollectionOccurredイベントを追加。 定数プール参照の種類を追加。 関数CreateRawMonitorおよびDestroyRawMonitorをヒープ・コールバックおよびGCイベント内で安全に使用できるものとする。 説明を改訂: VMDeath、GetCurrentThreadCpuTimerInfo、GetThreadCpuTimerInfo、IterateOverReachableObjects、IterateOverObjectsReachableFromObject、GetTime、およびJVMTI_ERROR_NULL_POINTER。 欠落していたエラーを追加: GenerateEventsおよびAddToBootstrapClassLoaderSearch。 ClassFileLoadHook名前パラメータの説明を修正。 ヒープ・コールバックおよびGC/ObjectFreeイベント内で、明示的に許可された関数しか呼び出せないように指定。 コールバック中、GetCurrentThreadCpuTimerInfo、GetCurrentThreadCpuTime、GetTimerInfo、およびGetTimeを許可。 OnLoad段階でのSetTag/GetTagの呼出しを許可。 SetEventNotificationModeに追加: 不適切なスレッド・レベルでの制御を試行した場合のエラー。 jvmtiExceptionHandlerEntryを削除。 スタックのネイティブ・メソッドの処理を修正 -- GetFrameLocationのlocation_ptrパラメータ、GetFrameLocation、jvmtiFrameInfo.location、およびjlocationからJVMTI_ERROR_OPAQUE_FRAMEを削除。 スリープ時にMonitorWaitedイベントが送信されるという意味になってしまっているタイプ・ミスを削除(JVMPIより)。
0.2.94
25 2003年11月
説明の改訂とタイプ・ミスの修正。
0.2.95
3 2003年12月
ヒープ・イテレータでのNULL user_dataを許可。
0.2.97
28 2004年1月
GetThreadStateを追加し、GetThreadStatusを非推奨にする。
0.2.98
29 2004年1月
INVALID_SLOTおよびTYPE_MISMATCHエラーはオプションにしなければならない。
0.2.102
12 2004年2月
MonitorContendedExitを削除。 JNIEnvパラメータをVMObjectAllocに追加。 ヒープ・コールバックのclass_tagおよびreferrer_indexパラメータを明示的に定義。
0.2.103
2004年2月16日
JAVA_TOOL_OPTIONSのドキュメント化。
0.2.105
2004年2月17日
開始段階を初期段階と開始段階とに分割。 関数やイベントのVMStartイベント変更段階関連を追加。
0.3.6
2004年2月18日
非推奨になっていたGetThreadStatusを削除。 マイナー・バージョンを上げ、マイクロ・バージョンから100を引く
0.3.7
2004年2月18日
タイマーのナノ秒値が符号なしであることをドキュメント化。 ネイティブ・メソッドに関連するテキストを改訂。
0.3.8
2004年2月19日
タイプ・ミスを修正。 削除した非推奨のGetThreadStatusを削除。
0.3.9
2004年2月23日
中断したスレッドでNotifyFramePopを実行しなければならない。
0.3.10
2004年2月24日
一部のクラスを変更できないように、権限(can_redefine_any_classおよびcan_generate_all_class_hook_events)およびエラー(JVMTI_ERROR_UNMODIFIABLE_CLASS)を追加。
0.3.11
2004年2月28日
JVMTI_ERROR_MUST_POSSESS_CAPABILITYをSetEventNotificationModeに追加。
0.3.12
8 2004年3月
CompiledMethodUnloadを明確にし、クラスのアンロード後にイベントがポストされる場合があることを明示。
0.3.13
5 2004年3月
VMObjectAllocのsizeパラメータをjlongに変更し、GetObjectSizeに合わせる。
0.3.14
13 2004年3月
JNI FindClass関数をイベント・コールバック関数で使用するためのガイドラインを追加。
0.3.15
15 2004年3月
GetAllStackTracesおよびGetThreadListStackTracesを追加。
0.3.16
19 2004年3月
ClassLoadおよびClassPrepareイベントは、開始段階中にポストできる。
0.3.17
25 2004年3月
JVMTI_ERROR_NATIVE_METHODをGetLineNumberTable、GetLocalVariableTable、GetMaxLocals、GetArgumentsSize、GetMethodLocation、GetBytecodesに追加。
0.3.18
29 2004年3月
タイマー情報構造体のタイマーの種類を返す。
0.3.19
31 2004年3月
仕様の明確化: JVMTI_THREAD_STATE_IN_NATIVEにはJNIまたはJVM TIを含まない。 ForceGarbageCollectionはファイナライザを実行しない。 仕様のコンテキストはJavaプラットフォーム。 以前のインストゥルメンテーションを警告。
0.3.20
1 2004年4月
上記で明確化した箇所の改善、およびAgent_OnLoadが返したエラーでVMが終了する。
0.3.21
1 2004年4月
配列クラスの作成では、クラス・ロード・イベントは生成されません。
0.3.22
7 2004年4月
スレッド状態の階層をよりjava.lang.Thread.Stateにそろえる。
0.3.23
12 2004年4月
スレッド状態について明確にした。
0.3.24
19 2004年4月
エージェントによって実行できるため、GarbageCollectionOccurredイベントを削除。
0.3.25
22 2004年4月
「コマンド行オプション」を定義。
0.3.26
29 2004年4月
バイト・コード・インストゥルメンテーションの意図された使用方法を記述。 拡張イベントの第1パラメータの説明を修正。
0.3.27
30 2004年4月
説明の改訂とタイプ・ミスの修正。
0.3.28
18 2004年5月
DataDumpRequestイベントを削除。
0.3.29
18 2004年5月
ゼロ・タイムアウトのRawMonitorWaitを明確化。 RunAgentThreadのあとのスレッド状態を明確化。
0.3.30
24 2004年5月
クリーンアップ: 誤ったリンクや古いリンクの修正など。
0.3.31
30 2004年5月
以下を含む明確化: すべての文字列が修正UTF-8。 エージェント・スレッドの可視性。 廃止メソッド・バージョンの意味。 スレッド呼出ヒープのコールバック
1.0.32
1 2004年6月
major.minorバージョン番号を"1.0"に変更。
1.0.33
2 2004年6月
ForceGarbageCollectionとObjectFreeの相互作用を明確化。
1.0.34
6 2004年6月
AddToBootstrapClassLoaderSearchとSetSystemPropertyをOnLoadフェーズのみに制限。
1.0.35
11 2004年6月
SetTagのタイプ・ミスを修正。
1.0.36
18 2004年6月
商標を修正。 GetThreadStateの使用法の例にパラメータを追加。
1.0.37
4 2004年8月
著作権の更新。
1.0.38
5 2004年11月
欠落していた関数テーブル・レイアウトを追加。 欠落していた、関数のC++メンバー関数形式の説明を追加。 CFLHの名前がNULLになる可能性があることを明確化。 J2SETM 5.0の一部としてリリース。
1.1.47
24 2005年4月
major.minorバージョン番号を"1.1"に変更。 ForceEarlyReturn*関数群を追加。 GetOwnedMonitorStackDepthInfo関数を追加。 GetCurrentThread関数を追加。 「導入されたバージョン」というバージョン・マーカーを追加。 AddToSystemClassLoaderSearchを追加。 AddToBootstrapClassLoaderSearchのライブ段階での使用を許可。 IterateOverHeapおよびIterateOverInstancesOfClass関数のheap_object_callbackパラメータの説明に含まれていた歴史的な不要情報を整理。このパラメータでのNULLの使用を禁止。 明確化、修正、一貫性の向上: PopFrameでの現在のスレッド、不透明なフレーム、および不十分な数のフレームに関する表現。 「最上位」ではなく「現在のフレーム」を一貫して使用。 GetLocal*およびSetLocal*でのJVMTI_ERROR_TYPE_MISMATCHエラーを明確化するため、それらをForceEarlyReturn*での記述と互換性のあるものに変更。 他の多くの明確化や表現のクリーン・アップ。
1.1.48
25 2005年4月
GetConstantPoolの追加。 VM仕様の第1版への参照を第2版への参照に切替え。
1.1.49
26 2005年4月
GetConstantPoolでのマイナー/メジャー・バージョンの順番を明確化。
1.1.50
26 2005年4月
SetNativeMethodPrefixとSetNativeMethodPrefixesの追加。 GetOwnedMonitorStackDepthInfoを位置153に再割当て。 「クラス・ローダー検索」を独立したドキュメント・カテゴリとして分離。 XMLソース内の長すぎる行を処理。
1.1.51
29 2005年4月
ライブ段階でのエージェントの起動を許可。 エージェントの配備に関する段落を追加。
1.1.52
30 2005年4月
SetNativeMethodPrefix(es)に仕様の説明を追加。 GetConstantPoolの条件の定義を改善。
1.1.53
30 2005年4月
GetConstantPoolからGetClassVersionNumber関数を分離。 VM仕様への参照をクリーンアップ。
1.1.54
1 2005年5月
SetNativeMethodPrefix(es)の使用を任意の段階で許可。 GetConstantPoolへの再定義の影響に関する説明を追加。
1.1.56
2 2005年5月
SetNativeMethodPrefix(es)に関するさまざまな明確化。
1.1.57
2 2005年5月
欠落していたパフォーマンス警告をメソッド・エントリ・イベントに追加。
1.1.58
5 2005年5月
内部的なJVMDIサポートを削除。
1.1.59
8 2005年5月
RetransformClassesを追加します。 バイト・コード・インストゥルメンテーションのドキュメントを再編。 IsMethodObsoleteがcan_redefine_classes権限を必要としないという記述に変更。
1.1.63
11 2005年5月
再変換の明確化。
1.1.64
11 2005年5月
レビューに基づく再変換の明確化。 クラス・ロード有効時の「再変換可能(不可能)」を固定。
1.1.67
4 2005年6月
プリミティブ値の報告をサポートし、参照側のタグ設定を可能にし、より強力なフィルタ・リング機能を備えた、新しいヒープ機能を追加: FollowReferences、IterateThroughHeap、およびそれらに関連するコールバック、構造体、列挙、および定数。
1.1.68
4 2005年6月
明確化。
1.1.69
6 2005年6月
FollowReferences、IterateThroughHeap: コールバックを構造体内に配置、欠落していたエラー・コードを追加、ビジット制御フラグのビットを低減。
1.1.70
14 2005年6月
新ヒープ機能に関する追加作業: レビューに基づく仕様の整理。
1.1.71
15 2005年6月
新ヒープ機能に関する追加作業: 旧ヒープ・セクションの名前を「ヒープ(1.0)」に変更。
1.1.72
21 2005年6月
タイプ・ミスを修正。
1.1.73
27 2005年6月
参照側情報構造体を共用体に変更。
1.1.74
9 2005年9月
新規ヒープ関数群: 欠落していた参照の種類「スーパー・クラス」を追加。 フィールド・インデックスの計算に単一の方式を使用。 古くなった構造体ベース参照側情報への参照を削除。
1.1.75
12 2005年9月
FollowReferences中に、あまり重要でないjava.lang.Objectスーパー・クラス上でコールバックを発生させない。
1.1.76
13 2005年9月
文字列プリミティブ・コールバックで、長さをUnicode長に変更。 配列プリミティブ・コールバックと文字列プリミティブ・コールバックで、値を「const」に変更。 JNI関数テーブルの設定時のコンパイラの潜在的な影響についてのノートを追加。
1.1.77
13 2005年9月
GetClassVersionNumbers()とGetConstantPool()は、配列またはプリミティブ・クラスの場合にエラーを返すようにする。
1.1.78
14 2005年9月
文法に関する修正。
1.1.79
26 2005年9月
IsModifiableClassクエリーを追加。
1.1.81
9 2006年2月
jvmtiHeapReferenceCallbackにreferrer_class_tagパラメータを追加。
1.1.82
13 2006年2月
ドキュメント修正: can_redefine_any_classに再変換が含まれるように更新。 例外イベントがすべてのThrowableをカバーすることを明記。 GetStackTraceでstart_depthがゼロの場合、大きすぎるstart_depthのテストが行われない。プリミティブ・フィールド・コールバックで報告されるフィールドを明確化 -- staticとインスタンス。 わかりにくいヒープの型の名前を、コールバック名も含めて修正。 スレッド起動メソッドのインタフェースで、スタックの深さの一貫した使用を要求。 JVM TIのメモリー管理が他のシステムと非互換であることを述べた注を追加。
1.1.85
14 2006年2月
タイプ・ミスの修正、名前の変更。
1.1.86
13 2006年3月
jmethodIDとjfieldIDが保存可能であることを明確化。 「クラスのインスタンスの反復」にサブクラスが含まれることを明確化。
1.1.87
14 2006年3月
表現の修正。
1.1.88
16 2006年3月
オブジェクト参照コールバック内のstaticフィールドのreferrer_indexが、リファレンス実装(および他のすべての既知の実装)に一致するように変更。つまり、インスタンス・フィールドの定義に一致するように変更。 GetThreadListStackTracesで、JVMTI_ERROR_INVALID_THREADを追加してリスト内の無効なスレッドをカバーするようにするとともに、起動されていないスレッドからは空のスタックが返されることを規定。
1.1.89
17 2006年3月
タイプ・ミス。
1.1.90
25 2006年3月
タイプ・ミス。
1.1.91
6 2006年4月
AddToBootstrapClassLoaderSearchとAddToSystemClassLoaderSearchに関する制限を削除。
1.1.93
1 2006年5月
スタック深さを決定できない実装のモニター・スタックの深さに対して -1を返すように仕様を変更。
1.1.94
3 2006年5月
IBMのAlan Pratt氏に従って読みやすさと正確さを高めるための修正を実施。 FollowReferencesで報告されるオブジェクトの関係を記載。
1.1.95
5 2006年5月
FollowReferencesで報告されるオブジェクトの関係を明確化。
1.1.98
28 2006年6月
DisposeEnvironmentの明確化、警告を追加。 SetLocalXXXでのタイプ・ミスを修正(「retrieve」=>「set」)。 ネイティブ・メソッド接頭辞の使用中は、その接頭辞の設定状態を保つ必要があることを明確化。 エージェントごとに厳密に1つのAgent_OnXXXが呼び出されることを明確化。 ライブラリのロードは起動に依存しないことを明確化。 Agent_OnUnload仕様内でのAgent_OnLoadへのあいまいな参照を削除。
1.1.99
31 2006年7月
関数と例外との相互作用を明確化。 フィールド・インデックスの明確化と具体例の追加。 わかりにくい「つまり(That is)」の文を、MonitorWaitおよびMonitorWaitedイベントから削除。 Java 6をポイントするようにリンクを更新。
1.1.102
6 2006年8月
ResourceExhaustedイベントを追加。
1.2.2
11 2012年10月
LinkCheckツールから報告された「HTTP」および「Missing Anchor」のエラーを修正。
1.2.3
19 2013年6月
静的リンク・エージェントのサポートを追加。
9.0.0
13 2016年10月
モジュールのサポート: - メジャー・バージョンは9です- ClassFileLoadHookイベントは、すでに初期段階では送信されません。- 開始フェーズでCompiledMethodLoadイベントを許可- 新しい機能を追加: - can_generate_early_vmstart - can_generate_early_class_hook_events - 新しい機能を追加: - GetAllModules - AddModuleReads、AddModuleExports、AddModuleOpens、AddModuleUses、AddModuleProvides - IsModifiableModule can_redefine_any_classes、can_retransform_any_classesおよびIsModifiableClass APIを明示して、いくつかの実装定義クラスを禁止します。
9.0.0
12 2017年2月
GetCurrentThread関数のマイナー・アップデート: - can_generate_early_vmstart機能が有効な場合、関数は開始フェーズでNULLを返すことがあります。
11.0.0
7 2018年2月
新しいクラス・ファイルのNestHost属性およびNestMembers属性のマイナー更新: - RedefineClassesおよびRetransformClassesでクラス・ファイルNestHostおよびNestMembers属性を変更できないことを指定します。 - RedefineClassesおよびRetransformClassesによって返される新しいエラーJVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGEDを追加します。
13.0.0
20 2019年5月
キャパシティ"can_redefine_any_class"のマイナー仕様の更新。 次のようになります: "RedefineClassesは、変更可能なすべてのクラスでコールできます。 IsModifiableClassを参照してください。(can_redefine_classesも設定する必要があります)"
13.0.0
5 2019年6月
マイナーPopFrame仕様更新: - 指定されたスレッドは中断されているか、現在のスレッドでなければいけません。 (以前の現在のスレッドになることは許可されていませんでした。)
14.0.0
10 2019年10月
新規クラス・ファイル・レコード属性のマイナー更新: - RedefineClassesとRetransformClassesでクラス・ファイルのレコード属性を変更できないことを指定します。
15.0.0
13 2020年5月
新規クラス・ファイルPermittedSubclasses属性のマイナー更新: - RedefineClassesおよびRetransformClassesでクラス・ファイルのPermittedSubclasses属性を変更できないように指定します。
17.0.0
15 2021年1月
Agent_OnAttach/Agent_OnAttach_Lファンクションでエラーが報告された場合、実装がAgent_OnUnloadファンクションをコールしないよう選択した"エージェント停止"セクションでのマイナー説明。
17.0.0
8 2021年6月
ヒープ関数1.0を非推奨にするマイナー更新。