JVM Tool Interface JVM工具接口

本文详细介绍了JVMTI(Java虚拟机工具接口)的功能及使用方法。JVMTI为开发者提供了一个强大的工具接口,用于监控和控制Java应用程序的运行状态。文章涵盖了JVMTI的基本概念、事件管理和功能调用等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVMTM Tool Interface

Version 1.0


What is the JVM Tool Interface?
The JVM TM  Tool Interface (JVM   TI) is a programming interface used by development and monitoring tools. It provides both a way to inspect the state and to control the execution of applications running in the Java TM  virtual machine (VM).

JVM   TI is intended to provide a VM interface for the full breadth of tools that need access to VM state, including but not limited to: profiling, debugging, monitoring, thread analysis, and coverage analysis tools.

JVM   TI may not be available in all implementations of the Java TM  virtual machine.

JVM   TI is a two-way interface. A client of JVM   TI, hereafter called an  agent , can be notified of interesting occurrences through  events . JVM   TI can query and control the application through many  functions , either in response to events or independent of them.

Agents run in the same process with and communicate directly with the virtual machine executing the application being examined. This communication is through a native interface (JVM   TI). The native in-process interface allows maximal control with minimal intrusion on the part of a tool. Typically, agents are relatively compact. They can be controlled by a separate process which implements the bulk of a tool's function without interfering with the target application's normal execution.
Architecture
Tools can be written directly to JVM   TI or indirectly through higher level interfaces. The Java Platform Debugger Architecture includes JVM   TI, but also contains higher-level, out-of-process debugger interfaces. The higher-level interfaces are more appropriate than JVM   TI for many tools. For more information on the Java Platform Debugger Architecture, see the  Java Platform Debugger Architecture website .
Writing Agents
Agents can be written in any native language that supports C language calling conventions and C or C++ definitions.

The function, event, data type, and constant definitions needed for using JVM   TI are defined in the include file  jvmti.h . To use these definitions add the J2SE TM include directory to your include path and add
#include <jvmti.h>
    
to your source code.
Agent Command Line Options
The term "command-line option" is used below to mean options supplied in the JavaVMInitArgs  argument to the  JNI_CreateJavaVM  function of the JNI Invocation API.

One of the two following command-line options is used on VM startup to properly load and run agents. These arguments identify the library containing the agent as well as an options string to be passed in at startup.
-agentlib: <agent-lib-name> = <options>
The name following  -agentlib: is the name of the library to load. Lookup of the library, both its full name and location, proceeds in a platform-specific manner. Typically, the  <agent-lib-name> is expanded to an operating system specific file name. The  <options> will be passed to the agent on start-up. For example, if the option  -agentlib:foo=opt1,opt2 is specified, the VM will attempt to load the shared library  foo.dll from the system  PATH under Windows TM or libfoo.so from the  LD_LIBRARY_PATH under the Solaris TM operating environment.
-agentpath: <path-to-agent> = <options>
The path following  -agentpath: is the absolute path from which to load the library. No library name expansion will occur. The  <options> will be passed to the agent on start-up. For example, if the option  -agentpath:c:\myLibs\foo.dll=opt1,opt2 is specified, the VM will attempt to load the shared library  c:\myLibs\foo.dll.
The start-up routine  Agent_OnLoad  in the library will be invoked.

Libraries loaded with  -agentlib:  or  -agentpath:  will be searched for JNI native method implementations to facilitate the use of Java programming language code in tools, as is needed for  bytecode instrumentation .

The agent libraries will be searched after all other libraries have been searched (agents wishing to override or intercept the native method implementations of non-agent methods can use the  NativeMethodBind event ).

These switches do the above and nothing more - they do not change the state of the VM or JVM   TI. No command line options are needed to enable JVM   TI or aspects of JVM   TI, this is handled programmatically by the use of  capabilities .
Agent Start-Up
The library must export a start-up function with the following prototype:
JNIEXPORT jint JNICALL 
Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
This function will be called by the VM when the library is loaded. The VM should load the library early enough in VM initialization that:
  • system properties may be set before they have been used in the start-up of the VM
  • the full set of capabilities is still available (note that capabilities that configure the VM may only be available at this time--see the Capability function section)
  • no bytecodes have executed
  • no classes have been loaded
  • no objects have been created

The VM will call the  Agent_OnLoad  function with  <options>  as the second argument - that is, using the command-line option examples,  "opt1,opt2"  will be passed to the char *options  argument of  Agent_OnLoad . The  options  argument is encoded as a  modified UTF-8  string. If  =<options>  is not specified, a zero length string is passed to options . The lifespan of the  options  string is the  Agent_OnLoad  call. If needed beyond this time the string or parts of the string must be copied. The period between when Agent_OnLoad  is called and when it returns is called the  OnLoad phase . Since the VM is not initialized during the OnLoad  phase , the set of allowed operations inside Agent_OnLoad  is restricted (see the function descriptions for the functionality available at this time). The agent can safely process the options and set event callbacks with  SetEventCallbacks . Once the VM initialization event is received (that is, the  VMInit  callback is invoked), the agent can complete its initialization.

Rationale: Early startup is required so that agents can set the desired capabilities, many of which must be set before the VM is initialized. In JVMDI, the -Xdebug command-line option provides very coarse-grain control of capabilities. JVMPI implementations use various tricks to provide a single "JVMPI on" switch. No reasonable command-line option could provide the fine-grain of control required to balance needed capabilities vs performance impact. Early startup is also needed so that agents can control the execution environment - modifying the file system and system properties to install their functionality.

The return value from  Agent_OnLoad  is used to indicate an error. Any value other than zero indicates an error and causes termination of the VM.
Agent Shutdown
The library may optionally export a shutdown function with the following prototype:
JNIEXPORT void JNICALL 
Agent_OnUnload(JavaVM *vm)
This function will be called by the VM when the library is about to be unloaded. The library will be unloaded and this function will be called if some platform specific mechanism causes the unload (an unload mechanism is not specified in this document) or the library is (in effect) unloaded by the termination of the VM whether through normal termination or VM failure, including start-up failure. Uncontrolled shutdown is, of couse, an exception to this rule. Note the distinction between this function and the  VM Death event : for the VM Death event to be sent, the VM must have run at least to the point of initialization and a valid JVM   TI environment must exist which has set a callback for VMDeath and enabled the event None of these are required for  Agent_OnUnload  and this function is also called if the library is unloaded for other reasons. In the case that a VM Death event is sent, it will be sent before this function is called (assuming this function is called due to VM termination). This function can be used to clean-up resources allocated during  Agent_OnLoad .
JAVA_TOOL_OPTIONS
Since the command-line cannot always be accessed or modified, for example in embedded VMs or simply VMs launched deep within scripts. A  JAVA_TOOL_OPTIONS  variable is provided so that agents may be launched in these cases.

Platforms which support environment variables or other named strings, may support the  JAVA_TOOL_OPTIONS  variable. This variable will be broken into options at white-space boundaries. White-space characters include space, tab, carriage-return, new-line, vertical-tab, and form-feed. Sequences of white-space characters are considered equivalent to a single white-space character. No white-space is included in the options unless quoted. Quoting is as follows:
  • All characters enclosed between a pair of single quote marks (''), except a single quote, are quoted.
  • Double quote characters have no special meaning inside a pair of single quote marks.
  • All characters enclosed between a pair of double quote marks (""), except a double quote, are quoted.
  • Single quote characters have no special meaning inside a pair of double quote marks.
  • A quoted part can start or end anywhere in the variable.
  • White-space characters have no special meaning when quoted -- they are included in the option like any other character and do not mark white-space boundaries.
  • The pair of quote marks is not included in the option.
JNI_CreateJavaVM  (in the JNI Invocation API) will prepend these options to the options supplied in its  JavaVMInitArgs  argument. Platforms may disable this feature in cases where security is a concern; for example, the Reference Implementation disables this feature on Unix systems when the effective user or group ID differs from the real ID. This feature is intended to support the initialization of tools -- specifically including the launching of native or Java programming language agents. Multiple tools may wish to use this feature, so the variable should not be overwritten, instead, options should be appended to the variable. Note that since the variable is processed at the time of the JNI Invocation API create VM call, options processed by a launcher (e.g., VM selection options) will not be handled.
Environments
The JVM   TI specification supports the use of multiple simultaneous JVM   TI agents. Each agent has its own JVM   TI environment. That is, the JVM   TI state is separate for each agent - changes to one environment do not affect the others. The state of a JVM   TI environment includes: Although their JVM   TI state is separate, agents inspect and modify the shared state of the VM, they also share the native environment in which they execute. As such, an agent can perturb the results of other agents or cause them to fail. It is the responsibility of the agent writer to specify the level of compatibility with other agents. JVM   TI implementations are not capable of preventing destructive interactions between agents. Techniques to reduce the likelihood of these occurrences are beyond the scope of this document.

An agent creates a JVM   TI environment by passing a JVM   TI version as the interface ID to the JNI Invocation API function  GetEnv . See  Accessing Functions  for more details on the creation and use of JVM   TI environments. Typically, JVM   TI environments are created by calling  GetEnv  from  Agent_OnLoad .
Bytecode Instrumentation
This interface does not include some events that one might expect in an interface with profiling support. Some examples include object allocation events and full speed method enter and exit events. The interface instead provides support for bytecode instrumentation , the ability to alter the Java virtual machine bytecode instructions which comprise the target program. Typically, these alterations are to add "events" to the code of a method - for example, to add, at the beginning of a method, a call to  MyProfiler.methodEntered() . Since the changes are purely additive, they do not modify application state or behavior. Because the inserted agent code is standard bytecodes, the VM can run at full speed, optimizing not only the target program but also the instrumentation. If the instrumentation does not involve switching from bytecode execution, no expensive state transitions are needed. The result is high performance events. This approach also provides complete control to the agent, instrumentation can be restricted to "interesting" portions of the code (e.g., the end user's code) and can be conditional. Instrumentation can run entirely in Java programming language code or can call into the native agent. Instrumentation can simply maintain counters or can statistically sample events.

Instrumentation can be inserted in one of three ways:
  • Static Instrumentation: The class file is instrumented before it is loaded into the VM - for example, by creating a duplicate directory of *.class files which have been modified to add the instrumentation. This method is extremely awkward and, in general, an agent cannot know the origin of the class files which will be loaded.
  • Load-Time Instrumentation: When a class file is loaded by the VM, the raw bytes of the class file are sent for instrumentation to the agent. TheClassFileLoadHook event provides this functionality. This mechanism provides efficient and complete access to one-time instrumentation.
  • Dynamic Instrumentation: A class which is already loaded (and possibly even running) is modified. This optional feature is provided by the RedefineClassesfunction. Classes can be modified multiple times and can be returned to their original state. The mechanism allows instrumentation which changes during the course of execution.

The class modification functionality provided in this interface (the  ClassFileLoadHook event and the  RedefineClasses  function) is intended to provide a mechanism for instrumentation (described above) and, during development, for fix-and-continue debugging.

Care must be taken to avoid perturbing dependencies, especially when instrumenting core classes. For example, an approach to getting notification of every object allocation is to instrument the constructor on  Object . Assuming that the constructor is initially empty, the constructor could be changed to:
      public Object() {
        MyProfiler.allocationTracker(this);
      }
    
However, if this change was made using the  ClassFileLoadHook  event then this might impact a typical VM as follows: the first created object will call the constructor causing a class load of  MyProfiler ; which will then cause object creation, and since MyProfiler  isn't loaded yet, infinite recursion; resulting in a stack overflow. A refinement of this would be to delay invoking the tracking method until a safe time. For example,  trackAllocations  could be set in the handler for the  VMInit  event.
      static boolean trackAllocations = false;

      public Object() {
        if (trackAllocations) {
          MyProfiler.allocationTracker(this);
        }
      }
    
Modified UTF-8 String Encoding
JVM   TI uses modified UTF-8 to encode character strings. This is the same encoding used by JNI. Modified UTF-8 differs from standard UTF-8 in the representation of supplementary characters and of the null character. See the  Modified UTF-8 Strings section of the JNI specification for details.
Specification Context
Since this interface provides access to the state of applications running in the Java virtual machine; terminology refers to the Java platform and not the native platform (unless stated otherwise). For example:
  • "thread" means Java programming language thread.
  • "stack frame" means Java virtual machine stack frame.
  • "class" means Java programming language class.
  • "heap" means Java virtual machine heap.
  • "monitor" means Java programming language object monitor.

Sun, Sun Microsystems, the Sun logo, Java, and JVM are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries.


Functions

Accessing Functions
Native code accesses JVM   TI features by calling JVM   TI functions. Access to JVM   TI functions is by use of an interface pointer in the same manner as  Java Native Interface (JNI) functions  are accessed. The JVM   TI interface pointer is called the  environment pointer .

An environment pointer is a pointer to an environment and has the type  jvmtiEnv* . An environment has information about its JVM   TI connection. The first value in the environment is a pointer to the function table. The function table is an array of pointers to JVM   TI functions. Every function pointer is at a predefined offset inside the array.

When used from the C language: double indirection is used to access the functions; the environment pointer provides context and is the first parameter of each function call; for example:
jvmtiEnv *jvmti;
...
jvmtiError err = (*jvmti)->GetLoadedClasses(jvmti, &class_count, &classes);
    

When used from the C++ language: functions are accessed as member functions of jvmtiEnv ; the environment pointer is not passed to the function call; for example:
jvmtiEnv *jvmti;
...
jvmtiError err = jvmti->GetLoadedClasses(&class_count, &classes);
    
Unless otherwise stated, all examples and declarations in this specification use the C language.

A JVM   TI environment can be obtained through the JNI Invocation API  GetEnv  function:
jvmtiEnv *jvmti;
...
(*jvm)->GetEnv(jvm, &jvmti, JVMTI_VERSION_1_0);
    
Each call to  GetEnv  creates a new JVM   TI connection and thus a new JVM   TI environment. The  version  argument of  GetEnv  must be a JVM   TI version. The returned environment may have a different version than the requested version but the returned environment must be compatible.  GetEnv  will return  JNI_EVERSION  if a compatible version is not available, if JVM   TI is not supposed or JVM   TI is not supported in the current VM configuration. Other interfaces may be added for creating JVM   TI environments in specific contexts. Each environment has its own state (for example,  desired events event handling functions , and  capabilities ). An environment is released with  DisposeEnvironment . Thus, unlike JNI which has one environment per thread, JVM   TI environments work across threads and are created dynamically.
Function Return Values
JVM   TI functions always return an  error code  via the  jvmtiError  function return value. Some functions can return additional values through pointers provided by the calling function. In some cases, JVM   TI functions allocate memory that your program must explicitly deallocate. This is indicated in the individual JVM   TI function descriptions. Empty lists, arrays, sequences, etc are returned as  NULL .

In the event that the JVM   TI function encounters an error (any return value other than  JVMTI_ERROR_NONE ) the values of memory referenced by argument pointers is undefined, but no memory will have been allocated and no global references will have been allocated. If the error occurs because of invalid input, no action will have occurred.
Managing JNI Object References
JVM   TI functions identify objects with JNI references ( jobject  and  jclass ) and their derivatives ( jthread  and  jthreadGroup ). References passed to JVM   TI functions can be either global or local, but they must be strong references. All references returned by JVM   TI functions are local references--these local references are created during the JVM   TI call. Local references are a resource that must be managed (see the  JNI Documentation ). When threads return from native code all local references are freed. Note that some threads, including typical agent threads, will never return from native code. A thread is ensured the ability to create sixteen local references without the need for any explicit management. For threads executing a limited number of JVM   TI calls before returning from native code (for example, threads processing events), it may be determined that no explicit management is needed. However, long running agent threads will need explicit local reference management--usually with the JNI functions  PushLocalFrame  and  PopLocalFrame . Conversely, to preserve references beyond the return from native code, they must be converted to global references.
Prerequisite State for Calling Functions
Unless the function explicitly states that the agent must bring a thread or the VM to a particular state (for example, suspended), the JVM   TI implementation is responsible for bringing the VM to a safe and consistent state for performing the function.

Function Index


Memory Management

Memory Management functions:


Allocate

jvmtiError
Allocate(jvmtiEnv* env,
            jlong size,
            unsigned char** mem_ptr)
Allocate an area of memory through the JVM TI allocator. The allocated memory should be freed with Deallocate.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
sizejlongThe number of bytes to allocate.

Rationale: jlong is used for compatibility with JVMDI.

mem_ptrunsigned char**On return, a pointer to the beginning of the allocated memory. If size is zero, NULL is returned.

Agent passes a pointer to a unsigned char*. On return, theunsigned char* points to a newly allocated array of size size. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_OUT_OF_MEMORYMemory request cannot be honored.
JVMTI_ERROR_ILLEGAL_ARGUMENTsize is less than zero.
JVMTI_ERROR_NULL_POINTERmem_ptr is NULL.

Deallocate

jvmtiError
Deallocate(jvmtiEnv* env,
            unsigned char* mem)
Deallocate mem using the JVM TI allocator. This function should be used to deallocate any memory allocated and returned by a JVM TI function (including memory allocated with Allocate). All allocated memory must be deallocated or the memory cannot be reclaimed.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
memunsigned char *A pointer to the beginning of the allocated memory. Please ignore "On return, the elements are set."

Agent passes an array of unsigned char. The incoming values of the elements of the array are ignored. On return, the elements are set. If mem is NULL, the call is ignored.

Errors
This function returns a universal error


Thread

Thread functions: Thread function types: Thread types:


Get Thread State

jvmtiError
GetThreadState(jvmtiEnv* env,
            jthread thread,
            jint* thread_state_ptr)
Get the state of a thread. The state of the thread is represented by the answers to the hierarchical set of questions below:

The answers are represented by the following bit vector.
Thread State Flags
ConstantValueDescription
JVMTI_THREAD_STATE_ALIVE0x0001Thread is alive. Zero if thread is new (not started) or terminated.
JVMTI_THREAD_STATE_TERMINATED0x0002Thread has completed execution.
JVMTI_THREAD_STATE_RUNNABLE0x0004Thread is runnable.
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER0x0400Thread is waiting to enter a synchronization block/method or, after an Object.wait(), waiting to re-enter a synchronization block/method.
JVMTI_THREAD_STATE_WAITING0x0080Thread is waiting.
JVMTI_THREAD_STATE_WAITING_INDEFINITELY0x0010Thread is waiting without a timeout. For example,Object.wait().
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT0x0020Thread is waiting with a maximum time to wait specified. For example, Object.wait(long).
JVMTI_THREAD_STATE_SLEEPING0x0040Thread is sleeping -- Thread.sleep(long).
JVMTI_THREAD_STATE_IN_OBJECT_WAIT0x0100Thread is waiting on an object monitor -- Object.wait.
JVMTI_THREAD_STATE_PARKED0x0200Thread is parked, for example: LockSupport.park,LockSupport.parkUtil and LockSupport.parkNanos.
JVMTI_THREAD_STATE_SUSPENDED0x100000Thread suspended. java.lang.Thread.suspend() or a JVM TI suspend function (such as SuspendThread) has been called on the thread. If this bit is set, the other bits refer to the thread state before suspension.
JVMTI_THREAD_STATE_INTERRUPTED0x200000Thread has been interrupted.
JVMTI_THREAD_STATE_IN_NATIVE0x400000Thread is in native code--that is, a native method is running which has not called back into the VM or Java programming language code.

This flag is not set when running VM compiled Java programming language code nor is it set when running VM code or VM support code. Native VM interface functions, such as JNI and JVM TI functions, may be implemented as VM code.
JVMTI_THREAD_STATE_VENDOR_10x10000000Defined by VM vendor.
JVMTI_THREAD_STATE_VENDOR_20x20000000Defined by VM vendor.
JVMTI_THREAD_STATE_VENDOR_30x40000000Defined by VM vendor.
The following definitions are used to convert JVM TI thread state to java.lang.Thread.State style states.
java.lang.Thread.State Conversion Masks
ConstantValueDescription
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_TIMEOUTMask the state with this before comparison
JVMTI_JAVA_LANG_THREAD_STATE_NEW0java.lang.Thread.State.NEW
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATEDJVMTI_THREAD_STATE_TERMINATEDjava.lang.Thread.State.TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLEJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLEjava.lang.Thread.State.RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKEDJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTERjava.lang.Thread.State.BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_WAITINGJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELYjava.lang.Thread.State.WAITING
JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITINGJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUTjava.lang.Thread.State.TIMED_WAITING
Rules

There can be no more than one answer to a question, although there can be no answer (because the answer is unknown, does not apply, or none of the answers is correct). An answer is set only when the enclosing answers match. That is, no more than one of
  • JVMTI_THREAD_STATE_RUNNABLE
  • JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
  • JVMTI_THREAD_STATE_WAITING
can be set (a J2SETM compliant implementation will always set one of these if JVMTI_THREAD_STATE_ALIVE is set). And if any of these are set, the enclosing answer JVMTI_THREAD_STATE_ALIVE is set. No more than one of
  • JVMTI_THREAD_STATE_WAITING_INDEFINITELY
  • JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
can be set (a J2SETM compliant implementation will always set one of these if JVMTI_THREAD_STATE_WAITING is set). And if either is set, the enclosing answers JVMTI_THREAD_STATE_ALIVE and JVMTI_THREAD_STATE_WAITING are set. No more than one of
  • JVMTI_THREAD_STATE_IN_OBJECT_WAIT
  • JVMTI_THREAD_STATE_PARKED
  • JVMTI_THREAD_STATE_SLEEPING
can be set. And if any of these is set, the enclosing answers JVMTI_THREAD_STATE_ALIVE and JVMTI_THREAD_STATE_WAITING are set. Also, if JVMTI_THREAD_STATE_SLEEPING is set, then JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT is set. If a state A is implemented using the mechanism of state B then it is state A which is returned by this function. For example, if Thread.sleep(long) is implemented using Object.wait(long) then it is still JVMTI_THREAD_STATE_SLEEPING which is returned. More than one of
  • JVMTI_THREAD_STATE_SUSPENDED
  • JVMTI_THREAD_STATE_INTERRUPTED
  • JVMTI_THREAD_STATE_IN_NATIVE
can be set, but if any is set, JVMTI_THREAD_STATE_ALIVE is set.

And finally, JVMTI_THREAD_STATE_TERMINATED cannot be set unless JVMTI_THREAD_STATE_ALIVE is not set.

The thread state representation is designed for extension in future versions of the specification; thread state values should be used accordingly, that is they should not be used as ordinals. Most queries can be made by testing a single bit, if use in a switch statement is desired, the state bits should be masked with the interesting bits. All bits not defined above are reserved for future use. A VM, compliant to the current specification, must set reserved bits to zero. An agent should ignore reserved bits -- they should not be assumed to be zero and thus should not be included in comparisons.

Examples

Note that the values below exclude reserved and vendor bits.

The state of a thread blocked at a synchronized-statement would be:
            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
        
The state of a thread which hasn't started yet would be:
            0
        
The state of a thread at a Object.wait(3000) would be:
            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_WAITING + 
                JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT + 
                JVMTI_THREAD_STATE_MONITOR_WAITING
        
The state of a thread suspended while runnable would be:
            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_RUNNABLE + JVMTI_THREAD_STATE_SUSPENDED
        

Testing the State

In most cases, the thread state can be determined by testing the one bit corresponding to that question. For example, the code to test if a thread is sleeping:
	jint state;
	jvmtiError err;

	err = (*jvmti)->GetThreadState(jvmti, thread, &state);
	if (err == JVMTI_ERROR_NONE) {
	   if (state & JVMTI_THREAD_STATE_SLEEPING) {  ...
        

For waiting (that is, in Object.wait, parked, or sleeping) it would be:
	   if (state & JVMTI_THREAD_STATE_WAITING) {  ...
        
For some states, more than one bit will need to be tested as is the case when testing if a thread has not yet been started:
	   if ((state & (JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_TERMINATED)) == 0)  {  ...
        
To distinguish timed from untimed 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");
             }
           }
        

Relationship to java.lang.Thread.State

The thread state represented by java.lang.Thread.State returned from java.lang.Thread.getState() is a subset of the information returned from this function. The corresponding java.lang.Thread.State can be determined by using the provided conversion masks. For example, this returns the name of the java.lang.Thread.State 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";
            }
        

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threadjthreadThe thread to query. If thread is NULL, the current thread is used.
thread_state_ptrjint*On return, points to state flags, as defined by the Thread State Flags.

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_NULL_POINTERthread_state_ptr is NULL.

Get All Threads

jvmtiError
GetAllThreads(jvmtiEnv* env,
            jint* threads_count_ptr,
            jthread** threads_ptr)
Get all live threads. The threads are Java programming language threads; that is, threads that are attached to the VM. A thread is live ifjava.lang.Thread.isAlive() would return true, that is, the thread has been started and has not yet died. The universe of threads is determined by the context of the JVM TI environment, which typically is all threads attached to the VM. Note that this includes JVM TI agent threads (see RunAgentThread).

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threads_count_ptrjint*On return, points to the number of running threads.

Agent passes a pointer to a jint. On return, thejint has been set.
threads_ptrjthread**On return, points to an array of references, one for each running thread.

Agent passes a pointer to a jthread*. On return, thejthread* points to a newly allocated array of size*threads_count_ptr. The array should be freed withDeallocate. The objects returned by threads_ptr are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERthreads_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERthreads_ptr is NULL.

Suspend Thread

jvmtiError
SuspendThread(jvmtiEnv* env,
            jthread thread)
Suspend the specified thread. If the calling thread is specified, this function will not return until some other thread calls ResumeThread. If the thread is currently suspended, this function does nothing and returns an error.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_suspendCan suspend and resume threads

Parameters
NameTypeDescription
threadjthreadThe thread to suspend. If thread is NULL, the current thread is used.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_suspend. Use AddCapabilities.
JVMTI_ERROR_THREAD_SUSPENDEDThread already suspended.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).

Suspend Thread List

jvmtiError
SuspendThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)
Suspend the request_count threads specified in the request_list array. Threads may be resumed with ResumeThreadList or ResumeThread. If the calling thread is specified in the request_list array, this function will not return until some other thread resumes it. Errors encountered in the suspension of a thread are returned in the results array, not in the return value of this function. Threads that are currently suspended are not suspended.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_suspendCan suspend and resume threads

Parameters
NameTypeDescription
request_countjintThe number of threads to suspend.
request_listconstjthread*The list of threads to suspend.

Agent passes in an array of request_count elements ofjthread.
resultsjvmtiError*An agent supplied array of request_count elements. On return, filled with the error code for the suspend of the corresponding thread. The error code will beJVMTI_ERROR_NONE if the thread was suspended by this call. Possible error codes are those specified forSuspendThread.

Agent passes an array large enough to holdrequest_count elements of jvmtiError. The incoming values of the elements of the array are ignored. On return, the elements are set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_suspend. Use AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENTrequest_count is less than 0.
JVMTI_ERROR_NULL_POINTERrequest_list is NULL.
JVMTI_ERROR_NULL_POINTERresults is NULL.

Resume Thread

jvmtiError
ResumeThread(jvmtiEnv* env,
            jthread thread)
Resume a suspended thread. Any threads currently suspended through a JVM TI suspend function (eg. SuspendThread) or java.lang.Thread.suspend() will resume execution; all other threads are unaffected.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_suspendCan suspend and resume threads

Parameters
NameTypeDescription
threadjthreadThe thread to resume.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_suspend. Use AddCapabilities.
JVMTI_ERROR_THREAD_NOT_SUSPENDEDThread was not suspended.
JVMTI_ERROR_INVALID_TYPESTATEThe state of the thread has been modified, and is now inconsistent.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).

Resume Thread List

jvmtiError
ResumeThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)
Resume the request_count threads specified in the request_list array. Any thread suspended through a JVM TI suspend function (eg. SuspendThreadList) orjava.lang.Thread.suspend() will resume execution.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_suspendCan suspend and resume threads

Parameters
NameTypeDescription
request_countjintThe number of threads to resume.
request_listconstjthread*The threads to resume.

Agent passes in an array of request_count elements ofjthread.
resultsjvmtiError*An agent supplied array of request_count elements. On return, filled with the error code for the resume of the corresponding thread. The error code will beJVMTI_ERROR_NONE if the thread was suspended by this call. Possible error codes are those specified forResumeThread.

Agent passes an array large enough to holdrequest_count elements of jvmtiError. The incoming values of the elements of the array are ignored. On return, the elements are set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_suspend. Use AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENTrequest_count is less than 0.
JVMTI_ERROR_NULL_POINTERrequest_list is NULL.
JVMTI_ERROR_NULL_POINTERresults is NULL.

Stop Thread

jvmtiError
StopThread(jvmtiEnv* env,
            jthread thread,
            jobject exception)
Send the specified asynchronous exception to the specified thread (similar to java.lang.Thread.stop). Normally, this function is used to kill the specified thread with an instance of the exception ThreadDeath.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_signal_threadCan send stop or interrupt to threads

Parameters
NameTypeDescription
threadjthreadThe thread to stop.
exceptionjobjectThe asynchronous exception object.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_signal_thread. Use AddCapabilities.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_INVALID_OBJECTexception is not an object.

Interrupt Thread

jvmtiError
InterruptThread(jvmtiEnv* env,
            jthread thread)
Interrupt the specified thread (similar to java.lang.Thread.interrupt).

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_signal_threadCan send stop or interrupt to threads

Parameters
NameTypeDescription
threadjthreadThe thread to interrupt.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_signal_thread. Use AddCapabilities.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).

Get Thread Info

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)
Get thread information. The fields of the jvmtiThreadInfo structure are filled in with details of the specified thread.

This function may only be called during the live phase.

Capabilities
Required Functionality

jvmtiThreadInfo - Thread information structure
FieldTypeDescription
namechar*The thread name, encoded as a modified UTF-8string.
priorityjintThe thread priority. See the thread priority constants: jvmtiThreadPriority.
is_daemonjbooleanIs this a daemon thread?
thread_groupjthreadGroupThe thread group to which this thread belongs. NULL if the thread has died.
context_class_loaderjobjectThe context class loader associated with this thread.

Parameters
NameTypeDescription
threadjthreadThe thread to query. If thread is NULL, the current thread is used.
info_ptrjvmtiThreadInfo*On return, filled with information describing the specified thread.

For JDK 1.1 implementations that don't recognize context class loaders, the context_class_loader field will be NULL.

Agent passes a pointer to a jvmtiThreadInfo. On return, the jvmtiThreadInfo has been set. The pointer returned in the field name of jvmtiThreadInfo is a newly allocated array. The array should be freed withDeallocate. The object returned in the fieldthread_group of jvmtiThreadInfo is a JNI local reference and must be managed. The object returned in the field context_class_loader of jvmtiThreadInfo is a JNI local reference and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_NULL_POINTERinfo_ptr is NULL.

Get Owned Monitor Info

jvmtiError
GetOwnedMonitorInfo(jvmtiEnv* env,
            jthread thread,
            jint* owned_monitor_count_ptr,
            jobject** owned_monitors_ptr)
Get information about the monitors owned by the specified thread.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_owned_monitor_infoCan get information about ownership of monitors -GetOwnedMonitorInfo

Parameters
NameTypeDescription
threadjthreadThe thread to query. If thread is NULL, the current thread is used.
owned_monitor_count_ptrjint*The number of monitors returned.

Agent passes a pointer to a jint. On return, the jint has been set.
owned_monitors_ptrjobject**The array of owned monitors.

Agent passes a pointer to a jobject*. On return, the jobject* points to a newly allocated array of size *owned_monitor_count_ptr. The array should be freed with Deallocate. The objects returned by owned_monitors_ptr are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_owned_monitor_info. UseAddCapabilities.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_NULL_POINTERowned_monitor_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERowned_monitors_ptr is NULL.

Get Current Contended Monitor

jvmtiError
GetCurrentContendedMonitor(jvmtiEnv* env,
            jthread thread,
            jobject* monitor_ptr)
Get the object, if any, whose monitor the specified thread is waiting to enter or waiting to regain through java.lang.Object.wait.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_current_contended_monitorCan GetCurrentContendedMonitor

Parameters
NameTypeDescription
threadjthreadThe thread to query. If thread is NULL, the current thread is used.
monitor_ptrjobject*On return, filled with the current contended monitor, or NULL if there is none.

Agent passes a pointer to a jobject. On return, thejobject has been set. The object returned by monitor_ptr is a JNI local reference and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_current_contended_monitor. UseAddCapabilities.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_NULL_POINTERmonitor_ptr is NULL.

Agent Start Function

typedef void (JNICALL *jvmtiStartFunction)
    (jvmtiEnv* jvmti_env, 
     JNIEnv* jni_env, 
     void* arg);
Agent supplied callback function. This function is the entry point for an agent thread started with RunAgentThread.

Parameters
NameTypeDescription
jvmti_envjvmtiEnv *The JVM TI environment.
jni_envJNIEnv *The JNI environment.
argvoid *The arg parameter passed to RunAgentThread.

Run Agent Thread

jvmtiError
RunAgentThread(jvmtiEnv* env,
            jthread thread,
            jvmtiStartFunction proc,
            const void* arg,
            jint priority)
Starts the execution of an agent thread. with the specified native function. The parameter arg is forwarded on to the start function(specified with proc) as its single argument. This function allows the creation of agent threads for handling communication with another process or for handling events without the need to load a special subclass ofjava.lang.Thread or implementer of java.lang.Runnable. Instead, the created thread can run entirely in native code. However, the created thread does require a newly created instance of java.lang.Thread (referenced by the argument thread) to which it will be associated. The thread object can be created with JNI calls. Ideally, all calls to Java programming language code should be done during the callback for the VMInit event to avoid any interaction with the target application.

The following thread priorities are useful:
Thread Priority Constants
ConstantValueDescription
JVMTI_THREAD_MIN_PRIORITY1Minimum possible thread priority
JVMTI_THREAD_NORM_PRIORITY5Normal thread priority
JVMTI_THREAD_MAX_PRIORITY10Maximum possible thread priority

The new thread is started as a daemon thread with the specified priority. If enabled, a ThreadStart event will be sent.

Since the thread has been started, the thread will be live when this function returns, unless the thread has died immediately.

The thread group of the thread is ignored -- specifically, the thread is not added to the thread group and the thread is not seen on queries of the thread group at either the Java programming language or JVM TI levels.

The thread is not visible to Java programming language queries but is included in JVM TI queries (for example, GetAllThreads and GetAllStackTraces).

Upon execution of proc, the new thread will be attached to the VM--see the JNI documentation on Attaching to the VM.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threadjthreadThe thread to run.
procjvmtiStartFunctionThe start function.

argconst void *The argument to the start function.

Agent passes in an array. If arg is NULLNULL is passed to the start function.
priorityjintThe priority of the started thread. Any thread priority allowed by java.lang.Thread.setPriority can be used including those in jvmtiThreadPriority.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_PRIORITYpriority is less than JVMTI_THREAD_MIN_PRIORITY or greater than JVMTI_THREAD_MAX_PRIORITY
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_NULL_POINTERproc is NULL.

Set Thread Local Storage

jvmtiError
SetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            const void* data)
The VM stores a pointer value associated with each environment-thread pair. This pointer value is called thread-local storage. This value is NULLunless set with this function. Agents can allocate memory in which they store thread specific information. By setting thread-local storage it can then be accessed with GetThreadLocalStorage.

This function is called by the agent to set the value of the JVM TI thread-local storage. JVM TI supplies to the agent a pointer-size thread-local storage that can be used to record per-thread information.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threadjthreadStore to this thread. If thread is NULL, the current thread is used.
dataconst void *The value to be entered into the thread-local storage.

Agent passes in an array. If data is NULL, value is set toNULL.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).

Get Thread Local Storage

jvmtiError
GetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            void** data_ptr)
Called by the agent to get the value of the JVM TI thread-local storage.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threadjthreadRetrieve from this thread. If thread is NULL, the current thread is used.
data_ptrvoid**Pointer through which the value of the thread local storage is returned. If thread-local storage has not been set withSetThreadLocalStorage the returned pointer is NULL.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_NULL_POINTERdata_ptr is NULL.


Thread Group

Thread Group functions: Thread Group types:


Get Top Thread Groups

jvmtiError
GetTopThreadGroups(jvmtiEnv* env,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)
Return all top-level (parentless) thread groups in the VM.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
group_count_ptrjint*On return, points to the number of top-level thread groups.

Agent passes a pointer to a jint. On return, thejint has been set.
groups_ptrjthreadGroup**On return, refers to a pointer to the top-level thread group array.

Agent passes a pointer to a jthreadGroup*. On return, the jthreadGroup* points to a newly allocated array of size *group_count_ptr. The array should be freed with Deallocate. The objects returned by groups_ptr are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERgroup_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERgroups_ptr is NULL.

Get Thread Group Info

typedef struct {
    jthreadGroup parent;
    char* name;
    jint max_priority;
    jboolean is_daemon;
} jvmtiThreadGroupInfo;
jvmtiError
GetThreadGroupInfo(jvmtiEnv* env,
            jthreadGroup group,
            jvmtiThreadGroupInfo* info_ptr)
Get information about the thread group. The fields of the jvmtiThreadGroupInfostructure are filled in with details of the specified thread group.

This function may only be called during the live phase.

Capabilities
Required Functionality

jvmtiThreadGroupInfo - Thread group information structure
FieldTypeDescription
parentjthreadGroupThe parent thread group.
namechar*The thread group's name, encoded as a modified UTF-8string.
max_priorityjintThe maximum priority for this thread group.
is_daemonjbooleanIs this a daemon thread group?

Parameters
NameTypeDescription
groupjthreadGroupThe thread group to query.
info_ptrjvmtiThreadGroupInfo*On return, filled with information describing the specified thread group.

Agent passes a pointer to a jvmtiThreadGroupInfo. On return, the jvmtiThreadGroupInfo has been set. The object returned in the field parent ofjvmtiThreadGroupInfo is a JNI local reference and must be managed. The pointer returned in the field name of jvmtiThreadGroupInfo is a newly allocated array. The array should be freed withDeallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREAD_GROUPgroup is not a thread group object.
JVMTI_ERROR_NULL_POINTERinfo_ptr is NULL.

Get Thread Group Children

jvmtiError
GetThreadGroupChildren(jvmtiEnv* env,
            jthreadGroup group,
            jint* thread_count_ptr,
            jthread** threads_ptr,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)
Get the live threads and active subgroups in this thread group.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
groupjthreadGroupThe group to query.
thread_count_ptrjint*On return, points to the number of live threads in this thread group.

Agent passes a pointer to a jint. On return, thejint has been set.
threads_ptrjthread**On return, points to an array of the live threads in this thread group.

Agent passes a pointer to a jthread*. On return, the jthread* points to a newly allocated array of size *thread_count_ptr. The array should be freed with Deallocate. The objects returned bythreads_ptr are JNI local references and must bemanaged.
group_count_ptrjint*On return, points to the number of active child thread groups

Agent passes a pointer to a jint. On return, thejint has been set.
groups_ptrjthreadGroup**On return, points to an array of the active child thread groups.

Agent passes a pointer to a jthreadGroup*. On return, the jthreadGroup* points to a newly allocated array of size *group_count_ptr. The array should be freed with Deallocate. The objects returned by groups_ptr are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREAD_GROUPgroup is not a thread group object.
JVMTI_ERROR_NULL_POINTERthread_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERthreads_ptr is NULL.
JVMTI_ERROR_NULL_POINTERgroup_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERgroups_ptr is NULL.


Stack Frame

Stack Frame functions: Stack Frame types: These functions provide information about the stack of a thread. Stack frames are referenced by depth. The frame at depth zero is the current frame.

The frames are as described in the  Java Virtual Machine Specification Section 3.6 Frames . That is, they correspond to method invocations (including native methods) but do not correspond to platform native or VM internal frames. Information about a frame is returned in this structure:
typedef struct {
    jmethodID method;
    jlocation location;
} jvmtiFrameInfo;
Information about a set of frames is returned in this structure:
typedef struct {
    jthread thread;
    jint state;
    jvmtiFrameInfo* frame_buffer;
    jint frame_count;
} jvmtiStackInfo;

jvmtiFrameInfo - Stack frame information structure
FieldTypeDescription
methodjmethodIDThe method executing in this frame.
locationjlocationThe index of the instruction executing in this frame. -1 if the frame is executing a native method.

jvmtiStackInfo - Stack information structure
FieldTypeDescription
threadjthreadOn return, the thread traced.
statejintOn return, the thread state. See GetThreadState.
frame_bufferjvmtiFrameInfo*On return, this agent allocated buffer is filled with stack frame information.
frame_countjintOn return, the number of records filled into frame_buffer. This will be min(max_frame_countstackDepth).


Get Stack Trace

jvmtiError
GetStackTrace(jvmtiEnv* env,
            jthread thread,
            jint start_depth,
            jint max_frame_count,
            jvmtiFrameInfo* frame_buffer,
            jint* count_ptr)
Get information about the stack of a thread. If max_frame_count is less than the depth of the stack, the max_frame_count deepest frames are returned, otherwise the entire stack is returned. Deepest frames are at the beginning of the returned buffer.

The following example causes up to five of the deepest frames to be returned and (if there are any frames) the currently executing method name to be printed.
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);
   if (err == JVMTI_ERROR_NONE) {
      printf("Executing method: %s", methodName);
   }
}
        

The thread need not be suspended to call this function.

The GetLineNumberTable function can be used to map locations to line numbers. Note that this mapping can be done lazily.

If platform dependent method invocations are used to launch a thread, they may be included in the stack trace - that is, there may be frames deeper than main() and run().

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threadjthreadFetch the stack trace of this thread. If threadis NULL, the current thread is used.
start_depthjintBegin retrieving frames at this depth. If non-negative, count from the current frame, the first frame retrieved is at depth start_depth. For example, if zero, start from the current frame; if one, start from the caller of the current frame; if two, start from the caller of the caller of the current frame; and so on. If negative, count from below the oldest frame, the first frame retrieved is at depth stackDepth + start_depth, where stackDepth is the count of frames on the stack. For example, if negative one, only the oldest frame is retrieved; if negative two, start from the frame called by the oldest frame.
max_frame_countjintThe maximum number of jvmtiFrameInfo records to retrieve.
frame_bufferjvmtiFrameInfo*On return, this agent allocated buffer is filled with stack frame information.

Agent passes an array large enough to holdmax_frame_count elements of jvmtiFrameInfo. The incoming values of the elements of the array are ignored. On return, *count_ptr of the elements are set.
count_ptrjint*On return, points to the number of records filled in. For non-negative start_depth, this will be min(max_frame_countstackDepth - start_depth). For negative start_depth, this will be min(max_frame_count-start_depth).

Agent passes a pointer to a jint. On return, thejint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTstart_depth is greater than or equal to stackDepthor start_depth is less than -stackDepth.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTmax_frame_count is less than 0.
JVMTI_ERROR_NULL_POINTERframe_buffer is NULL.
JVMTI_ERROR_NULL_POINTERcount_ptr is NULL.

Get All Stack Traces

jvmtiError
GetAllStackTraces(jvmtiEnv* env,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr,
            jint* thread_count_ptr)
Get information about the stacks of all live threads (including agent threads). If max_frame_count is less than the depth of a stack, themax_frame_count deepest frames are returned for that thread, otherwise the entire stack is returned. Deepest frames are at the beginning of the returned buffer.

All stacks are collected simultaneously, that is, no changes will occur to the thread state or stacks between the sampling one thread and the next. The threads need not be suspended.
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); 
        

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
max_frame_countjintThe maximum number of jvmtiFrameInfo records to retrieve per thread.
stack_info_ptrjvmtiStackInfo**On return, this buffer is filled with stack information for each thread. The number ofjvmtiStackInfo records is determined bythread_count_ptr.

Note that this buffer is allocated to include thejvmtiFrameInfo buffers pointed to byjvmtiStackInfo.frame_buffer. These buffers must not be separately deallocated.

Agent passes a pointer to a jvmtiStackInfo*. On return, the jvmtiStackInfo* points to a newly allocated array. The array should be freed withDeallocate. The objects returned in the field threadof jvmtiStackInfo are JNI local references and must be managed.
thread_count_ptrjint*The number of threads traced.

Agent passes a pointer to a jint. On return, thejint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTmax_frame_count is less than 0.
JVMTI_ERROR_NULL_POINTERstack_info_ptr is NULL.
JVMTI_ERROR_NULL_POINTERthread_count_ptr is NULL.

Get Thread List Stack Traces

jvmtiError
GetThreadListStackTraces(jvmtiEnv* env,
            jint thread_count,
            const jthread* thread_list,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr)
Get information about the stacks of the supplied threads. If max_frame_countis less than the depth of a stack, the max_frame_count deepest frames are returned for that thread, otherwise the entire stack is returned. Deepest frames are at the beginning of the returned buffer.

All stacks are collected simultaneously, that is, no changes will occur to the thread state or stacks between the sampling one thread and the next. The threads need not be suspended.

If a thread terminates before the stack information is collected, a zero length stack (jvmtiStackInfo.frame_count will be zero) will be returned and the thread jvmtiStackInfo.state can be checked.

See the example for the similar function GetAllStackTraces.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
thread_countjintThe number of threads to trace.
thread_listconst jthread*The list of threads to trace.

Agent passes in an array of thread_count elements of jthread.
max_frame_countjintThe maximum number of jvmtiFrameInfo records to retrieve per thread.
stack_info_ptrjvmtiStackInfo**On return, this buffer is filled with stack information for each thread. The number ofjvmtiStackInfo records is determined by thread_count.

Note that this buffer is allocated to include the jvmtiFrameInfo buffers pointed to byjvmtiStackInfo.frame_buffer. These buffers must not be separately deallocated.

Agent passes a pointer to a jvmtiStackInfo*. On return, the jvmtiStackInfo* points to a newly allocated array of size *thread_count. The array should be freed with Deallocate. The objects returned in the field thread of jvmtiStackInfo are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTthread_count is less than 0.
JVMTI_ERROR_NULL_POINTERthread_list is NULL.
JVMTI_ERROR_ILLEGAL_ARGUMENTmax_frame_count is less than 0.
JVMTI_ERROR_NULL_POINTERstack_info_ptr is NULL.

Get Frame Count

jvmtiError
GetFrameCount(jvmtiEnv* env,
            jthread thread,
            jint* count_ptr)
Get the number of frames currently in the specified thread's call stack.

If this function is called for a thread actively executing bytecodes (for example, not the current thread and not suspended), the information returned is transient.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threadjthreadThe thread to query. If thread is NULL, the current thread is used.
count_ptrjint*On return, points to the number of frames in the call stack.

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_NULL_POINTERcount_ptr is NULL.

Pop Frame

jvmtiError
PopFrame(jvmtiEnv* env,
            jthread thread)
Pop the topmost stack frame of thread's stack. Popping a frame takes you to the preceding frame. When the thread is resumed, the execution state of the thread is reset to the state immediately before the called method was invoked. That is (using The Java Virtual Machine Specificationterminology):
  • the current frame is discarded as the previous frame becomes the current one
  • the operand stack is restored--the argument values are added back and if the invoke was not invokestaticobjectref is added back as well
  • the Java virtual machine PC is restored to the opcode of the invoke instruction
Note however, that any changes to the arguments, which occurred in the called method, remain; when execution continues, the first instruction to execute will be the invoke.

Between calling PopFrame and resuming the thread the state of the stack is undefined. To pop frames beyond the first, these three steps must be repeated:
  • suspend the thread via an event (step, breakpoint, ...)
  • call PopFrame
  • resume the thread

Locks acquired by a popped frame are released when it is popped. This applies to synchronized methods that are popped, and to any synchronized blocks within them, but does not apply to native locks.

Finally blocks are not executed.

Changes to global state are not addressed and thus remain changed.

The specified thread must not be the current thread and must be suspended.

Both the called method and calling method must be non-native Java programming language methods.

No JVM TI events are generated by this function.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_pop_frameCan pop frames off the stack - PopFrame

Parameters
NameTypeDescription
threadjthreadThe thread whose top frame is to be popped.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_pop_frame. Use AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAMEAttempted to pop a frame corresponding to a native method or a frame that the implementation is unable to pop.
JVMTI_ERROR_THREAD_NOT_SUSPENDEDThread was not suspended or current thread.
JVMTI_ERROR_NO_MORE_FRAMESThere are no more Java programming language frames on the call stack. Or, the thread is the current thread.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).

Get Frame Location

jvmtiError
GetFrameLocation(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jmethodID* method_ptr,
            jlocation* location_ptr)

For a Java programming language frame, return the location of the instruction currently executing.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
threadjthreadThe thread of the frame to query. If thread is NULL, the current thread is used.
depthjintThe depth of the frame to query.
method_ptrjmethodID*On return, points to the method for the current location.

Agent passes a pointer to a jmethodID. On return, thejmethodID has been set.
location_ptrjlocation*On return, points to the index of the currently executing instruction. Is set to -1 if the frame is executing a native method.

Agent passes a pointer to a jlocation. On return, thejlocation has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specified depth.
JVMTI_ERROR_NULL_POINTERmethod_ptr is NULL.
JVMTI_ERROR_NULL_POINTERlocation_ptr is NULL.

Notify Frame Pop

jvmtiError
NotifyFramePop(jvmtiEnv* env,
            jthread thread,
            jint depth)
When the frame that is currently at depth is popped from the stack, generate a FramePop event. See the FramePop event for details. Only frames corresponding to non-native Java programming language methods can receive notification.

The specified thread must either be the current thread or the thread must be suspended.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_generate_frame_pop_eventsCan set and thus get FramePop events

Parameters
NameTypeDescription
threadjthreadThe thread of the frame for which the frame pop event will be generated. If thread is NULL, the current thread is used.
depthjintThe depth of the frame for which the frame pop event will be generated.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_generate_frame_pop_events. UseAddCapabilities.
JVMTI_ERROR_OPAQUE_FRAMEThe frame at depth is executing a native method.
JVMTI_ERROR_THREAD_NOT_SUSPENDEDThread was not suspended and was not the current thread.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.


Heap

Heap functions: Heap function types: These functions are used to analyze the heap. Functionality includes the ability to view the objects in the heap and to tag these objects.

tag  is a value associated with an object. Tags are explicitly set by the agent using the  SetTag  function or by callback functions such as  jvmtiHeapObjectCallback

Tags are local to the environment; that is, the tags of one environment are not visible in another.

Tags are  jlong  values which can be used simply to mark an object or to store a pointer to more detailed information. Objects which have not been tagged have an tag of zero. Setting a tag to zero makes the object untagged.

Heap Object Filter Enumeration (jvmtiHeapObjectFilter)
ConstantValueDescription
JVMTI_HEAP_OBJECT_TAGGED1Tagged objects only.
JVMTI_HEAP_OBJECT_UNTAGGED2Untagged objects only.
JVMTI_HEAP_OBJECT_EITHER3Either tagged or untagged objects.
Heap Root Kind Enumeration (jvmtiHeapRootKind)
ConstantValueDescription
JVMTI_HEAP_ROOT_JNI_GLOBAL1JNI global reference.
JVMTI_HEAP_ROOT_SYSTEM_CLASS2System class.
JVMTI_HEAP_ROOT_MONITOR3Monitor.
JVMTI_HEAP_ROOT_STACK_LOCAL4Stack local.
JVMTI_HEAP_ROOT_JNI_LOCAL5JNI local reference.
JVMTI_HEAP_ROOT_THREAD6Thread.
JVMTI_HEAP_ROOT_OTHER7Other.
Object Reference Enumeration (jvmtiObjectReferenceKind)
ConstantValueDescription
JVMTI_REFERENCE_CLASS1Reference from an object to its class.
JVMTI_REFERENCE_FIELD2Reference from an object to the value of one of its instance fields. For references of this kind thereferrer_index parameter to thejvmtiObjectReferenceCallback is the index of the the instance field. The index is based on the order of all the object's fields. This includes all fields of the directly declared static and instance fields in the class, and includes all fields (both public and private) fields declared in superclasses and superinterfaces. The index is thus calculated by summing the index of field in the directly declared class (see GetClassFields), with the total number of fields (both public and private) declared in all superclasses and superinterfaces. The index starts at zero.
JVMTI_REFERENCE_ARRAY_ELEMENT3Reference from an array to one of its elements. For references of this kind the referrer_index parameter to thejvmtiObjectReferenceCallback is the array index.
JVMTI_REFERENCE_CLASS_LOADER4Reference from a class to its class loader.
JVMTI_REFERENCE_SIGNERS5Reference from a class to its signers array.
JVMTI_REFERENCE_PROTECTION_DOMAIN6Reference from a class to its protection domain.
JVMTI_REFERENCE_INTERFACE7Reference from a class to one of its interfaces.
JVMTI_REFERENCE_STATIC_FIELD8Reference from a class to the value of one of its static fields. For references of this kind thereferrer_index parameter to thejvmtiObjectReferenceCallback is the index of the static field. The index is based on the order of the directly declared static and instance fields in the class (not inherited fields), starting at zero. See GetClassFields.
JVMTI_REFERENCE_CONSTANT_POOL9Reference from a class to a resolved entry in the constant pool. For references of this kind thereferrer_index parameter to thejvmtiObjectReferenceCallback is the index into constant pool table of the class, starting at 1. See The Constant Pool in the Java Virtual Machine Specification.
Iteration Control Enumeration (jvmtiIterationControl)
ConstantValueDescription
JVMTI_ITERATION_CONTINUE1Continue the iteration. If this is a reference iteration, follow the references of this object.
JVMTI_ITERATION_IGNORE2Continue the iteration. If this is a reference iteration, ignore the references of this object.
JVMTI_ITERATION_ABORT0Abort the iteration.

Rationale: The heap dumping functionality (below) uses a callback for each object. While it would seem that a buffered approach would provide better throughput, tests do not show this to be the case--possibly due to locality of memory reference or array access overhead.


Get Tag

jvmtiError
GetTag(jvmtiEnv* env,
            jobject object,
            jlong* tag_ptr)
Retrieve the tag associated with an object. The tag is a long value typically used to store a unique identifier or pointer to object information. The tag is set with SetTag. Objects for which no tags have been set return a tag value of zero.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_tag_objectsCan set and get tags, as described in the Heap category.

Parameters
NameTypeDescription
objectjobjectThe object whose tag is to be retrieved.
tag_ptrjlong*On return, the referenced long is set to the value of the tag.

Agent passes a pointer to a jlong. On return, the jlong has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_tag_objects. Use AddCapabilities.
JVMTI_ERROR_INVALID_OBJECTobject is not an object.
JVMTI_ERROR_NULL_POINTERtag_ptr is NULL.

Set Tag

jvmtiError
SetTag(jvmtiEnv* env,
            jobject object,
            jlong tag)
Set the tag associated with an object. The tag is a long value typically used to store a unique identifier or pointer to object information. The tag is visible with GetTag.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_tag_objectsCan set and get tags, as described in the Heap category.

Parameters
NameTypeDescription
objectjobjectThe object whose tag is to be set.
tagjlongThe new value of the tag.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_tag_objects. Use AddCapabilities.
JVMTI_ERROR_INVALID_OBJECTobject is not an object.

Force Garbage Collection

jvmtiError
ForceGarbageCollection(jvmtiEnv* env)
Force the VM to perform a garbage collection. The garbage collection is as complete as possible. This function does not cause finalizers to be run. This function does not return until the garbage collection is finished.

Although garbage collection is as complete as possible there is no guarantee that all ObjectFree events will have been sent by the time that this function returns. In particular, an object may be prevented from being freed because it is awaiting finalization.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription

Errors
This function returns a universal error

Heap Object Callback

typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback)
    (jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     void* user_data);
Agent supplied callback function. Describes (but does not pass in) an object in the heap.

Return value should be JVMTI_ITERATION_CONTINUE to continue iteration, orJVMTI_ITERATION_ABORT to stop iteration.

This callback must not use JNI functions. This callback must not use JVM TI functions except those which specifically allow such use (see the raw monitor, memory management, and environment local storage functions).

An implementation may invoke this callback on an internal thread or the thread which called the iteration function.

Parameters
NameTypeDescription
class_tagjlongThe tag of the class of object (zero if the class is not tagged). If the object represents a runtime class, the class_tag is the tag associated with java.lang.Class (zero if java.lang.Class is not tagged).
sizejlongSize of the object (in bytes). See GetObjectSize.
tag_ptrjlong*The object tag value, or zero if the object is not tagged. To set the tag value to be associated with the object the agent sets the jlong pointed to by the parameter.
user_datavoid*The user supplied data that was passed into the iteration function.

Heap Root Object Callback

typedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback)
    (jvmtiHeapRootKind root_kind, 
     jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     void* user_data);
Agent supplied callback function. Describes (but does not pass in) an object that is a root for the purposes of garbage collection.

Return value should be JVMTI_ITERATION_CONTINUE to continue iteration,JVMTI_ITERATION_IGNORE to continue iteration without pursuing references from referree object or JVMTI_ITERATION_ABORT to stop iteration.

This callback must not use JNI functions. This callback must not use JVM TI functions except those which specifically allow such use (see the raw monitor, memory management, and environment local storage functions).

An implementation may invoke this callback on an internal thread or the thread which called the iteration function.

Parameters
NameTypeDescription
root_kindjvmtiHeapRootKindThe kind of heap root.
class_tagjlongThe tag of the class of object (zero if the class is not tagged). If the object represents a runtime class, the class_tag is the tag associated with java.lang.Class (zero if java.lang.Class is not tagged).
sizejlongSize of the object (in bytes). See GetObjectSize.
tag_ptrjlong*The object tag value, or zero if the object is not tagged. To set the tag value to be associated with the object the agent sets the jlong pointed to by the parameter.
user_datavoid*The user supplied data that was passed into the iteration function.

Stack Reference Object Callback

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);
Agent supplied callback function. Describes (but does not pass in) an object on the stack that is a root for the purposes of garbage collection.

Return value should be JVMTI_ITERATION_CONTINUE to continue iteration,JVMTI_ITERATION_IGNORE to continue iteration without pursuing references from referree object or JVMTI_ITERATION_ABORT to stop iteration.

This callback must not use JNI functions. This callback must not use JVM TI functions except those which specifically allow such use (see the raw monitor, memory management, and environment local storage functions).

An implementation may invoke this callback on an internal thread or the thread which called the iteration function.

Parameters
NameTypeDescription
root_kindjvmtiHeapRootKindThe kind of root (either JVMTI_HEAP_ROOT_STACK_LOCALor JVMTI_HEAP_ROOT_JNI_LOCAL).
class_tagjlongThe tag of the class of object (zero if the class is not tagged). If the object represents a runtime class, the class_tag is the tag associated with java.lang.Class (zero if java.lang.Class is not tagged).
sizejlongSize of the object (in bytes). See GetObjectSize.
tag_ptrjlong*The object tag value, or zero if the object is not tagged. To set the tag value to be associated with the object the agent sets the jlong pointed to by the parameter.
thread_tagjlongThe tag of the thread corresponding to this stack, zero if not tagged.
depthjintThe depth of the frame.
methodjmethodIDThe method executing in this frame.
slotjintThe slot number.
user_datavoid*The user supplied data that was passed into the iteration function.

Object Reference Callback

typedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback)
    (jvmtiObjectReferenceKind reference_kind, 
     jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     jlong referrer_tag, 
     jint referrer_index, 
     void* user_data);
Agent supplied callback function. Describes a reference from an object (the referrer) to another object (the referree).

Return value should be JVMTI_ITERATION_CONTINUE to continue iteration,JVMTI_ITERATION_IGNORE to continue iteration without pursuing references from referree object or JVMTI_ITERATION_ABORT to stop iteration.

This callback must not use JNI functions. This callback must not use JVM TI functions except those which specifically allow such use (see the raw monitor, memory management, and environment local storage functions).

An implementation may invoke this callback on an internal thread or the thread which called the iteration function.

Parameters
NameTypeDescription
reference_kindjvmtiObjectReferenceKindThe type of reference.
class_tagjlongThe tag of the class of referree object (zero if the class is not tagged). If the referree object represents a runtime class, the class_tag is the tag associated with java.lang.Class (zero if java.lang.Class is not tagged).
sizejlongSize of the referree object (in bytes). See GetObjectSize.
tag_ptrjlong*The referree object tag value, or zero if the object is not tagged. To set the tag value to be associated with the object the agent sets the jlong pointed to by the parameter.
referrer_tagjlongThe tag of the referrer object, or zero if the referrer object is not tagged.
referrer_indexjintFor references of type JVMTI_REFERENCE_FIELDthe index of the field in the referrer object. The index is based on the order of all the object's fields - seeJVMTI_REFERENCE_FIELD for further description.

For references of typeJVMTI_REFERENCE_STATIC_FIELD the index of the static field. The index is based on the order of the directly declared fields in the class - seeJVMTI_REFERENCE_STATIC_FIELD for further description.

For references of typeJVMTI_REFERENCE_ARRAY_ELEMENT the array index - see JVMTI_REFERENCE_ARRAY_ELEMENT for further description.

For references of typeJVMTI_REFERENCE_CONSTANT_POOL the index into the constant pool of the class - seeJVMTI_REFERENCE_CONSTANT_POOL for further description.

For references of other kinds thereferrer_index is -1.
user_datavoid*The user supplied data that was passed into the iteration function.

Iterate Over Objects Reachable From Object

jvmtiError
IterateOverObjectsReachableFromObject(jvmtiEnv* env,
            jobject object,
            jvmtiObjectReferenceCallback object_reference_callback,
            void* user_data)
This function iterates over all objects that are directly and indirectly reachable from the specified object. For each object A (known as the referrer) with a reference to object B the specified callback function is called to describe the object reference. The callback is called exactly once for each reference from a referrer; this is true even if there are reference cycles or multiple paths to the referrer. There may be more than one reference between a referrer and a referree, These may be distinguished by the jvmtiObjectReferenceCallback.reference_kind andjvmtiObjectReferenceCallback.referrer_index. The callback for an object will always occur after the callback for its referrer.

During the execution of this function the state of the heap does not change: no objects are allocated, no objects are garbage collected, and the state of objects (including held values) does not change. As a result, threads executing Java programming language code, threads attempting to resume the execution of Java programming language code, and threads attempting to execute JNI functions are typically stalled.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_tag_objectsCan set and get tags, as described in the Heap category.

Parameters
NameTypeDescription
objectjobjectThe object
object_reference_callbackjvmtiObjectReferenceCallbackThe callback to be called to describe each object reference.

user_datavoid *User supplied data to be passed to the callback.

Agent passes a pointer to avoid. On return, the void has been set. If user_data is NULL,NULL is passed as the user supplied data.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_tag_objects. Use AddCapabilities.
JVMTI_ERROR_INVALID_OBJECTobject is not an object.
JVMTI_ERROR_NULL_POINTERobject_reference_callback is NULL.

Iterate Over Reachable Objects

jvmtiError
IterateOverReachableObjects(jvmtiEnv* env,
            jvmtiHeapRootCallback heap_root_callback,
            jvmtiStackReferenceCallback stack_ref_callback,
            jvmtiObjectReferenceCallback object_ref_callback,
            void* user_data)
This function iterates over the root objects and all objects that are directly and indirectly reachable from the root objects. The root objects comprise the set of system classes, JNI globals, references from thread stacks, and other objects used as roots for the purposes of garbage collection.

For each root the heap_root_callback or stack_ref_callback callback is called. An object can be a root object for more than one reason and in that case the appropriate callback is called for each reason.

For each object reference the object_ref_callback callback function is called to describe the object reference. The callback is called exactly once for each reference from a referrer; this is true even if there are reference cycles or multiple paths to the referrer. There may be more than one reference between a referrer and a referree, These may be distinguished by the jvmtiObjectReferenceCallback.reference_kind andjvmtiObjectReferenceCallback.referrer_index. The callback for an object will always occur after the callback for its referrer.

Roots are always reported to the profiler before any object references are reported. In other words, the object_ref_callback callback will not be called until the appropriate callback has been called for all roots. If theobject_ref_callback callback is specified as NULL then this function returns after reporting the root objects to the profiler.

During the execution of this function the state of the heap does not change: no objects are allocated, no objects are garbage collected, and the state of objects (including held values) does not change. As a result, threads executing Java programming language code, threads attempting to resume the execution of Java programming language code, and threads attempting to execute JNI functions are typically stalled.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_tag_objectsCan set and get tags, as described in the Heap category.

Parameters
NameTypeDescription
heap_root_callbackjvmtiHeapRootCallbackThe callback function to be called for each heap root of typeJVMTI_HEAP_ROOT_JNI_GLOBAL,JVMTI_HEAP_ROOT_SYSTEM_CLASS,JVMTI_HEAP_ROOT_MONITOR,JVMTI_HEAP_ROOT_THREAD, orJVMTI_HEAP_ROOT_OTHER.

If heap_root_callback is NULL, do not report heap roots.
stack_ref_callbackjvmtiStackReferenceCallbackThe callback function to be called for each heap root ofJVMTI_HEAP_ROOT_STACK_LOCAL orJVMTI_HEAP_ROOT_JNI_LOCAL.

If stack_ref_callback is NULL, do not report stack references.
object_ref_callbackjvmtiObjectReferenceCallbackThe callback function to be called for each object reference.

If object_ref_callback is NULL, do not follow references from the root objects.
user_datavoid *User supplied data to be passed to the callback.

Agent passes a pointer to a void. On return, the void has been set. If user_data is NULLNULL is passed as the user supplied data.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_tag_objects. Use AddCapabilities.

Iterate Over Heap

jvmtiError
IterateOverHeap(jvmtiEnv* env,
            jvmtiHeapObjectFilter object_filter,
            jvmtiHeapObjectCallback heap_object_callback,
            void* user_data)
Iterate over all objects in the heap. This includes both reachable and unreachable objects.

The object_filter parameter indicates the objects for which the callback function is called. If this parameter is JVMTI_HEAP_OBJECT_TAGGED then the callback will only be called for every object that is tagged. If the parameter is JVMTI_HEAP_OBJECT_UNTAGGED then the callback will only be for objects that are not tagged. If the parameter is JVMTI_HEAP_OBJECT_EITHER then the callback will be called for every object in the heap, irrespective of whether it is tagged or not.

During the execution of this function the state of the heap does not change: no objects are allocated, no objects are garbage collected, and the state of objects (including held values) does not change. As a result, threads executing Java programming language code, threads attempting to resume the execution of Java programming language code, and threads attempting to execute JNI functions are typically stalled.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_tag_objectsCan set and get tags, as described in the Heap category.

Parameters
NameTypeDescription
object_filterjvmtiHeapObjectFilterIndicates the objects for which the callback function is called.
heap_object_callbackjvmtiHeapObjectCallbackThe iterator function to be called for each object in the heap.

If heap_object_callback is NULL, do not process objects which are not tagged.
user_datavoid *User supplied data to be passed to the callback.

Agent passes a pointer to a void. On return, the void has been set. Ifuser_data is NULLNULL is passed as the user supplied data.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_tag_objects. Use AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENTobject_filter is not a jvmtiHeapObjectFilter.

Iterate Over Instances Of Class

jvmtiError
IterateOverInstancesOfClass(jvmtiEnv* env,
            jclass klass,
            jvmtiHeapObjectFilter object_filter,
            jvmtiHeapObjectCallback heap_object_callback,
            void* user_data)
Iterate over all objects in the heap that are instances of the specified class. This includes both reachable and unreachable objects.

The object_filter parameter indicates the objects for which the callback function is called. If this parameter is JVMTI_HEAP_OBJECT_TAGGED then the callback will only be called for every object that is tagged. If the parameter is JVMTI_HEAP_OBJECT_UNTAGGED then the callback will only be called for objects that are not tagged. If the parameter is JVMTI_HEAP_OBJECT_EITHERthen the callback will be called for every object in the heap, irrespective of whether it is tagged or not.

During the execution of this function the state of the heap does not change: no objects are allocated, no objects are garbage collected, and the state of objects (including held values) does not change. As a result, threads executing Java programming language code, threads attempting to resume the execution of Java programming language code, and threads attempting to execute JNI functions are typically stalled.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_tag_objectsCan set and get tags, as described in the Heap category.

Parameters
NameTypeDescription
klassjclassIterate over objects of this class only.
object_filterjvmtiHeapObjectFilterIndicates the objects for which the callback function is called.
heap_object_callbackjvmtiHeapObjectCallbackThe iterator function to be called for each klass instance which does not have a tag.

If heap_object_callback is NULL, do not process objects which are not tagged.
user_datavoid *User supplied data to be passed to the callback.

Agent passes a pointer to a void. On return, the void has been set. Ifuser_data is NULLNULL is passed as the user supplied data.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_tag_objects. Use AddCapabilities.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_ILLEGAL_ARGUMENTobject_filter is not a jvmtiHeapObjectFilter.

Get Objects With Tags

jvmtiError
GetObjectsWithTags(jvmtiEnv* env,
            jint tag_count,
            const jlong* tags,
            jint* count_ptr,
            jobject** object_result_ptr,
            jlong** tag_result_ptr)
Return objects in the heap with the specified tags. The format is parallel arrays of objects and tags.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_tag_objectsCan set and get tags, as described in the Heap category.

Parameters
NameTypeDescription
tag_countjintNumber of tags to scan for.
tagsconstjlong *Scan for objects with these tags. Zero is not permitted in this array.

Agent passes in an array of tag_count elements ofjlong.
count_ptrjint *Return the number of objects with any of the tags intags.

Agent passes a pointer to a jint. On return, the jinthas been set.
object_result_ptrjobject**Returns the array of objects with any of the tags intags.

Agent passes a pointer to a jobject*. On return, thejobject* points to a newly allocated array of size*count_ptr. The array should be freed with Deallocate. If object_result_ptr is NULL, this information is not returned. The objects returned by object_result_ptr are JNI local references and must be managed.
tag_result_ptrjlong**For each object in object_result_ptr, return the tag at the corresponding index.

Agent passes a pointer to a jlong*. On return, thejlong* points to a newly allocated array of size*count_ptr. The array should be freed with Deallocate. If tag_result_ptr is NULL, this information is not returned.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_tag_objects. Use AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENTZero is present in tags.
JVMTI_ERROR_ILLEGAL_ARGUMENTtag_count is less than 0.
JVMTI_ERROR_NULL_POINTERtags is NULL.
JVMTI_ERROR_NULL_POINTERcount_ptr is NULL.


Local Variable

Local Variable functions: These functions are used to retrieve or set the value of a local variable. The variable is identified by the depth of the frame containing its value and the variable's slot number within that frame. The mapping of variables to slot numbers can be obtained with the function  GetLocalVariableTable .


Get Local Variable - Object

jvmtiError
GetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject* value_ptr)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. If thread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
value_ptrjobject*On return, points to the variable's value.

Agent passes a pointer to a jobject. On return, the jobjecthas been set. The object returned by value_ptr is a JNI local reference and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.
JVMTI_ERROR_NULL_POINTERvalue_ptr is NULL.

Get Local Variable - Int

jvmtiError
GetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint* value_ptr)
GetLocalInt can be used to retrieve intcharbyte, and boolean values.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. If thread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
value_ptrjint*On return, points to the variable's value.

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.
JVMTI_ERROR_NULL_POINTERvalue_ptr is NULL.

Get Local Variable - Long

jvmtiError
GetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong* value_ptr)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. If thread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
value_ptrjlong*On return, points to the variable's value.

Agent passes a pointer to a jlong. On return, the jlong has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.
JVMTI_ERROR_NULL_POINTERvalue_ptr is NULL.

Get Local Variable - Float

jvmtiError
GetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat* value_ptr)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. If thread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
value_ptrjfloat*On return, points to the variable's value.

Agent passes a pointer to a jfloat. On return, the jfloathas been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.
JVMTI_ERROR_NULL_POINTERvalue_ptr is NULL.

Get Local Variable - Double

jvmtiError
GetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble* value_ptr)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. If thread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
value_ptrjdouble*On return, points to the variable's value.

Agent passes a pointer to a jdouble. On return, the jdoublehas been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.
JVMTI_ERROR_NULL_POINTERvalue_ptr is NULL.

Set Local Variable - Object

jvmtiError
SetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject value)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. Ifthread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
valuejobjectThe new value for the variable.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.
JVMTI_ERROR_INVALID_OBJECTvalue is not an object.

Set Local Variable - Int

jvmtiError
SetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint value)
SetLocalInt can be used to set intcharbyte, and boolean values.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. Ifthread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
valuejintThe new value for the variable.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.

Set Local Variable - Long

jvmtiError
SetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong value)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. Ifthread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
valuejlongThe new value for the variable.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.

Set Local Variable - Float

jvmtiError
SetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat value)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. Ifthread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
valuejfloatThe new value for the variable.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.

Set Local Variable - Double

jvmtiError
SetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble value)
This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

Parameters
NameTypeDescription
threadjthreadThe thread of the frame containing the variable's value. Ifthread is NULL, the current thread is used.
depthjintThe depth of the frame containing the variable's value.
slotjintThe variable's slot number.
valuejdoubleThe new value for the variable.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_INVALID_SLOTInvalid slot.
JVMTI_ERROR_TYPE_MISMATCHThe variable is not an appropriate type for the function used.
JVMTI_ERROR_OPAQUE_FRAMENot a visible frame
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTdepth is less than zero.
JVMTI_ERROR_NO_MORE_FRAMESThere are no stack frames at the specifieddepth.


Breakpoint

Breakpoint functions:


Set Breakpoint

jvmtiError
SetBreakpoint(jvmtiEnv* env,
            jmethodID method,
            jlocation location)
Set a breakpoint at the instruction indicated by method and location. An instruction can only have one breakpoint.

Whenever the designated instruction is about to be executed, a Breakpointevent is generated.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_generate_breakpoint_eventsCan set and thus get Breakpoint events

Parameters
NameTypeDescription
methodjmethodIDThe method in which to set the breakpoint
locationjlocationthe index of the instruction at which to set the breakpoint

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_generate_breakpoint_events. UseAddCapabilities.
JVMTI_ERROR_DUPLICATEThe designated bytecode already has a breakpoint.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_INVALID_LOCATIONlocation is not a valid location.

Clear Breakpoint

jvmtiError
ClearBreakpoint(jvmtiEnv* env,
            jmethodID method,
            jlocation location)
Clear the breakpoint at the bytecode indicated by method and location.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_generate_breakpoint_eventsCan set and thus get Breakpoint events

Parameters
NameTypeDescription
methodjmethodIDThe method in which to clear the breakpoint
locationjlocationthe index of the instruction at which to clear the breakpoint

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_generate_breakpoint_events. UseAddCapabilities.
JVMTI_ERROR_NOT_FOUNDThere's no breakpoint at the designated bytecode.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_INVALID_LOCATIONlocation is not a valid location.


Watched Field

Watched Field functions:


Set Field Access Watch

jvmtiError
SetFieldAccessWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Generate a FieldAccess event when the field specified by klass and field is about to be accessed. An event will be generated for each access of the field until it is canceled with ClearFieldAccessWatch. Field accesses from Java programming language code or from JNI code are watched, fields modified by other means are not watched. Note that JVM TI users should be aware that their own field accesses will trigger the watch. A field can only have one field access watch set. Modification of a field is not considered an access--use SetFieldModificationWatch to monitor modifications.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_generate_field_access_eventsCan set watchpoints on field access -SetFieldAccessWatch

Parameters
NameTypeDescription
klassjclassThe class containing the field to watch
fieldjfieldIDThe field to watch

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_generate_field_access_events. UseAddCapabilities.
JVMTI_ERROR_DUPLICATEThe designated field is already being watched for accesses.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.

Clear Field Access Watch

jvmtiError
ClearFieldAccessWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Cancel a field access watch previously set by SetFieldAccessWatch, on the field specified by klass and field.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_generate_field_access_eventsCan set watchpoints on field access -SetFieldAccessWatch

Parameters
NameTypeDescription
klassjclassThe class containing the field to watch
fieldjfieldIDThe field to watch

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_generate_field_access_events. UseAddCapabilities.
JVMTI_ERROR_NOT_FOUNDThe designated field is not being watched for accesses.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.

Set Field Modification Watch

jvmtiError
SetFieldModificationWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Generate a FieldModification event when the field specified by klass and fieldis about to be modified. An event will be generated for each modification of the field until it is canceled with ClearFieldModificationWatch. Field modifications from Java programming language code or from JNI code are watched, fields modified by other means are not watched. Note that JVM TI users should be aware that their own field modifications will trigger the watch. A field can only have one field modification watch set.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_generate_field_modification_eventsCan set watchpoints on field modification - SetFieldModificationWatch

Parameters
NameTypeDescription
klassjclassThe class containing the field to watch
fieldjfieldIDThe field to watch

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_generate_field_modification_events. Use AddCapabilities.
JVMTI_ERROR_DUPLICATEThe designated field is already being watched for modifications.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.

Clear Field Modification Watch

jvmtiError
ClearFieldModificationWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Cancel a field modification watch previously set by SetFieldModificationWatch, on the field specified by klass and field.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_generate_field_modification_eventsCan set watchpoints on field modification - SetFieldModificationWatch

Parameters
NameTypeDescription
klassjclassThe class containing the field to watch
fieldjfieldIDThe field to watch

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_generate_field_modification_events. Use AddCapabilities.
JVMTI_ERROR_NOT_FOUNDThe designated field is not being watched for modifications.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.


Class

Class functions: Class types:


Get Loaded Classes

jvmtiError
GetLoadedClasses(jvmtiEnv* env,
            jint* class_count_ptr,
            jclass** classes_ptr)
Return an array of all classes loaded in the virtual machine. The number of classes in the array is returned via class_count_ptr, and the array itself via classes_ptr.

Array classes of all types (including arrays of primitive types) are included in the returned list. Primitive classes (for example,java.lang.Integer.TYPE) are not included in this list.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
class_count_ptrjint*On return, points to the number of classes.

Agent passes a pointer to a jint. On return, the jinthas been set.
classes_ptrjclass**On return, points to an array of references, one for each class.

Agent passes a pointer to a jclass*. On return, thejclass* points to a newly allocated array of size*class_count_ptr. The array should be freed withDeallocate. The objects returned by classes_ptr are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERclass_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERclasses_ptr is NULL.

Get Classloader Classes

jvmtiError
GetClassLoaderClasses(jvmtiEnv* env,
            jobject initiating_loader,
            jint* class_count_ptr,
            jclass** classes_ptr)
Returns an array of those classes for which this class loader has been recorded as an initiating loader. Each class in the returned array was created by this class loader, either by defining it directly or by delegation to another class loader. See Creation and Loading in the Java Virtual Machine Specification.

For JDK version 1.1 implementations that don't recognize the distinction between initiating and defining class loaders, this function should return all classes loaded in the virtual machine. The number of classes in the array is returned via class_count_ptr, and the array itself via classes_ptr.

This function may only be called during the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
initiating_loaderjobjectAn initiating class loader.

If initiating_loader is NULL, the classes initiated by the bootstrap loader will be returned.
class_count_ptrjint*On return, points to the number of classes.

Agent passes a pointer to a jint. On return, thejint has been set.
classes_ptrjclass**On return, points to an array of references, one for each class.

Agent passes a pointer to a jclass*. On return, thejclass* points to a newly allocated array of size*class_count_ptr. The array should be freed withDeallocate. The objects returned by classes_ptr are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERclass_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERclasses_ptr is NULL.

Get Class Signature

jvmtiError
GetClassSignature(jvmtiEnv* env,
            jclass klass,
            char** signature_ptr,
            char** generic_ptr)
For the class indicated by klass, return the JNI type signature and the generic signature of the class. For example, java.util.List is "Ljava/util/List;"and int[] is "[I" The returned name for primitive classes is the type signature character of the corresponding primitive type. For example,java.lang.Integer.TYPE is "I".

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
signature_ptrchar **On return, points to the JNI type signature of the class, encoded as a modified UTF-8 string.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If signature_ptr is NULL, the signature is not returned.
generic_ptrchar **On return, points to the generic signature of the class, encoded as a modified UTF-8 string. If there is no generic signature attribute for the class, then, on return, points to NULL.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If generic_ptr is NULL, the generic signature is not returned.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.

Get Class Status

jvmtiError
GetClassStatus(jvmtiEnv* env,
            jclass klass,
            jint* status_ptr)
Get the status of the class. Zero or more of the following bits can be set.
Class Status Flags
ConstantValueDescription
JVMTI_CLASS_STATUS_VERIFIED1Class bytecodes have been verified
JVMTI_CLASS_STATUS_PREPARED2Class preparation is complete
JVMTI_CLASS_STATUS_INITIALIZED4Class initialization is complete. Static initializer has been run.
JVMTI_CLASS_STATUS_ERROR8Error during initialization makes class unusable
JVMTI_CLASS_STATUS_ARRAY16Class is an array. If set, all other bits are zero.
JVMTI_CLASS_STATUS_PRIMITIVE32Class is a primitive class (for example, java.lang.Integer.TYPE). If set, all other bits are zero.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
status_ptrjint*On return, points to the current state of this class as one or more of the class status flags.

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERstatus_ptr is NULL.

Get Source File Name

jvmtiError
GetSourceFileName(jvmtiEnv* env,
            jclass klass,
            char** source_name_ptr)
For the class indicated by klass, return the source file name viasource_name_ptr. The returned string is a file name only and never contains a directory name.

For primitive classes (for example, java.lang.Integer.TYPE) and for arrays this function returns JVMTI_ERROR_ABSENT_INFORMATION.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_source_file_nameCan get the source file name of a class

Parameters
NameTypeDescription
klassjclassThe class to query.
source_name_ptrchar**On return, points to the class's source file name, encoded as a modified UTF-8 string.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_source_file_name. UseAddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATIONClass information does not include a source file name. This includes cases where the class is an array class or primitive class.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERsource_name_ptr is NULL.

Get Class Modifiers

jvmtiError
GetClassModifiers(jvmtiEnv* env,
            jclass klass,
            jint* modifiers_ptr)
For the class indicated by klass, return the access flags via modifiers_ptr. Access flags are defined in the Java Virtual Machine Specification.

If the class is an array class, then its public, private, and protected modifiers are the same as those of its component type. For arrays of primitives, this component type is represented by one of the primitive classes (for example, java.lang.Integer.TYPE).

If the class is a primitive class, its public modifier is always true, and its protected and private modifiers are always false.

If the class is an array class or a primitive class then its final modifier is always true and its interface modifier is always false. The values of its other modifiers are not determined by this specification.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
modifiers_ptrjint*On return, points to the current access flags of this class.

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERmodifiers_ptr is NULL.

Get Class Methods

jvmtiError
GetClassMethods(jvmtiEnv* env,
            jclass klass,
            jint* method_count_ptr,
            jmethodID** methods_ptr)
For the class indicated by klass, return a count of methods viamethod_count_ptr and a list of method IDs via methods_ptr. The method list contains constructors and static initializers as well as true methods. Only directly declared methods are returned (not inherited methods). An empty method list is returned for array classes and primitive classes (for example, java.lang.Integer.TYPE).

This function may only be called during the start or the live phase.

Capabilities
Required Functionality
Optional Features
CapabilityEffect
can_maintain_original_method_orderCan return methods in the order they occur in the class file

Parameters
NameTypeDescription
klassjclassThe class to query.
method_count_ptrjint*On return, points to the number of methods declared in this class.

Agent passes a pointer to a jint. On return, thejint has been set.
methods_ptrjmethodID**On return, points to the method ID array.

Agent passes a pointer to a jmethodID*. On return, the jmethodID* points to a newly allocated array of size *method_count_ptr. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_CLASS_NOT_PREPAREDklass is not prepared.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERmethod_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERmethods_ptr is NULL.

Get Class Fields

jvmtiError
GetClassFields(jvmtiEnv* env,
            jclass klass,
            jint* field_count_ptr,
            jfieldID** fields_ptr)
For the class indicated by klass, return a count of fields via field_count_ptrand a list of field IDs via fields_ptr. Only directly declared fields are returned (not inherited fields). Fields are returned in the order they occur in the class file. An empty field list is returned for array classes and primitive classes (for example, java.lang.Integer.TYPE). Use JNI to determine the length of an array.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
field_count_ptrjint*On return, points to the number of fields declared in this class.

Agent passes a pointer to a jint. On return, thejint has been set.
fields_ptrjfieldID**On return, points to the field ID array.

Agent passes a pointer to a jfieldID*. On return, thejfieldID* points to a newly allocated array of size*field_count_ptr. The array should be freed withDeallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_CLASS_NOT_PREPAREDklass is not prepared.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERfield_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERfields_ptr is NULL.

Get Implemented Interfaces

jvmtiError
GetImplementedInterfaces(jvmtiEnv* env,
            jclass klass,
            jint* interface_count_ptr,
            jclass** interfaces_ptr)
Return the direct super-interfaces of this class. For a class, this function returns the interfaces declared in its implements clause. For an interface, this function returns the interfaces declared in its extendsclause. An empty interface list is returned for array classes and primitive classes (for example, java.lang.Integer.TYPE).

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
interface_count_ptrjint*On return, points to the number of interfaces.

Agent passes a pointer to a jint. On return, thejint has been set.
interfaces_ptrjclass**On return, points to the interface array.

Agent passes a pointer to a jclass*. On return, thejclass* points to a newly allocated array of size*interface_count_ptr. The array should be freed withDeallocate. The objects returned by interfaces_ptr are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_CLASS_NOT_PREPAREDklass is not prepared.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERinterface_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERinterfaces_ptr is NULL.

Is Interface

jvmtiError
IsInterface(jvmtiEnv* env,
            jclass klass,
            jboolean* is_interface_ptr)
Determines whether a class object reference represents an interface. Thejboolean result is JNI_TRUE if the "class" is actually an interface, JNI_FALSEotherwise.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
is_interface_ptrjboolean*On return, points to the boolean result of this function.

Agent passes a pointer to a jboolean. On return, thejboolean has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERis_interface_ptr is NULL.

Is Array Class

jvmtiError
IsArrayClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_array_class_ptr)
Determines whether a class object reference represents an array. Thejboolean result is JNI_TRUE if the class is an array, JNI_FALSE otherwise.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
is_array_class_ptrjboolean*On return, points to the boolean result of this function.

Agent passes a pointer to a jboolean. On return, the jboolean has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERis_array_class_ptr is NULL.

Get Class Loader

jvmtiError
GetClassLoader(jvmtiEnv* env,
            jclass klass,
            jobject* classloader_ptr)
For the class indicated by klass, return via classloader_ptr a reference to the class loader for the class.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
classloader_ptrjobject*On return, points to the class loader that loaded this class. If the class was not created by a class loader or if the class loader is the bootstrap class loader, points to NULL.

Agent passes a pointer to a jobject. On return, thejobject has been set. The object returned byclassloader_ptr is a JNI local reference and must bemanaged.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERclassloader_ptr is NULL.

Get Source Debug Extension

jvmtiError
GetSourceDebugExtension(jvmtiEnv* env,
            jclass klass,
            char** source_debug_extension_ptr)
For the class indicated by klass, return the debug extension viasource_debug_extension_ptr. The returned string contains exactly the debug extension information present in the class file of klass.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_source_debug_extensionCan get the source debug extension of a class

Parameters
NameTypeDescription
klassjclassThe class to query.
source_debug_extension_ptrchar**On return, points to the class's debug extension, encoded as a modified UTF-8string.

Agent passes a pointer to a char*. On return, the char* points to a newly allocated array. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_source_debug_extension. UseAddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATIONClass information does not include a debug extension.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_NULL_POINTERsource_debug_extension_ptr is NULL.

Redefine Classes

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)
All classes given are redefined according to the definitions supplied. See the description of bytecode instrumentation for usage information.

An original version of method is considered equivalent to the new version if:
  • their bytecodes are the same except for indices into the constant pool and
  • the referenced constants are equal.
An original method version which is not equivalent to the new method version is called obsolete and is assigned a new methid ID; the original method ID now refers to the new method version. A method ID can be tested for obsolescence with IsMethodObsolete. The new method version will be used on new invokes. If a method has active stack frames, those active frames continue to run the bytecodes of the original method version. If resetting of stack frames is desired, use PopFrame to pop frames with obsolete method versions.

This function does not cause any initialization except that which would occur under the customary JVM semantics. In other words, redefining a class does not cause its initializers to be run. The values of static fields will remain as they were prior to the call.

Threads need not be suspended.

All breakpoints in the class are cleared.

All attributes are updated.

Instances of the redefined class are not affected -- fields retain their previous values. Tags on the instances are also unaffected.

In response to this call, the JVM TI event Class File Load Hook will be sent (if enabled), but no other JVM TI events will be sent.

The redefinition may change method bodies, the constant pool and attributes. The redefinition must not add, remove or rename fields or methods, change the signatures of methods, change modifiers, or change inheritance. These restrictions may be lifted in future versions. See the error return description below for information on error codes returned if an unsupported redefinition is attempted.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_redefine_classesCan redefine classes with RedefineClasses. Bytecodes of the original and redefined methods can be different. The constant pool and attributes can also be different.
Optional Features
can_redefine_any_classRedefineClasses can be called on any class (can_redefine_classes must also be set)

jvmtiClassDefinition - Class redefinition description
FieldTypeDescription
klassjclassClass object for this class
class_byte_countjintNumber of bytes defining class (below)
class_bytesconst unsigned char*Bytes defining class (in Class File Format of theJava Virtual Machine Specification)

Parameters
NameTypeDescription
class_countjintThe number of classes specified inclass_definitions
class_definitionsconstjvmtiClassDefinition*The array of new class definitions

Agent passes in an array of class_countelements of jvmtiClassDefinition.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capabilitycan_redefine_classes. UseAddCapabilities.
JVMTI_ERROR_NULL_POINTEROne of class_bytes isNULL.
JVMTI_ERROR_UNMODIFIABLE_CLASSAn element ofclass_definitions cannot be modified.
JVMTI_ERROR_INVALID_CLASSAn element ofclass_definitions is not a valid class.
JVMTI_ERROR_UNSUPPORTED_VERSIONA new class file has a version number not supported by this VM.
JVMTI_ERROR_INVALID_CLASS_FORMATA new class file is malformed (The VM would return aClassFormatError).
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITIONThe new class file definitions would lead to a circular definition (the VM would return aClassCircularityError).
JVMTI_ERROR_FAILS_VERIFICATIONThe class bytes fail verification.
JVMTI_ERROR_NAMES_DONT_MATCHThe class name defined in a new class file is different from the name in the old class object.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDEDA new class file would require adding a method.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGEDA new class version changes a field.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGEDA direct superclass is different for a new class version, or the set of directly implemented interfaces is different.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETEDA new class version does not declare a method declared in the old class version.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGEDA new class version has different modifiers.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGEDA method in the new class version has different modifiers than its counterpart in the old class version.
JVMTI_ERROR_ILLEGAL_ARGUMENTclass_count is less than0.
JVMTI_ERROR_NULL_POINTERclass_definitions is NULL.


Object

Object functions: Object types:


Get Object Size

jvmtiError
GetObjectSize(jvmtiEnv* env,
            jobject object,
            jlong* size_ptr)
For the object indicated by object, return via size_ptr the size of the object. This size is an implementation-specific approximation of the amount of storage consumed by this object. It may include some or all of the object's overhead, and thus is useful for comparison within an implementation but not between implementations. The estimate may change during a single invocation of the JVM.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
objectjobjectThe object to query.
size_ptrjlong*On return, points to the object's size in bytes.

Agent passes a pointer to a jlong. On return, the jlong has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_OBJECTobject is not an object.
JVMTI_ERROR_NULL_POINTERsize_ptr is NULL.

Get Object Hash Code

jvmtiError
GetObjectHashCode(jvmtiEnv* env,
            jobject object,
            jint* hash_code_ptr)
For the object indicated by object, return via hash_code_ptr a hash code. This hash code could be used to maintain a hash table of object references, however, on some implementations this can cause significant performance impacts--in most cases tags will be a more efficient means of associating information with objects. This function guarantees the same hash code value for a particular object throughout its life

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
objectjobjectThe object to query.
hash_code_ptrjint*On return, points to the object's hash code.

Agent passes a pointer to a jint. On return, the jinthas been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_OBJECTobject is not an object.
JVMTI_ERROR_NULL_POINTERhash_code_ptr is NULL.

Get Object Monitor Usage

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)
Get information about the object's monitor. The fields of thejvmtiMonitorUsage structure are filled in with information about usage of the monitor.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_monitor_infoCan GetObjectMonitorUsage

jvmtiMonitorUsage - Object monitor usage information
FieldTypeDescription
ownerjthreadThe thread owning this monitor, or NULL if unused
entry_countjintThe number of times the owning thread has entered the monitor
waiter_countjintThe number of threads waiting to own this monitor
waitersjthread*The waiter_count waiting threads
notify_waiter_countjintThe number of threads waiting to be notified by this monitor
notify_waitersjthread*The notify_waiter_count threads waiting to be notified

Parameters
NameTypeDescription
objectjobjectThe object to query.
info_ptrjvmtiMonitorUsage*On return, filled with monitor information for the specified object.

Agent passes a pointer to a jvmtiMonitorUsage. On return, the jvmtiMonitorUsage has been set. The object returned in the field owner ofjvmtiMonitorUsage is a JNI local reference and must be managed. The pointer returned in the fieldwaiters of jvmtiMonitorUsage is a newly allocated array. The array should be freed with Deallocate. The objects returned in the field waiters ofjvmtiMonitorUsage are JNI local references and must be managed. The pointer returned in the fieldnotify_waiters of jvmtiMonitorUsage is a newly allocated array. The array should be freed with Deallocate. The objects returned in the field notify_waiters ofjvmtiMonitorUsage are JNI local references and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_monitor_info. UseAddCapabilities.
JVMTI_ERROR_INVALID_OBJECTobject is not an object.
JVMTI_ERROR_NULL_POINTERinfo_ptr is NULL.


Field

Field functions:


Get Field Name (and Signature)

jvmtiError
GetFieldName(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)
For the field indicated by klass and field, return the field name via name_ptrand field signature via signature_ptr.

The field signatures are defined in the JNI Specification and in the The Java Virtual Machine Specification where they are referred to as Field Descriptors.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class of the field to query.
fieldjfieldIDThe field to query.
name_ptrchar **On return, points to the field name, encoded as amodified UTF-8 string.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If name_ptr is NULL, the name is not returned.
signature_ptrchar **On return, points to the field signature, encoded as amodified UTF-8 string.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If signature_ptr is NULL, the signature is not returned.
generic_ptrchar **On return, points to the generic signature of the field, encoded as a modified UTF-8 string. If there is no generic signature attribute for the field, then, on return, points to NULL.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If generic_ptr is NULL, the generic signature is not returned.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.

Get Field Declaring Class

jvmtiError
GetFieldDeclaringClass(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jclass* declaring_class_ptr)
For the field indicated by klass and field return the class that defined it via declaring_class_ptr. The declaring class will either be klass, a superclass, or an implemented interface.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
fieldjfieldIDThe field to query.
declaring_class_ptrjclass*On return, points to the declaring class

Agent passes a pointer to a jclass. On return, thejclass has been set. The object returned bydeclaring_class_ptr is a JNI local reference and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.
JVMTI_ERROR_NULL_POINTERdeclaring_class_ptr is NULL.

Get Field Modifiers

jvmtiError
GetFieldModifiers(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jint* modifiers_ptr)
For the field indicated by klass and field return the access flags viamodifiers_ptr. Access flags are defined in the Java Virtual Machine Specification .

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
klassjclassThe class to query.
fieldjfieldIDThe field to query.
modifiers_ptrjint*On return, points to the access flags.

Agent passes a pointer to a jint. On return, the jinthas been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.
JVMTI_ERROR_NULL_POINTERmodifiers_ptr is NULL.

Is Field Synthetic

jvmtiError
IsFieldSynthetic(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jboolean* is_synthetic_ptr)
For the field indicated by klass and field, return a value indicating whether the field is synthetic via is_synthetic_ptr. Synthetic fields are generated by the compiler but not present in the original source code.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_synthetic_attributeCan test if a field or method is synthetic -IsFieldSynthetic and IsMethodSynthetic

Parameters
NameTypeDescription
klassjclassThe class of the field to query.
fieldjfieldIDThe field to query.
is_synthetic_ptrjboolean*On return, points to the boolean result of this function.

Agent passes a pointer to a jboolean. On return, thejboolean has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_synthetic_attribute. UseAddCapabilities.
JVMTI_ERROR_INVALID_CLASSklass is not a class object or the class has been unloaded.
JVMTI_ERROR_INVALID_FIELDIDfield is not a jfieldID.
JVMTI_ERROR_NULL_POINTERis_synthetic_ptr is NULL.


Method

Method functions: Method types:


Get Method Name (and Signature)

jvmtiError
GetMethodName(jvmtiEnv* env,
            jmethodID method,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)
For the method indicated by method, return the method name via name_ptr and method signature via signature_ptr.

The method signatures are defined in the JNI Specification and in the The Java Virtual Machine Specification where they are referred to as Method Descriptors. Note this is different than method signatures as defined in the Java Language Specification.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
name_ptrchar **On return, points to the method name, encoded as amodified UTF-8 string.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If name_ptr is NULL, the name is not returned.
signature_ptrchar **On return, points to the method signature, encoded as a modified UTF-8 string.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If signature_ptr is NULL, the signature is not returned.
generic_ptrchar **On return, points to the generic signature of the method, encoded as a modified UTF-8 string. If there is no generic signature attribute for the method, then, on return, points to NULL.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate. If generic_ptr is NULL, the generic signature is not returned.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.

Get Method Declaring Class

jvmtiError
GetMethodDeclaringClass(jvmtiEnv* env,
            jmethodID method,
            jclass* declaring_class_ptr)
For the method indicated by method, return the class that defined it viadeclaring_class_ptr.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
declaring_class_ptrjclass*On return, points to the declaring class

Agent passes a pointer to a jclass. On return, thejclass has been set. The object returned bydeclaring_class_ptr is a JNI local reference and must be managed.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NULL_POINTERdeclaring_class_ptr is NULL.

Get Method Modifiers

jvmtiError
GetMethodModifiers(jvmtiEnv* env,
            jmethodID method,
            jint* modifiers_ptr)
For the method indicated by method, return the access flags via modifiers_ptr. Access flags are defined in the Java Virtual Machine Specification .

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
modifiers_ptrjint*On return, points to the access flags.

Agent passes a pointer to a jint. On return, the jinthas been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NULL_POINTERmodifiers_ptr is NULL.

Get Max Locals

jvmtiError
GetMaxLocals(jvmtiEnv* env,
            jmethodID method,
            jint* max_ptr)
For the method indicated by method, return the number of local variable slots used by the method, including the local variables used to pass parameters to the method on its invocation.

See max_locals in the Code Attribute section of the The JavaTM Virtual Machine Specification.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
max_ptrjint*On return, points to the maximum number of local slots

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NATIVE_METHODmethod is a native method.
JVMTI_ERROR_NULL_POINTERmax_ptr is NULL.

Get Arguments Size

jvmtiError
GetArgumentsSize(jvmtiEnv* env,
            jmethodID method,
            jint* size_ptr)
For the method indicated by method, return via max_ptr the number of local variable slots used by the method's arguments. Note that two-word arguments use two slots.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
size_ptrjint*On return, points to the number of argument slots

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NATIVE_METHODmethod is a native method.
JVMTI_ERROR_NULL_POINTERsize_ptr is NULL.

Get Line Number Table

typedef struct {
    jlocation start_location;
    jint line_number;
} jvmtiLineNumberEntry;
jvmtiError
GetLineNumberTable(jvmtiEnv* env,
            jmethodID method,
            jint* entry_count_ptr,
            jvmtiLineNumberEntry** table_ptr)
For the method indicated by method, return a table of source line number entries. The size of the table is returned via entry_count_ptr and the table itself is returned via table_ptr.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_line_numbersCan get the line number table of a method

jvmtiLineNumberEntry - Line number table entry
FieldTypeDescription
start_locationjlocationthe jlocation where the line begins
line_numberjintthe line number

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
entry_count_ptrjint*On return, points to the number of entries in the table

Agent passes a pointer to a jint. On return, the jint has been set.
table_ptrjvmtiLineNumberEntry**On return, points to the line number table pointer.

Agent passes a pointer to ajvmtiLineNumberEntry*. On return, thejvmtiLineNumberEntry* points to a newly allocated array of size *entry_count_ptr. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_line_numbers. UseAddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATIONClass information does not include line numbers.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NATIVE_METHODmethod is a native method.
JVMTI_ERROR_NULL_POINTERentry_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERtable_ptr is NULL.

Get Method Location

jvmtiError
GetMethodLocation(jvmtiEnv* env,
            jmethodID method,
            jlocation* start_location_ptr,
            jlocation* end_location_ptr)
For the method indicated by method, return the beginning and ending addresses through start_location_ptr and end_location_ptr. In a conventional byte code indexing scheme, start_location_ptr will always point to zero andend_location_ptr will always point to the byte code count minus one.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
start_location_ptrjlocation*On return, points to the first location, or -1 if location information is not available. If the information is available and GetJLocationFormatreturns JVMTI_JLOCATION_JVMBCI then this will always be zero.

Agent passes a pointer to a jlocation. On return, the jlocation has been set.
end_location_ptrjlocation*On return, points to the last location, or -1 if location information is not available.

Agent passes a pointer to a jlocation. On return, the jlocation has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ABSENT_INFORMATIONClass information does not include method sizes.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NATIVE_METHODmethod is a native method.
JVMTI_ERROR_NULL_POINTERstart_location_ptr is NULL.
JVMTI_ERROR_NULL_POINTERend_location_ptr is NULL.

Get Local Variable Table

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)
Return local variable information.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_access_local_variablesCan set and get local variables

jvmtiLocalVariableEntry - Local variable table entry
FieldTypeDescription
start_locationjlocationThe code array index where the local variable is first valid (that is, where it must have a value).
lengthjintThe length of the valid section for this local variable. The last code array index where the local variable is valid is start_location + length.
namechar*The local variable name, encoded as a modified UTF-8 string.
signaturechar*The local variable's type signature, encoded as amodified UTF-8 string. The signature format is the same as that defined in The Java Virtual Machine Specification for Field Descriptors.
generic_signaturechar*The local variable's generic signature, encoded as a modified UTF-8 string. The value of this field will be NULL for any local variable which does not have a generic type.
slotjintThe local variable's slot. See Local Variables.

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
entry_count_ptrjint*On return, points to the number of entries in the table

Agent passes a pointer to a jint. On return, the jint has been set.
table_ptrjvmtiLocalVariableEntry**On return, points to an array of local variable table entries.

Agent passes a pointer to ajvmtiLocalVariableEntry*. On return, thejvmtiLocalVariableEntry* points to a newly allocated array of size *entry_count_ptr. The array should be freed withDeallocate. The pointers returned in the field name of jvmtiLocalVariableEntry are newly allocated arrays. The arrays should be freed with Deallocate. The pointers returned in the field signatureof jvmtiLocalVariableEntry are newly allocated arrays. The arrays should be freed with Deallocate. The pointers returned in the field generic_signature ofjvmtiLocalVariableEntry are newly allocated arrays. The arrays should be freed withDeallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_access_local_variables. UseAddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATIONClass information does not include local variable information.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NATIVE_METHODmethod is a native method.
JVMTI_ERROR_NULL_POINTERentry_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERtable_ptr is NULL.

Get Bytecodes

jvmtiError
GetBytecodes(jvmtiEnv* env,
            jmethodID method,
            jint* bytecode_count_ptr,
            unsigned char** bytecodes_ptr)
For the method indicated by method, return the byte codes that implement the method. The number of bytecodes is returned via bytecode_count_ptr. The byte codes themselves are returned via bytecodes_ptr.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_bytecodesCan get bytecodes of a method GetBytecodes

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
bytecode_count_ptrjint*On return, points to the length of the byte code array

Agent passes a pointer to a jint. On return, thejint has been set.
bytecodes_ptrunsigned char**On return, points to the pointer to the byte code array

Agent passes a pointer to a unsigned char*. On return, the unsigned char* points to a newly allocated array of size *bytecode_count_ptr. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_bytecodes. Use AddCapabilities.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NATIVE_METHODmethod is a native method.
JVMTI_ERROR_NULL_POINTERbytecode_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERbytecodes_ptr is NULL.

Is Method Native

jvmtiError
IsMethodNative(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_native_ptr)
For the method indicated by method, return a value indicating whether the method is native via is_native_ptr

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
is_native_ptrjboolean*On return, points to the boolean result of this function.

Agent passes a pointer to a jboolean. On return, thejboolean has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NULL_POINTERis_native_ptr is NULL.

Is Method Synthetic

jvmtiError
IsMethodSynthetic(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_synthetic_ptr)
For the method indicated by method, return a value indicating whether the method is synthetic via is_synthetic_ptr. Synthetic methods are generated by the compiler but not present in the original source code.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_synthetic_attributeCan test if a field or method is synthetic -IsFieldSynthetic and IsMethodSynthetic

Parameters
NameTypeDescription
methodjmethodIDThe method to query.
is_synthetic_ptrjboolean*On return, points to the boolean result of this function.

Agent passes a pointer to a jboolean. On return, thejboolean has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_synthetic_attribute. UseAddCapabilities.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NULL_POINTERis_synthetic_ptr is NULL.

Is Method Obsolete

jvmtiError
IsMethodObsolete(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_obsolete_ptr)
Determine if a method ID refers to an obsolete method version. SeeRedefineClasses for details.

This function may only be called during the start or the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_redefine_classesCan redefine classes with RedefineClasses. Bytecodes of the original and redefined methods can be different. The constant pool and attributes can also be different.

Parameters
NameTypeDescription
methodjmethodIDThe method ID to query.
is_obsolete_ptrjboolean*On return, points to the boolean result of this function.

Agent passes a pointer to a jboolean. On return, thejboolean has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_redefine_classes. UseAddCapabilities.
JVMTI_ERROR_INVALID_METHODIDmethod is not a jmethodID.
JVMTI_ERROR_NULL_POINTERis_obsolete_ptr is NULL.


Raw Monitor

Raw Monitor functions:


Create Raw Monitor

jvmtiError
CreateRawMonitor(jvmtiEnv* env,
            const char* name,
            jrawMonitorID* monitor_ptr)
Create a raw monitor.

This function may only be called during the OnLoad or the live phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
nameconst char*A name to identify the monitor, encoded as amodified UTF-8 string.

Agent passes in an array of char.
monitor_ptrjrawMonitorID*On return, points to the created monitor.

Agent passes a pointer to a jrawMonitorID. On return, the jrawMonitorID has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERname is NULL.
JVMTI_ERROR_NULL_POINTERmonitor_ptr is NULL.

Destroy Raw Monitor

jvmtiError
DestroyRawMonitor(jvmtiEnv* env,
            jrawMonitorID monitor)
Destroy the raw monitor. If the monitor being destroyed has been entered by this thread, it will be exited before it is destroyed. If the monitor being destroyed has been entered by another thread, an error will be returned and the monitor will not be destroyed.

This function may only be called during the OnLoad or the live phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
monitorjrawMonitorIDThe monitor

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_MONITOR_OWNERNot monitor owner
JVMTI_ERROR_INVALID_MONITORmonitor is not a jrawMonitorID.

Raw Monitor Enter

jvmtiError
RawMonitorEnter(jvmtiEnv* env,
            jrawMonitorID monitor)
Gain exclusive ownership of a raw monitor. The same thread may enter a monitor more then once. The thread must exit the monitor the same number of times as it is entered. If a monitor is entered during OnLoad (before attached threads exist) and has not exited when attached threads come into existence, the enter is considered to have occurred on the main thread.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
monitorjrawMonitorIDThe monitor

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_MONITORmonitor is not a jrawMonitorID.

Raw Monitor Exit

jvmtiError
RawMonitorExit(jvmtiEnv* env,
            jrawMonitorID monitor)
Release exclusive ownership of a raw monitor.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
monitorjrawMonitorIDThe monitor

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_MONITOR_OWNERNot monitor owner
JVMTI_ERROR_INVALID_MONITORmonitor is not a jrawMonitorID.

Raw Monitor Wait

jvmtiError
RawMonitorWait(jvmtiEnv* env,
            jrawMonitorID monitor,
            jlong millis)
Wait for notification of the raw monitor.

Causes the current thread to wait until either another thread callsRawMonitorNotify or RawMonitorNotifyAll for the specified raw monitor, or the specified timeout has elapsed.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
monitorjrawMonitorIDThe monitor
millisjlongThe timeout, in milliseconds. If the timeout is zero, then real time is not taken into consideration and the thread simply waits until notified.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_MONITOR_OWNERNot monitor owner
JVMTI_ERROR_INTERRUPTWait was interrupted, try again
JVMTI_ERROR_INVALID_MONITORmonitor is not a jrawMonitorID.

Raw Monitor Notify

jvmtiError
RawMonitorNotify(jvmtiEnv* env,
            jrawMonitorID monitor)
Notify a single thread waiting on the raw monitor.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
monitorjrawMonitorIDThe monitor

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_MONITOR_OWNERNot monitor owner
JVMTI_ERROR_INVALID_MONITORmonitor is not a jrawMonitorID.

Raw Monitor Notify All

jvmtiError
RawMonitorNotifyAll(jvmtiEnv* env,
            jrawMonitorID monitor)
Notify all threads waiting on the raw monitor.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
monitorjrawMonitorIDThe monitor

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_MONITOR_OWNERNot monitor owner
JVMTI_ERROR_INVALID_MONITORmonitor is not a jrawMonitorID.


JNI Function Interception

JNI Function Interception functions: Provides the ability to intercept and resend Java Native Interface (JNI) function calls by manipulating the JNI function table. See  JNI Functions  in the  Java Native Interface Specification .

The following example illustrates intercepting the  NewGlobalRef  JNI call in order to count reference creation.
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();
   }
}
      
Sometime after  myInit  is called the user's JNI code is executed which makes the call to create a new global reference. Instead of going to the normal JNI implementation the call goes to  myNewGlobalRef . Note that a copy of the original function table is kept so that the normal JNI function can be called after the data is collected. Note also that any JNI functions which are not overwritten will behave normally.


Set JNI Function Table

jvmtiError
SetJNIFunctionTable(jvmtiEnv* env,
            const jniNativeInterface* function_table)
Set the JNI function table in all current and future JNI environments. As a result, all future JNI calls are directed to the specified functions. UseGetJNIFunctionTable to get the function table to pass. The table is copied--changes to the local copy of the table have no effect. This function affects only the function table, all other aspects of the environment are unaffected. See the examples above.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
function_tableconstjniNativeInterface *Points to the new JNI function table.

Agent passes in a pointer tojniNativeInterface.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERfunction_table is NULL.

Get JNI Function Table

jvmtiError
GetJNIFunctionTable(jvmtiEnv* env,
            jniNativeInterface** function_table)
Get the JNI function table. The JNI function table is copied into allocated memory. If SetJNIFunctionTable has been called, the modified (not the original) function table is returned. Only the function table is copied, no other aspects of the environment are copied. See the examples above.

This function may only be called during the start or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
function_tablejniNativeInterface**On return, *function_table points a newly allocated copy of the JNI function table.

Agent passes a pointer to a jniNativeInterface*. On return, the jniNativeInterface* points to a newly allocated array. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERfunction_table is NULL.


Event Management

Event Management functions:


Set Event Callbacks

jvmtiError
SetEventCallbacks(jvmtiEnv* env,
            const jvmtiEventCallbacks* callbacks,
            jint size_of_callbacks)
Set the functions to be called for each event. The callbacks are specified by supplying a replacement function table. The function table is copied--changes to the local copy of the table have no effect. This is an atomic action, all callbacks are set at once. No events are sent before this function is called. When an entry is NULL or when the event is beyondsize_of_callbacks no event is sent. Details on events are described later in this document. An event must be enabled and have a callback in order to be sent--the order in which this function and SetEventNotificationMode are called does not affect the result.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
callbacksconstjvmtiEventCallbacks*The new event callbacks.

Agent passes in a pointer tojvmtiEventCallbacks. If callbacks is NULL, remove the existing callbacks.
size_of_callbacksjintsizeof(jvmtiEventCallbacks)--for version compatibility.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTsize_of_callbacks is less than 0.

Set Event Notification Mode

typedef enum {
    JVMTI_ENABLE = 1,
    JVMTI_DISABLE = 0
} jvmtiEventMode;
jvmtiError
SetEventNotificationMode(jvmtiEnv* env,
            jvmtiEventMode mode,
            jvmtiEvent event_type,
            jthread event_thread,
             ...)
Control the generation of events.
Event Enable/Disable (jvmtiEventMode)
ConstantValueDescription
JVMTI_ENABLE1If mode is JVMTI_ENABLE, the event event_type will be enabled
JVMTI_DISABLE0If mode is JVMTI_DISABLE, the event event_type will be disabled
If thread is NULL, the event is enabled or disabled globally; otherwise, it is enabled or disabled for a particular thread. An event is generated for a particular thread if it is enabled either at the thread or global levels.

See below for information on specific events.

The following events cannot be controlled at the thread level through this function.

Initially, no events are enabled at either the thread level or the global level.

Any needed capabilities (see Event Enabling Capabilities below) must be possessed before calling this function.

Details on events are described below.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality
Event Enabling Capabilities
CapabilityEvents
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 

Parameters
NameTypeDescription
modejvmtiEventModeJVMTI_ENABLE or JVMTI_DISABLE
event_typejvmtiEventthe event to control
event_threadjthreadThe thread to control

If event_thread is NULL, event is controlled at the global level.
......for future expansion

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_INVALID_THREADevent_thread is non-NULL and is not a valid thread.
JVMTI_ERROR_THREAD_NOT_ALIVEevent_thread is non-NULL and is not live (has not been started or is now dead).
JVMTI_ERROR_ILLEGAL_ARGUMENTthread level control was attempted on events which do not permit thread level control.
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe Required Event Enabling Capability is not possessed.
JVMTI_ERROR_ILLEGAL_ARGUMENTmode is not a jvmtiEventMode.
JVMTI_ERROR_INVALID_EVENT_TYPEevent_type is not a jvmtiEvent.

Generate Events

jvmtiError
GenerateEvents(jvmtiEnv* env,
            jvmtiEvent event_type)
Generate events to represent the current state of the VM. For example, ifevent_type is JVMTI_EVENT_COMPILED_METHOD_LOAD, a CompiledMethodLoad event will be sent for each currently compiled method. Methods that were loaded and now have been unloaded are not sent. The history of what events have previous been sent does not effect what events are sent--all currently compiled methods will be sent each time this method is called.

This function is useful when events may have been missed due to the agent attaching after program execution begins, this function generates the missed events.

Attempts to execute Java programming language code or JNI functions may be paused until this function returns - so neither should be called from the thread sending the event. This function returns only after the missed events have been sent, processed and have returned. The event may be sent on a different thread than the thread on which the event occurred. The callback for the event must be set with SetEventCallbacks and the event must be enabled with SetEventNotificationMode or the events will not occur. If the VM no longer has the information to generate some or all of the requested events, the events are simply not sent - no error is returned.

Only the following events are supported:

This function may only be called during the live phase.

Capabilities
Required Functionality
Optional Features
CapabilityEffect
can_generate_compiled_method_load_eventsCan generate events when a method is compiled or unloaded

Parameters
NameTypeDescription
event_typejvmtiEventThe type of event to generate. Must be one of these:

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYevent_type is JVMTI_EVENT_COMPILED_METHOD_LOAD andcan_generate_compiled_method_load_events is false.
JVMTI_ERROR_ILLEGAL_ARGUMENTevent_type is other thanJVMTI_EVENT_COMPILED_METHOD_LOAD orJVMTI_EVENT_DYNAMIC_CODE_GENERATED.
JVMTI_ERROR_INVALID_EVENT_TYPEevent_type is not a jvmtiEvent.


Extension Mechanism

Extension Mechanism functions: Extension Mechanism function types: Extension Mechanism types: These functions allow a JVM   TI implementation to provide functions and events beyond those defined in this specification.

Both extension functions and extension events have parameters each of which has a 'type' and 'kind' chosen from the following tables:
Extension Function/Event Parameter Types (jvmtiParamTypes)
ConstantValueDescription
JVMTI_TYPE_JBYTE101Java programming language primitive type - byte. JNI type jbyte.
JVMTI_TYPE_JCHAR102Java programming language primitive type - char. JNI type jchar.
JVMTI_TYPE_JSHORT103Java programming language primitive type - short. JNI type jshort.
JVMTI_TYPE_JINT104Java programming language primitive type - int. JNI type jint.
JVMTI_TYPE_JLONG105Java programming language primitive type - long. JNI type jlong.
JVMTI_TYPE_JFLOAT106Java programming language primitive type - float. JNI type jfloat.
JVMTI_TYPE_JDOUBLE107Java programming language primitive type - double. JNI type jdouble.
JVMTI_TYPE_JBOOLEAN108Java programming language primitive type -boolean. JNI type jboolean.
JVMTI_TYPE_JOBJECT109Java programming language object type -java.lang.Object. JNI type jobject. Returned values are JNI local references and must be managed.
JVMTI_TYPE_JTHREAD110Java programming language object type -java.lang.Thread. JVM TI type jthread. Returned values are JNI local references and must be managed.
JVMTI_TYPE_JCLASS111Java programming language object type -java.lang.Class. JNI type jclass. Returned values are JNI local references and must be managed.
JVMTI_TYPE_JVALUE112Union of all Java programming language primitive and object types - JNI type jvalue. Returned values which represent object types are JNI local references and must be managed.
JVMTI_TYPE_JFIELDID113Java programming language field identifier - JNI type jfieldID.
JVMTI_TYPE_JMETHODID114Java programming language method identifier - JNI type jmethodID.
JVMTI_TYPE_CCHAR115C programming language type - char.
JVMTI_TYPE_CVOID116C programming language type - void.
JVMTI_TYPE_JNIENV117JNI environment - JNIEnv. Should be used with the correct jvmtiParamKind to make it a pointer type.
Extension Function/Event Parameter Kinds (jvmtiParamKind)
ConstantValueDescription
JVMTI_KIND_IN91Ingoing argument - foo.
JVMTI_KIND_IN_PTR92Ingoing pointer argument - const foo*.
JVMTI_KIND_IN_BUF93Ingoing array argument - const foo*.
JVMTI_KIND_ALLOC_BUF94Outgoing allocated array argument - foo**. Free with Deallocate.
JVMTI_KIND_ALLOC_ALLOC_BUF95Outgoing allocated array of allocated arrays argument - foo***. Free with Deallocate.
JVMTI_KIND_OUT96Outgoing argument - foo*.
JVMTI_KIND_OUT_BUF97Outgoing array argument (pre-allocated by agent) - foo*. Do not Deallocate.
typedef struct {
    char* name;
    jvmtiParamKind kind;
    jvmtiParamTypes base_type;
    jboolean null_ok;
} jvmtiParamInfo;

jvmtiParamInfo - Extension Function/Event Parameter Info
FieldTypeDescription
namechar*The parameter name, encoded as a modified UTF-8 string
kindjvmtiParamKindThe kind of the parameter - type modifiers
base_typejvmtiParamTypesThe base type of the parameter - modified by kind
null_okjbooleanIs a NULL argument permitted? Applies only to pointer and object types.


Extension Function

typedef jvmtiError (JNICALL *jvmtiExtensionFunction)
    (jvmtiEnv* jvmti_env, 
      ...);
This is the implementation-specific extension function.

Parameters
NameTypeDescription
jvmti_envjvmtiEnv*The JVM TI environment is the only fixed parameter for extension functions.
......The extension function-specific parameters

Get Extension Functions

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)
Returns the set of extension functions.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

jvmtiExtensionFunctionInfo - Extension Function Info
FieldTypeDescription
funcjvmtiExtensionFunctionThe actual function to call
idchar*The identifier for the extension function, encoded as a modified UTF-8string. Uses package name conventions. For example, com.sun.hotspot.bar
short_descriptionchar*A one sentence description of the function, encoded as a modified UTF-8string.
param_countjintThe number of parameters excludingjvmtiEnv *jvmti_env
paramsjvmtiParamInfo *Array of param_count parameters (jvmtiEnv *jvmti_env excluded)
error_countjintThe number of possible error returns (excluding universal errors)
errorsjvmtiError *Array of error_count possible errors

Parameters
NameTypeDescription
extension_count_ptrjint*On return, points to the number of extension functions

Agent passes a pointer to a jint. On return, the jint has been set.
extensionsjvmtiExtensionFunctionInfo**Returns an array of extension function info, one per function

Agent passes a pointer to ajvmtiExtensionFunctionInfo*. On return, thejvmtiExtensionFunctionInfo* points to a newly allocated array of size*extension_count_ptr. The array should be freed with Deallocate. The pointers returned in the field id of jvmtiExtensionFunctionInfoare newly allocated arrays. The arrays should be freed withDeallocate. The pointers returned in the field short_description ofjvmtiExtensionFunctionInfo are newly allocated arrays. The arrays should be freed with Deallocate. The pointers returned in the field params ofjvmtiExtensionFunctionInfo are newly allocated arrays. The arrays should be freed with Deallocate. The pointers returned in the field name of jvmtiParamInfo are newly allocated arrays. The arrays should be freed withDeallocate. The pointers returned in the field errors ofjvmtiExtensionFunctionInfo are newly allocated arrays. The arrays should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERextension_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERextensions is NULL.

Get Extension Events

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)
Returns the set of extension events.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

jvmtiExtensionEventInfo - Extension Event Info
FieldTypeDescription
extension_event_indexjintThe identifying index of the event
idchar*The identifier for the extension event, encoded as a modified UTF-8 string. Uses package name conventions. For example,com.sun.hotspot.bar
short_descriptionchar*A one sentence description of the event, encoded as a modified UTF-8 string.
param_countjintThe number of parameters excluding jvmtiEnv *jvmti_env
paramsjvmtiParamInfo*Array of param_count parameters (jvmtiEnv *jvmti_env excluded)

Parameters
NameTypeDescription
extension_count_ptrjint*On return, points to the number of extension events

Agent passes a pointer to a jint. On return, the jint has been set.
extensionsjvmtiExtensionEventInfo**Returns an array of extension event info, one per event

Agent passes a pointer to ajvmtiExtensionEventInfo*. On return, thejvmtiExtensionEventInfo* points to a newly allocated array of size*extension_count_ptr. The array should be freed with Deallocate. The pointers returned in the field id ofjvmtiExtensionEventInfo are newly allocated arrays. The arrays should be freed with Deallocate. The pointers returned in the fieldshort_description ofjvmtiExtensionEventInfo are newly allocated arrays. The arrays should be freed with Deallocate. The pointers returned in the field paramsof jvmtiExtensionEventInfo are newly allocated arrays. The arrays should be freed with Deallocate. The pointers returned in the field nameof jvmtiParamInfo are newly allocated arrays. The arrays should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERextension_count_ptr is NULL.
JVMTI_ERROR_NULL_POINTERextensions is NULL.

Extension Event

typedef void (JNICALL *jvmtiExtensionEvent)
    (jvmtiEnv* jvmti_env, 
      ...);
This is the implementation-specific event. The event handler is set withSetExtensionEventCallback.

Event handlers for extension events must be declared varargs to match this definition. Failure to do so could result in calling convention mismatch and undefined behavior on some platforms.

For example, if the jvmtiParamInfo returned by GetExtensionEvents indicates that there is a jint parameter, the event handler should be declared:
    void JNICALL myHandler(jvmtiEnv* jvmti_env, jint myInt, ...)
Note the terminal "..." which indicates varargs.

Parameters
NameTypeDescription
jvmti_envjvmtiEnv*The JVM TI environment is the only fixed parameter for extension events.
......The extension event-specific parameters

Set Extension Event Callback

jvmtiError
SetExtensionEventCallback(jvmtiEnv* env,
            jint extension_event_index,
            jvmtiExtensionEvent callback)
Sets the callback function for an extension event and enables the event. Or, if the callback is NULL, disables the event. Note that unlike standard events, setting the callback and enabling the event are a single operation.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
extension_event_indexjintIdentifies which callback to set. This index is the extension_event_index field ofjvmtiExtensionEventInfo.
callbackjvmtiExtensionEventIf callback is non-NULL, set callback to be the event callback function and enable the event.

If callback is NULL, disable the event.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTextension_event_index is not an extension_event_indexreturned by GetExtensionEvents


Capability

Capability functions: Capability types: The capabilities functions allow you to change the functionality available to JVM   TI--that is, which JVM   TI functions can be called, what events can be generated, and what functionality these events and functions can provide.

The "Capabilities" section of each function and event describe which capabilities, if any, they are associated with. "Required Functionality" means it is available for use and no capabilities must be added to use it. "Optional Functionality" means the agent must possess the capability before it can be used. To possess a capability, the agent must  add the capability . "Optional Features" describe capabilities which, if added, extend the feature set.

The potentially available capabilities of each JVM   TI implementation are different. Depending on the implementation, a capability:
  • may never be added
  • may be added in either the OnLoad or live phase in any environment
  • may be added only during the OnLoad phase
  • may be possessed by only one environment at a time
  • may be possessed by only one environment at a time, and only during the OnLoadphase
  • and so on ...
Frequently, the addition of a capability may incur a cost in execution speed, start up time, and/or memory footprint. Note that the overhead of using a capability is completely different than the overhead of possessing a capability. Take single stepping as an example. When single stepping is on (that is, when the event is enabled and thus actively sending events) the overhead of sending and processing an event on each instruction is huge in any implementation. However, the overhead of possessing the capability may be small or large, depending on the implementation. Also, when and if a capability is potentially available depends on the implementation. Some examples:
  • One VM might perform all execution by compiling bytecodes into native code and be unable to generate single step instructions. In this implementation the capability can not be added.
  • Another VM may be able to switch execution to a single stepping interpreter at any time. In this implementation, having the capability has no overhead and could be added at any time.
  • Yet another VM might be able to choose a bytecode compiling or single stepping capable interpreted execution engine at start up, but be unable to switch between them. In this implementation the capability would need to be added during the OnLoad phase (before bytecode execution begins) and would have a large impact on execution speed even if single stepping was never used.
  • Still another VM might be able to add an "is single stepping on" check into compiled bytecodes or a generated interpreter. Again in this implementation the capability would need to be added during the OnLoad phase but the overhead (a test and branch on each instruction) would be considerably less.

Each JVM   TI  environment  has its own set of capabilities. Initially, that set is empty. Any desired capability must be added. If possible, capabilities should be added during the  OnLoad  phase. For most virtual machines certain capabilities require special set up for the virtual machine and this set up must happen during the  OnLoad  phase, before the virtual machine begins execution. Once a capability is added, it can only be removed if explicitly relinquished by the environment.

The agent can,  determine what capabilities this VM can potentially provide add the capabilities to be used release capabilities which are no longer needed , and examine the currently available capabilities .
Capability Examples
For example, a freshly started agent (in the  OnLoad  function) wants to enable all possible capabilities. Note that, in general, this is not advisable as the agent may suffer a performance penalty for functionality it is not using. The code might look like this in C:
	jvmtiCapabilities capa;
	jvmtiError err;

	err = (*jvmti)->GetPotentialCapabilities(jvmti, &capa);
	if (err == JVMTI_ERROR_NONE) {
	   err = (*jvmti)->AddCapabilities(jvmti, &capa);
      
For example, if an agent wants to check if it can get the bytecodes of a method (that is, it wants to check if it previously added this capability and has not relinquished it), the code might look like this in C:
	jvmtiCapabilities capa;
	jvmtiError err;

	err = (*jvmti)->GetCapabilities(jvmti, &capa);
	if (err == JVMTI_ERROR_NONE) {
   	   if (capa.can_get_bytecodes) { ... } } 
      
The Capabilities Structure
These functions use the capabilities structure ( jvmtiCapabilities ) which contains boolean flags corresponding to each capability:
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 : 15;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
} jvmtiCapabilities;

jvmtiCapabilities - Capabilities of an Environment
All types are unsigned int : 1
FieldDescription 
can_tag_objectsCan set and get tags, as described in the Heap category. 
can_generate_field_modification_eventsCan set watchpoints on field modification -SetFieldModificationWatch 
can_generate_field_access_eventsCan set watchpoints on field access -SetFieldAccessWatch 
can_get_bytecodesCan get bytecodes of a method GetBytecodes 
can_get_synthetic_attributeCan test if a field or method is synthetic -IsFieldSynthetic and IsMethodSynthetic 
can_get_owned_monitor_infoCan get information about ownership of monitors -GetOwnedMonitorInfo 
can_get_current_contended_monitorCan GetCurrentContendedMonitor 
can_get_monitor_infoCan GetObjectMonitorUsage 
can_pop_frameCan pop frames off the stack - PopFrame 
can_redefine_classesCan redefine classes with RedefineClasses. Bytecodes of the original and redefined methods can be different. The constant pool and attributes can also be different. 
can_signal_threadCan send stop or interrupt to threads 
can_get_source_file_nameCan get the source file name of a class 
can_get_line_numbersCan get the line number table of a method 
can_get_source_debug_extensionCan get the source debug extension of a class 
can_access_local_variablesCan set and get local variables 
can_maintain_original_method_orderCan return methods in the order they occur in the class file 
can_generate_single_step_eventsCan get single step events 
can_generate_exception_eventsCan get exception thrown and exception catchevents 
can_generate_frame_pop_eventsCan set and thus get FramePop events 
can_generate_breakpoint_eventsCan set and thus get Breakpoint events 
can_suspendCan suspend and resume threads 
can_redefine_any_classRedefineClasses can be called on any class (can_redefine_classes must also be set) 
can_get_current_thread_cpu_timeCan get current thread CPU time 
can_get_thread_cpu_timeCan get thread CPU time 
can_generate
_method_entry_events
Can generate method entry events on entering a method 
can_generate
_method_exit_events
Can generate method exit events on leaving a method 
can_generate
_all_class_hook_events
Can generate ClassFileLoadHook events for every loaded class. 
can_generate
_compiled_method_load_events
Can generate events when a method is compiled or unloaded 
can_generate
_monitor_events
Can generate events on monitor activity 
can_generate
_vm_object_alloc_events
Can generate events on VM allocation of an object 
can_generate
_native_method_bind_events
Can generate events when a native method is bound to its implementation 
can_generate
_garbage_collection_events
Can generate events when garbage collection begins or ends 
can_generate
_object_free_events
Can generate events when the garbage collector frees an object 


Get Potential Capabilities

jvmtiError
GetPotentialCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)
Returns via capabilities_ptr the JVM TI features that can potentially be possessed by this environment at this time. The returned capabilities differ from the complete set of capabilities implemented by the VM in two cases: another environment possesses capabilities that can only be possessed by one environment, or the current phase is live, and certain capabilities can only be added during the OnLoad phase. The AddCapabilitiesfunction may be used to set any or all or these capabilities. Currently possessed capabilities are included.

Typically this function is used in the OnLoad function. Some virtual machines may allow a limited set of capabilities to be added in the live phase. In this case, the set of potentially available capabilities will likely differ from the OnLoad phase set.

See the Capability Examples.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
capabilities_ptrjvmtiCapabilities*On return, points to the JVM TI capabilities that may be added.

Agent passes a pointer to a jvmtiCapabilities. On return, the jvmtiCapabilities has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERcapabilities_ptr is NULL.

Add Capabilities

jvmtiError
AddCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)
Set new capabilities by adding the capabilities pointed to bycapabilities_ptr. All previous capabilities are retained. Typically this function is used in the OnLoad function. Some virtual machines may allow a limited set of capabilities to be added in the live phase.

See the Capability Examples.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
capabilities_ptrconstjvmtiCapabilities*Points to the JVM TI capabilities to add.

Agent passes in a pointer tojvmtiCapabilities.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_AVAILABLEThe desired capabilities are not even potentially available.
JVMTI_ERROR_NULL_POINTERcapabilities_ptr is NULL.

Relinquish Capabilities

jvmtiError
RelinquishCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)
Relinquish the capabilities pointed to by capabilities_ptr. Some implementations may allow only one environment to have a capability (see the capability introduction). This function releases capabilities so that they may be used by other agents. All other capabilities are retained. The capability will no longer be present in GetCapabilities. Attempting to relinquish a capability that the agent does not possess is not an error.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
capabilities_ptrconstjvmtiCapabilities*Points to the JVM TI capabilities to add.

Agent passes in a pointer tojvmtiCapabilities.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERcapabilities_ptr is NULL.

Get Capabilities

jvmtiError
GetCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)
Returns via capabilities_ptr the optional JVM TI features which this environment currently possesses. An environment does not possess a capability unless it has been successfully added with AddCapabilities. An environment only loses possession of a capability if it has been relinquished with RelinquishCapabilities. Thus, this function returns the net result of the AddCapabilities and RelinquishCapabilities calls which have been made.

See the Capability Examples.

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
capabilities_ptrjvmtiCapabilities*On return, points to the JVM TI capabilities.

Agent passes a pointer to a jvmtiCapabilities. On return, the jvmtiCapabilities has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERcapabilities_ptr is NULL.


Timers

Timers functions: Timers types: These functions provide timing information. The resolution at which the time is updated is not specified. They provides nanosecond precision, but not necessarily nanosecond accuracy. Details about the timers, such as their maximum values, can be accessed with the timer information functions. The information function for each timer returns the following data structure --
typedef struct {
    jlong max_value;
    jboolean may_skip_forward;
    jboolean may_skip_backward;
    jvmtiTimerKind kind;
    jlong reserved1;
    jlong reserved2;
} jvmtiTimerInfo;
Where the timer kind is --
Timer Kinds (jvmtiTimerKind)
ConstantValueDescription
JVMTI_TIMER_USER_CPU30CPU time that a thread is in user mode.
JVMTI_TIMER_TOTAL_CPU31CPU time that a thread is in user or system mode.
JVMTI_TIMER_ELAPSED32Elapsed time.

jvmtiTimerInfo - Timer Info
FieldTypeDescription
max_valuejlongThe maximum value the timer can reach. After this value is reached the timer wraps back to zero. This is an unsigned value. If tested or printed as a jlong (signed value) it may appear to be a negative number.
may_skip_forwardjbooleanIf true, the timer can be externally adjusted and as a result skip forward. If false, the timer value will never increase faster than real time.
may_skip_backwardjbooleanIf true, the timer can be externally adjusted and as a result skip backward. If false, the timer value will be monotonically increasing.
kindjvmtiTimerKindThe kind of timer. On a platform that does not distinguish between user and system time,JVMTI_TIMER_TOTAL_CPU is returned.
reserved1jlongReserved for future use.
reserved2jlongReserved for future use.


Get Current Thread CPU Timer Information

jvmtiError
GetCurrentThreadCpuTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
Get information about the GetCurrentThreadCpuTime timer. The fields of thejvmtiTimerInfo structure are filled in with details about the timer. This information is specific to the platform and the implementation ofGetCurrentThreadCpuTime and thus does not vary by thread nor does it vary during a particular invocation of the VM.

Note that the implementations of GetCurrentThreadCpuTime and GetThreadCpuTime may differ, and thus the values returned by GetCurrentThreadCpuTimerInfo andGetThreadCpuTimerInfo may differ -- see GetCurrentThreadCpuTime for more information.

This function may only be called during the start or the live phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_current_thread_cpu_timeCan get current thread CPU time.

Parameters
NameTypeDescription
info_ptrjvmtiTimerInfo*On return, filled with information describing the time returned by GetCurrentThreadCpuTime.

Agent passes a pointer to a jvmtiTimerInfo. On return, the jvmtiTimerInfo has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_current_thread_cpu_time. UseAddCapabilities.
JVMTI_ERROR_NULL_POINTERinfo_ptr is NULL.

Get Current Thread CPU Time

jvmtiError
GetCurrentThreadCpuTime(jvmtiEnv* env,
            jlong* nanos_ptr)
Return the CPU time utilized by the current thread.

Note that the GetThreadCpuTime function provides CPU time for any thread, including the current thread. GetCurrentThreadCpuTime exists to support platforms which cannot supply CPU time for threads other than the current thread or which have more accurate information for the current thread (seeGetCurrentThreadCpuTimerInfo vs GetThreadCpuTimerInfo). On many platforms this call will be equivalent to:
  GetThreadCpuTime(env, NULL, nanos_ptr)

This function may only be called during the start or the live phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_current_thread_cpu_timeCan get current thread CPU time.

If this capability is enabled after threads have started, the implementation may choose any time up to and including the time that the capability is enabled as the point where CPU time collection starts.

This capability must be potentially available on any platform where can_get_thread_cpu_timeis potentially available.

Parameters
NameTypeDescription
nanos_ptrjlong*On return, points to the CPU time used by this thread in nanoseconds. This is an unsigned value. If tested or printed as a jlong (signed value) it may appear to be a negative number.

Agent passes a pointer to a jlong. On return, the jlong has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_current_thread_cpu_time. UseAddCapabilities.
JVMTI_ERROR_NULL_POINTERnanos_ptr is NULL.

Get Thread CPU Timer Information

jvmtiError
GetThreadCpuTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
Get information about the GetThreadCpuTime timer. The fields of thejvmtiTimerInfo structure are filled in with details about the timer. This information is specific to the platform and the implementation ofGetThreadCpuTime and thus does not vary by thread nor does it vary during a particular invocation of the VM.

Note that the implementations of GetCurrentThreadCpuTime and GetThreadCpuTime may differ, and thus the values returned by GetCurrentThreadCpuTimerInfo andGetThreadCpuTimerInfo may differ -- see GetCurrentThreadCpuTime for more information.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_thread_cpu_timeCan get thread CPU time.

Parameters
NameTypeDescription
info_ptrjvmtiTimerInfo*On return, filled with information describing the time returned by GetThreadCpuTime.

Agent passes a pointer to a jvmtiTimerInfo. On return, the jvmtiTimerInfo has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_thread_cpu_time. UseAddCapabilities.
JVMTI_ERROR_NULL_POINTERinfo_ptr is NULL.

Get Thread CPU Time

jvmtiError
GetThreadCpuTime(jvmtiEnv* env,
            jthread thread,
            jlong* nanos_ptr)
Return the CPU time utilized by the specified thread.

Get information about this timer with GetThreadCpuTimerInfo.

This function may only be called during the live phase.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
CapabilityEffect
can_get_thread_cpu_timeCan get thread CPU time.

If this capability is enabled after threads have started, the implementation may choose any time up to and including the time that the capability is enabled as the point where CPU time collection starts.

Parameters
NameTypeDescription
threadjthreadThe thread to query. If thread is NULL, the current thread is used.
nanos_ptrjlong*On return, points to the CPU time used by the specified thread in nanoseconds. This is an unsigned value. If tested or printed as a jlong (signed value) it may appear to be a negative number.

Agent passes a pointer to a jlong. On return, the jlong has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_MUST_POSSESS_CAPABILITYThe environment does not possess the capability can_get_thread_cpu_time. UseAddCapabilities.
JVMTI_ERROR_INVALID_THREADthread is not a thread object.
JVMTI_ERROR_THREAD_NOT_ALIVEthread is not live (has not been started or is now dead).
JVMTI_ERROR_NULL_POINTERnanos_ptr is NULL.

Get Timer Information

jvmtiError
GetTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
Get information about the GetTime timer. The fields of the jvmtiTimerInfostructure are filled in with details about the timer. This information will not change during a particular invocation of the VM.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
info_ptrjvmtiTimerInfo*On return, filled with information describing the time returned by GetTime.

Agent passes a pointer to a jvmtiTimerInfo. On return, the jvmtiTimerInfo has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERinfo_ptr is NULL.

Get Time

jvmtiError
GetTime(jvmtiEnv* env,
            jlong* nanos_ptr)
Return the current value of the system timer, in nanoseconds.

The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative). This function provides nanosecond precision, but not necessarily nanosecond accuracy. No guarantees are made about how frequently values change.

Get information about this timer with GetTimerInfo.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
nanos_ptrjlong*On return, points to the time in nanoseconds. This is an unsigned value. If tested or printed as a jlong (signed value) it may appear to be a negative number.

Agent passes a pointer to a jlong. On return, the jlong has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERnanos_ptr is NULL.

Get Available Processors

jvmtiError
GetAvailableProcessors(jvmtiEnv* env,
            jint* processor_count_ptr)
Returns the number of processors available to the Java virtual machine.

This value may change during a particular invocation of the virtual machine. Applications that are sensitive to the number of available processors should therefore occasionally poll this property.

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
processor_count_ptrjint*On return, points to the maximum number of processors available to the virtual machine; never smaller than one.

Agent passes a pointer to a jint. On return, the jinthas been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERprocessor_count_ptr is NULL.


System Properties

System Properties functions:


Add To Bootstrap Class Loader Search

jvmtiError
AddToBootstrapClassLoaderSearch(jvmtiEnv* env,
            const char* segment)
After the bootstrap class loader unsuccessfully searches for a class, the specified platform-dependent search path segment will be searched as well. This function can be used to cause instrumentation classes to be defined by the bootstrap class loader. Only one segment (typically a directory or JAR file) may be specified in the segment. This function may be called multiple times to add multiple segments, the segments will be searched in the order that this function was called.

This function may only be called during the OnLoad phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
segmentconst char*The platform-dependent search path segment, encoded as amodified UTF-8 string.

Agent passes in an array of char.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTsegment is an invalid path.
JVMTI_ERROR_NULL_POINTERsegment is NULL.

Get System Properties

jvmtiError
GetSystemProperties(jvmtiEnv* env,
            jint* count_ptr,
            char*** property_ptr)
The list of VM system property keys which may be used with GetSystemPropertyis returned. It is strongly recommended that virtual machines provide the following property keys:
  • java.vm.vendor
  • java.vm.version
  • java.vm.name
  • java.vm.info
  • java.library.path
  • java.class.path
Provides access to system properties defined by and used by the VM. Properties set on the command-line are included. This allows getting and setting of these properties before the VM even begins executing bytecodes. Since this is a VM view of system properties, the set of available properties will usually be different than that injava.lang.System.getProperties. JNI method invocation may be used to accessjava.lang.System.getProperties.

The set of properties may grow during execution.

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
count_ptrjint*On return, points to the number of property keys returned.

Agent passes a pointer to a jint. On return, the jint has been set.
property_ptrchar***On return, points to an array of property keys, encoded as modified UTF-8 strings.

Agent passes a pointer to a char**. On return, the char**points to a newly allocated array of size *count_ptr, each element of which is also newly allocated. The array should be freed with Deallocate. Each of the elements should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERcount_ptr is NULL.
JVMTI_ERROR_NULL_POINTERproperty_ptr is NULL.

Get System Property

jvmtiError
GetSystemProperty(jvmtiEnv* env,
            const char* property,
            char** value_ptr)
Return a VM system property value given the property key.

The function GetSystemProperties returns the set of property keys which may be used. The properties which can be retrieved may grow during execution.

Since this is a VM view of system properties, the values of properties may differ from that returned by java.lang.System.getProperty(String). A typical VM might copy the values of the VM system properties into the Properties held by java.lang.System during the initialization of that class. Thereafter any changes to the VM system properties (with SetSystemProperty) or thejava.lang.System system properties (with java.lang.System.setProperty(String,String)) would cause the values to diverge. JNI method invocation may be used to access java.lang.System.getProperty(String).

This function may only be called during the OnLoad or the live phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
propertyconst char*The key of the property to retrieve, encoded as a modified UTF-8 string.

Agent passes in an array of char.
value_ptrchar**On return, points to the property value, encoded as amodified UTF-8 string.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_AVAILABLEThis property is not available. Use GetSystemPropertiesto find available properties.
JVMTI_ERROR_NULL_POINTERproperty is NULL.
JVMTI_ERROR_NULL_POINTERvalue_ptr is NULL.

Set System Property

jvmtiError
SetSystemProperty(jvmtiEnv* env,
            const char* property,
            const char* value)
Set a VM system property value.

The function GetSystemProperties returns the set of property keys, some of these may be settable. See GetSystemProperty.

This function may only be called during the OnLoad phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
propertyconst char*The key of the property, encoded as a modified UTF-8 string.

Agent passes in an array of char.
valueconst char *The property value to set, encoded as a modified UTF-8string.

Agent passes in an array of char. If value is NULL, do not set the value, but return JVMTI_ERROR_NOT_AVAILABLE if the property is not writeable .

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NOT_AVAILABLEThis property is not available or is not writeable.
JVMTI_ERROR_NULL_POINTERproperty is NULL.


General

General functions:


Get Phase

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)
Return the current phase of VM execution. The phases proceed in sequence:
Phases of execution (jvmtiPhase)
ConstantValueDescription
JVMTI_PHASE_ONLOAD1OnLoad phase: while in the Agent_OnLoadfunction.
JVMTI_PHASE_PRIMORDIAL2Primordial phase: between return fromAgent_OnLoad and the VMStart event.
JVMTI_PHASE_START6Start phase: when the VMStart event is sent and until the VMInit event is sent.
JVMTI_PHASE_LIVE4Live phase: when the VMInit event is sent and until the VMDeath event returns.
JVMTI_PHASE_DEAD8Dead phase: after the VMDeath event returns or after start-up failure.
In the case of start-up failure the VM will proceed directly to the dead phase skipping intermediate phases and neither a VMInit nor VMDeath event will be sent.

Most JVM TI functions operate only in the live phase. The following functions operate in either the OnLoad or live phases: The following functions operate in only the OnLoad phase: The following functions operate in the start or live phases: The following functions operate in any phase: JNI functions (except the Invocation API) must only be used in the start or live phases.

Most JVM TI events are sent only in the live phase. The following events operate in others phases:

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
phase_ptrjvmtiPhase*On return, points to the phase.

Agent passes a pointer to a jvmtiPhase. On return, thejvmtiPhase has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERphase_ptr is NULL.

Dispose Environment

jvmtiError
DisposeEnvironment(jvmtiEnv* env)
Shutdown a JVM TI connection created with JNI GetEnv (see Environments). Dispose of any resources held by the environment. Suspended threads are not resumed, this must be done explicitly by the agent. Allocated memory is not released, this must be done explicitly by the agent. This environment may not be used after this call. This call returns to the caller.

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription

Errors
This function returns a universal error

Set Environment Local Storage

jvmtiError
SetEnvironmentLocalStorage(jvmtiEnv* env,
            const void* data)
The VM stores a pointer value associated with each environment. This pointer value is called environment-local storage. This value is NULLunless set with this function. Agents can allocate memory in which they store environment specific information. By setting environment-local storage it can then be accessed with GetEnvironmentLocalStorage.

Called by the agent to set the value of the JVM TI environment-local storage. JVM TI supplies to the agent a pointer-size environment-local storage that can be used to record per-environment information.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
dataconst void *The value to be entered into the environment-local storage.

Agent passes in an array. If data is NULL, value is set toNULL.

Errors
This function returns a universal error

Get Environment Local Storage

jvmtiError
GetEnvironmentLocalStorage(jvmtiEnv* env,
            void** data_ptr)
Called by the agent to get the value of the JVM TI environment-local storage.

This function may be called during any phase.

This function may be called from the callbacks to the Heap iteration functions, or from the event handles for the GarbageCollectionStart,GarbageCollectionFinish, and ObjectFree events.

Capabilities
Required Functionality

Parameters
NameTypeDescription
data_ptrvoid**Pointer through which the value of the environment local storage is returned. If environment-local storage has not been set with SetEnvironmentLocalStorage returned pointer is NULL.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERdata_ptr is NULL.

Get Version Number

jvmtiError
GetVersionNumber(jvmtiEnv* env,
            jint* version_ptr)
Return the JVM TI version via version_ptr. The return value is the version identifier. The version identifier includes major, minor and micro version as well as the interface type.
Version Interface Types
ConstantValueDescription
JVMTI_VERSION_INTERFACE_JNI0x00000000Value ofJVMTI_VERSION_MASK_INTERFACE_TYPEfor JNI.
JVMTI_VERSION_INTERFACE_JVMTI0x30000000Value ofJVMTI_VERSION_MASK_INTERFACE_TYPEfor JVM TI.
Version Masks
ConstantValueDescription
JVMTI_VERSION_MASK_INTERFACE_TYPE0x70000000Mask to extract interface type. The value of the version returned by this function masked withJVMTI_VERSION_MASK_INTERFACE_TYPEis alwaysJVMTI_VERSION_INTERFACE_JVMTIsince this is a JVM TI function.
JVMTI_VERSION_MASK_MAJOR0x0FFF0000Mask to extract major version number.
JVMTI_VERSION_MASK_MINOR0x0000FF00Mask to extract minor version number.
JVMTI_VERSION_MASK_MICRO0x000000FFMask to extract micro version number.
Version Shifts
ConstantValueDescription
JVMTI_VERSION_SHIFT_MAJOR16Shift to extract major version number.
JVMTI_VERSION_SHIFT_MINOR8Shift to extract minor version number.
JVMTI_VERSION_SHIFT_MICRO0Shift to extract micro version number.

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
version_ptrjint*On return, points to the JVM TI version.

Agent passes a pointer to a jint. On return, the jint has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERversion_ptr is NULL.

Get Error Name

jvmtiError
GetErrorName(jvmtiEnv* env,
            jvmtiError error,
            char** name_ptr)
Return the symbolic name for an error code.

For example GetErrorName(env, JVMTI_ERROR_NONE, &err_name) would return in err_namethe string "JVMTI_ERROR_NONE".

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
errorjvmtiErrorThe error code.
name_ptrchar**On return, points to the error name. The name is encoded as a modified UTF-8 string, but is restricted to the ASCII subset.

Agent passes a pointer to a char*. On return, the char*points to a newly allocated array. The array should be freed with Deallocate.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTerror is not a jvmtiError.
JVMTI_ERROR_NULL_POINTERname_ptr is NULL.

Set Verbose Flag

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)
Verbose Flag Enumeration (jvmtiVerboseFlag)
ConstantValueDescription
JVMTI_VERBOSE_OTHER0Verbose output other than the below.
JVMTI_VERBOSE_GC1Verbose garbage collector output, like that specified with -verbose:gc.
JVMTI_VERBOSE_CLASS2Verbose class loading output, like that specified with -verbose:class.
JVMTI_VERBOSE_JNI4Verbose JNI output, like that specified with -verbose:jni.
Control verbose output. This is the output which typically is sent tostderr.

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
flagjvmtiVerboseFlagWhich verbose flag to set.
valuejbooleanNew value of the flag.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_ILLEGAL_ARGUMENTflag is not a jvmtiVerboseFlag.

Get JLocation Format

typedef enum {
    JVMTI_JLOCATION_JVMBCI = 1,
    JVMTI_JLOCATION_MACHINEPC = 2,
    JVMTI_JLOCATION_OTHER = 0
} jvmtiJlocationFormat;
jvmtiError
GetJLocationFormat(jvmtiEnv* env,
            jvmtiJlocationFormat* format_ptr)
Although the greatest functionality is achieved with location information referencing the virtual machine bytecode index, the definition of jlocationhas intentionally been left unconstrained to allow VM implementations that do not have this information.

This function describes the representation of jlocation used in this VM. If the returned format is JVMTI_JLOCATION_JVMBCIjlocations can be used as in indices into the array returned by GetBytecodes.
JLocation Format Enumeration (jvmtiJlocationFormat)
ConstantValueDescription
JVMTI_JLOCATION_JVMBCI1jlocation values represent virtual machine bytecode indices--that is, offsets into the virtual machine code for a method.
JVMTI_JLOCATION_MACHINEPC2jlocation values represent native machine program counter values.
JVMTI_JLOCATION_OTHER0jlocation values have some other representation.

This function may be called during any phase.

Capabilities
Required Functionality

Parameters
NameTypeDescription
format_ptrjvmtiJlocationFormat*On return, points to the format identifier forjlocation values.

Agent passes a pointer to a jvmtiJlocationFormat. On return, the jvmtiJlocationFormat has been set.

Errors
This function returns either a universal error or one of the following errors
ErrorDescription
JVMTI_ERROR_NULL_POINTERformat_ptr is NULL.


Errors

Every JVM   TI function returns a  jvmtiError  error code.

It is the responsibility of the agent to call JVM   TI functions with valid parameters and in the proper context (calling thread is attached, phase is correct, etc.). Detecting some error conditions may be difficult, inefficient, or impossible for an implementation. The errors listed in  Function Specific Required Errors  must be detected by the implementation. All other errors represent the recommended response to the error condition.

Universal Errors

The following errors may be returned by any function

JVMTI_ERROR_NONE (0)
No error has occurred. This is the error code that is returned on successful completion of the function.

JVMTI_ERROR_NULL_POINTER (100)
Pointer is unexpectedly  NULL.

JVMTI_ERROR_OUT_OF_MEMORY (110)
The function attempted to allocate memory and no more memory was available for allocation.

JVMTI_ERROR_ACCESS_DENIED (111)
The desired functionality has not been enabled in this virtual machine.

JVMTI_ERROR_UNATTACHED_THREAD (115)
The thread being used to call this function is not attached to the virtual machine. Calls must be made from attached threads. See  AttachCurrentThread in the JNI invocation API.

JVMTI_ERROR_INVALID_ENVIRONMENT (116)
The JVM  TI environment provided is no longer connected or is not an environment.

JVMTI_ERROR_WRONG_PHASE (112)
The desired functionality is not available in the current  phase. Always returned if the virtual machine has completed running.

JVMTI_ERROR_INTERNAL (113)
An unexpected internal error has occurred.

Function Specific Required Errors

The following errors are returned by some JVM   TI functions and must be returned by the implementation when the condition occurs.

JVMTI_ERROR_INVALID_PRIORITY (12)
Invalid priority.

JVMTI_ERROR_THREAD_NOT_SUSPENDED (13)
Thread was not suspended.

JVMTI_ERROR_THREAD_SUSPENDED (14)
Thread already suspended.

JVMTI_ERROR_THREAD_NOT_ALIVE (15)
This operation requires the thread to be alive--that is, it must be started and not yet have died.

JVMTI_ERROR_CLASS_NOT_PREPARED (22)
The class has been loaded but not yet prepared.

JVMTI_ERROR_NO_MORE_FRAMES (31)
There are no Java programming language or JNI stack frames at the specified depth.

JVMTI_ERROR_OPAQUE_FRAME (32)
Information about the frame is not available (e.g. for native frames).

JVMTI_ERROR_DUPLICATE (40)
Item already set.

JVMTI_ERROR_NOT_FOUND (41)
Desired element (e.g. field or breakpoint) not found

JVMTI_ERROR_NOT_MONITOR_OWNER (51)
This thread doesn't own the raw monitor.

JVMTI_ERROR_INTERRUPT (52)
The call has been interrupted before completion.

JVMTI_ERROR_UNMODIFIABLE_CLASS (79)
The class cannot be modified.

JVMTI_ERROR_NOT_AVAILABLE (98)
The functionality is not available in this virtual machine.

JVMTI_ERROR_ABSENT_INFORMATION (101)
The requested information is not available.

JVMTI_ERROR_INVALID_EVENT_TYPE (102)
The specified event type ID is not recognized.

JVMTI_ERROR_NATIVE_METHOD (104)
The requested information is not available for native method.

Function Specific Agent Errors

The following errors are returned by some JVM   TI functions. They are returned in the event of invalid parameters passed by the agent or usage in an invalid context. An implementation is not required to detect these errors.

JVMTI_ERROR_INVALID_THREAD (10)
The passed thread is not a valid thread.

JVMTI_ERROR_INVALID_FIELDID (25)
Invalid field.

JVMTI_ERROR_INVALID_METHODID (23)
Invalid method.

JVMTI_ERROR_INVALID_LOCATION (24)
Invalid location.

JVMTI_ERROR_INVALID_OBJECT (20)
Invalid object.

JVMTI_ERROR_INVALID_CLASS (21)
Invalid class.

JVMTI_ERROR_TYPE_MISMATCH (34)
The variable is not an appropriate type for the function used.

JVMTI_ERROR_INVALID_SLOT (35)
Invalid slot.

JVMTI_ERROR_MUST_POSSESS_CAPABILITY (99)
The capability being used is false in this environment.

JVMTI_ERROR_INVALID_THREAD_GROUP (11)
Thread group invalid.

JVMTI_ERROR_INVALID_MONITOR (50)
Invalid raw monitor.

JVMTI_ERROR_ILLEGAL_ARGUMENT (103)
Illegal argument.

JVMTI_ERROR_INVALID_TYPESTATE (65)
The state of the thread has been modified, and is now inconsistent.

JVMTI_ERROR_UNSUPPORTED_VERSION (68)
A new class file has a version number not supported by this VM.

JVMTI_ERROR_INVALID_CLASS_FORMAT (60)
A new class file is malformed (the VM would return a  ClassFormatError).

JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION (61)
The new class file definitions would lead to a circular definition (the VM would return a  ClassCircularityError).

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED (63)
A new class file would require adding a method.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED (64)
A new class version changes a field.

JVMTI_ERROR_FAILS_VERIFICATION (62)
The class bytes fail verification.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED (66)
A direct superclass is different for the new class version, or the set of directly implemented interfaces is different.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED (67)
A new class version does not declare a method declared in the old class version.

JVMTI_ERROR_NAMES_DONT_MATCH (69)
The class name defined in the new class file is different from the name in the old class object.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED (70)
A new class version has different modifiers.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED (71)
A method in the new class version has different modifiers than its counterpart in the old class version.


Data Types

JVM   TI extends the data types defined by JNI.

JNI Types Used in the JVM Tool Interface
TypeDescription
jbooleanHolds a Java programming language boolean. Unsigned 8 bits.
jintHolds a Java programming language int. Signed 32 bits.
jlongHolds a Java programming language long. Signed 64 bits.
jfloatHolds a Java programming language float. 32 bits.
jdoubleHolds a Java programming language double. 64 bits.
jobjectHolds a Java programming language object.
jclassHolds a Java programming language class.
jvalueIs a union of all primitive types and jobject. Thus, holds any Java programming language value.
jfieldIDIdentifies a Java programming language field.
jmethodIDIdentifies a Java programming language method, initializer, or constructor.
JNIEnvPointer to the JNI function table. Pointer to this (JNIEnv *) is a JNI environment.

JVM Tool Interface Base Types
TypeDescription
jvmtiEnvThe JVM TI environment pointer. See the Function SectionjvmtiEnvpoints to the function table pointer.
jthreadSubtype of jobject that holds a thread.
typedef jobject jthread;
jthreadGroupSubtype of jobject that holds a thread group.
typedef jobject jthreadGroup;
jlocationA 64 bit value, representing a monotonically increasing executable position within a method. -1 indicates a native method. See GetJLocationFormat for the format on a given VM.
typedef jlong jlocation;
jrawMonitorIDA raw monitor.
struct _jrawMonitorID;
typedef struct _jrawMonitorID *jrawMonitorID;
jvmtiErrorHolds an error return code. See the Error section for possible values.
typedef enum { 
    JVMTI_ERROR_NONE = 0,  
    JVMTI_ERROR_INVALID_THREAD = 10,
      ... 
} jvmtiError;
jvmtiEventAn identifier for an event type. See the Event section for possible values. It is guaranteed that future versions of this specification will never assign zero as an event type identifier.
typedef enum { 
    JVMTI_EVENT_SINGLE_STEP = 1, 
    JVMTI_EVENT_BREAKPOINT = 2, 
      ... 
} jvmtiEvent;
jvmtiEventCallbacksThe callbacks used for events.
typedef struct {
    jvmtiEventVMInit VMInit;
    jvmtiEventVMDeath VMDeath;
      ... 
} jvmtiEventCallbacks;
See event callbacks for the complete structure.

Where, for example, the VM initialization callback is defined:
typedef void (JNICALL *jvmtiEventVMInit)
    (jvmtiEnv *jvmti_env, 
     JNIEnv* jni_env,
     jthread thread);
See the individual events for the callback function definition.
jniNativeInterfaceTypedef for the JNI function table JNINativeInterface defined in theJNI Specification. The JNI reference implementation defines this with an underscore.
typedef struct JNINativeInterface_ jniNativeInterface;

Structure Type Definitions
TypeDescription
jvmtiAddrLocationMapNative address to location entry
jvmtiCapabilitiesCapabilities of an Environment
jvmtiClassDefinitionClass redefinition description
jvmtiExtensionEventInfoExtension Event Info
jvmtiExtensionFunctionInfoExtension Function Info
jvmtiFrameInfoStack frame information structure
jvmtiLineNumberEntryLine number table entry
jvmtiLocalVariableEntryLocal variable table entry
jvmtiMonitorUsageObject monitor usage information
jvmtiParamInfoExtension Function/Event Parameter Info
jvmtiStackInfoStack information structure
jvmtiThreadGroupInfoThread group information structure
jvmtiThreadInfoThread information structure
jvmtiTimerInfoTimer Info

Function Type Definitions
TypeDescription
jvmtiExtensionEventExtension Event
jvmtiExtensionFunctionExtension Function
jvmtiHeapObjectCallbackHeap Object Callback
jvmtiHeapRootCallbackHeap Root Object Callback
jvmtiObjectReferenceCallbackObject Reference Callback
jvmtiStackReferenceCallbackStack Reference Object Callback
jvmtiStartFunctionAgent Start Function

Enumeration Definitions
TypeDescription
jvmtiEventModeEvent Enable/Disable
jvmtiHeapObjectFilterHeap Object Filter Enumeration
jvmtiHeapRootKindHeap Root Kind Enumeration
jvmtiIterationControlIteration Control Enumeration
jvmtiJlocationFormatJLocation Format Enumeration
jvmtiObjectReferenceKindObject Reference Enumeration
jvmtiParamKindExtension Function/Event Parameter Kinds
jvmtiParamTypesExtension Function/Event Parameter Types
jvmtiPhasePhases of execution
jvmtiTimerKindTimer Kinds
jvmtiVerboseFlagVerbose Flag Enumeration

Function Table Layout
PositionFunctionDeclaration
1reserved
void *reserved1;
2Set Event Notification Mode
jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env, 
                       jvmtiEventMode mode, 
                       jvmtiEvent event_type, 
                       jthread event_thread, 
                        ...);
3reserved
void *reserved3;
4Get All Threads
jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env, 
                       jint* threads_count_ptr, 
                       jthread** threads_ptr);
5Suspend Thread
jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env, 
                       jthread thread);
6Resume Thread
jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env, 
                       jthread thread);
7Stop Thread
jvmtiError (JNICALL *StopThread) (jvmtiEnv* env, 
                       jthread thread, 
                       jobject exception);
8Interrupt Thread
jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env, 
                       jthread thread);
9Get Thread Info
jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env, 
                       jthread thread, 
                       jvmtiThreadInfo* info_ptr);
10Get Owned Monitor Info
jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env, 
                       jthread thread, 
                       jint* owned_monitor_count_ptr, 
                       jobject** owned_monitors_ptr);
11Get Current Contended Monitor
jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env, 
                       jthread thread, 
                       jobject* monitor_ptr);
12Run Agent Thread
jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env, 
                       jthread thread, 
                       jvmtiStartFunction proc, 
                       const void* arg, 
                       jint priority);
13Get Top Thread Groups
jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env, 
                       jint* group_count_ptr, 
                       jthreadGroup** groups_ptr);
14Get Thread Group Info
jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env, 
                       jthreadGroup group, 
                       jvmtiThreadGroupInfo* info_ptr);
15Get Thread Group Children
jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env, 
                       jthreadGroup group, 
                       jint* thread_count_ptr, 
                       jthread** threads_ptr, 
                       jint* group_count_ptr, 
                       jthreadGroup** groups_ptr);
16Get Frame Count
jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env, 
                       jthread thread, 
                       jint* count_ptr);
17Get Thread State
jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env, 
                       jthread thread, 
                       jint* thread_state_ptr);
18reserved
void *reserved18;
19Get Frame Location
jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jmethodID* method_ptr, 
                       jlocation* location_ptr);
20Notify Frame Pop
jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth);
21Get Local Variable - Object
jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jobject* value_ptr);
22Get Local Variable - Int
jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jint* value_ptr);
23Get Local Variable - Long
jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jlong* value_ptr);
24Get Local Variable - Float
jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jfloat* value_ptr);
25Get Local Variable - Double
jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jdouble* value_ptr);
26Set Local Variable - Object
jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jobject value);
27Set Local Variable - Int
jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jint value);
28Set Local Variable - Long
jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jlong value);
29Set Local Variable - Float
jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jfloat value);
30Set Local Variable - Double
jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jdouble value);
31Create Raw Monitor
jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env, 
                       const char* name, 
                       jrawMonitorID* monitor_ptr);
32Destroy Raw Monitor
jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
33Raw Monitor Enter
jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
34Raw Monitor Exit
jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
35Raw Monitor Wait
jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env, 
                       jrawMonitorID monitor, 
                       jlong millis);
36Raw Monitor Notify
jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
37Raw Monitor Notify All
jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
38Set Breakpoint
jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env, 
                       jmethodID method, 
                       jlocation location);
39Clear Breakpoint
jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env, 
                       jmethodID method, 
                       jlocation location);
40reserved
void *reserved40;
41Set Field Access Watch
jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
42Clear Field Access Watch
jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
43Set Field Modification Watch
jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
44Clear Field Modification Watch
jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
45reserved
void *reserved45;
46Allocate
jvmtiError (JNICALL *Allocate) (jvmtiEnv* env, 
                       jlong size, 
                       unsigned char** mem_ptr);
47Deallocate
jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env, 
                       unsigned char* mem);
48Get Class Signature
jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env, 
                       jclass klass, 
                       char** signature_ptr, 
                       char** generic_ptr);
49Get Class Status
jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* status_ptr);
50Get Source File Name
jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env, 
                       jclass klass, 
                       char** source_name_ptr);
51Get Class Modifiers
jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* modifiers_ptr);
52Get Class Methods
jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* method_count_ptr, 
                       jmethodID** methods_ptr);
53Get Class Fields
jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* field_count_ptr, 
                       jfieldID** fields_ptr);
54Get Implemented Interfaces
jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* interface_count_ptr, 
                       jclass** interfaces_ptr);
55Is Interface
jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env, 
                       jclass klass, 
                       jboolean* is_interface_ptr);
56Is Array Class
jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env, 
                       jclass klass, 
                       jboolean* is_array_class_ptr);
57Get Class Loader
jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env, 
                       jclass klass, 
                       jobject* classloader_ptr);
58Get Object Hash Code
jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env, 
                       jobject object, 
                       jint* hash_code_ptr);
59Get Object Monitor Usage
jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env, 
                       jobject object, 
                       jvmtiMonitorUsage* info_ptr);
60Get Field Name (and Signature)
jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       char** name_ptr, 
                       char** signature_ptr, 
                       char** generic_ptr);
61Get Field Declaring Class
jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       jclass* declaring_class_ptr);
62Get Field Modifiers
jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       jint* modifiers_ptr);
63Is Field Synthetic
jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       jboolean* is_synthetic_ptr);
64Get Method Name (and Signature)
jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env, 
                       jmethodID method, 
                       char** name_ptr, 
                       char** signature_ptr, 
                       char** generic_ptr);
65Get Method Declaring Class
jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env, 
                       jmethodID method, 
                       jclass* declaring_class_ptr);
66Get Method Modifiers
jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* modifiers_ptr);
67reserved
void *reserved67;
68Get Max Locals
jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* max_ptr);
69Get Arguments Size
jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* size_ptr);
70Get Line Number Table
jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* entry_count_ptr, 
                       jvmtiLineNumberEntry** table_ptr);
71Get Method Location
jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env, 
                       jmethodID method, 
                       jlocation* start_location_ptr, 
                       jlocation* end_location_ptr);
72Get Local Variable Table
jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* entry_count_ptr, 
                       jvmtiLocalVariableEntry** table_ptr);
73reserved
void *reserved73;
74reserved
void *reserved74;
75Get Bytecodes
jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* bytecode_count_ptr, 
                       unsigned char** bytecodes_ptr);
76Is Method Native
jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env, 
                       jmethodID method, 
                       jboolean* is_native_ptr);
77Is Method Synthetic
jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env, 
                       jmethodID method, 
                       jboolean* is_synthetic_ptr);
78Get Loaded Classes
jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env, 
                       jint* class_count_ptr, 
                       jclass** classes_ptr);
79Get Classloader Classes
jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env, 
                       jobject initiating_loader, 
                       jint* class_count_ptr, 
                       jclass** classes_ptr);
80Pop Frame
jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env, 
                       jthread thread);
81reserved
void *reserved81;
82reserved
void *reserved82;
83reserved
void *reserved83;
84reserved
void *reserved84;
85reserved
void *reserved85;
86reserved
void *reserved86;
87Redefine Classes
jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env, 
                       jint class_count, 
                       const jvmtiClassDefinition* class_definitions);
88Get Version Number
jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env, 
                       jint* version_ptr);
89Get Capabilities
jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env, 
                       jvmtiCapabilities* capabilities_ptr);
90Get Source Debug Extension
jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env, 
                       jclass klass, 
                       char** source_debug_extension_ptr);
91Is Method Obsolete
jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env, 
                       jmethodID method, 
                       jboolean* is_obsolete_ptr);
92Suspend Thread List
jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env, 
                       jint request_count, 
                       const jthread* request_list, 
                       jvmtiError* results);
93Resume Thread List
jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env, 
                       jint request_count, 
                       const jthread* request_list, 
                       jvmtiError* results);
94reserved
void *reserved94;
95reserved
void *reserved95;
96reserved
void *reserved96;
97reserved
void *reserved97;
98reserved
void *reserved98;
99reserved
void *reserved99;
100Get All Stack Traces
jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env, 
                       jint max_frame_count, 
                       jvmtiStackInfo** stack_info_ptr, 
                       jint* thread_count_ptr);
101Get Thread List Stack Traces
jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env, 
                       jint thread_count, 
                       const jthread* thread_list, 
                       jint max_frame_count, 
                       jvmtiStackInfo** stack_info_ptr);
102Get Thread Local Storage
jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env, 
                       jthread thread, 
                       void** data_ptr);
103Set Thread Local Storage
jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env, 
                       jthread thread, 
                       const void* data);
104Get Stack Trace
jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env, 
                       jthread thread, 
                       jint start_depth, 
                       jint max_frame_count, 
                       jvmtiFrameInfo* frame_buffer, 
                       jint* count_ptr);
105reserved
void *reserved105;
106Get Tag
jvmtiError (JNICALL *GetTag) (jvmtiEnv* env, 
                       jobject object, 
                       jlong* tag_ptr);
107Set Tag
jvmtiError (JNICALL *SetTag) (jvmtiEnv* env, 
                       jobject object, 
                       jlong tag);
108Force Garbage Collection
jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env);
109Iterate Over Objects Reachable From Object
jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env, 
                       jobject object, 
                       jvmtiObjectReferenceCallback object_reference_callback, 
                       void* user_data);
110Iterate Over Reachable Objects
jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env, 
                       jvmtiHeapRootCallback heap_root_callback, 
                       jvmtiStackReferenceCallback stack_ref_callback, 
                       jvmtiObjectReferenceCallback object_ref_callback, 
                       void* user_data);
111Iterate Over Heap
jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env, 
                       jvmtiHeapObjectFilter object_filter, 
                       jvmtiHeapObjectCallback heap_object_callback, 
                       void* user_data);
112Iterate Over Instances Of Class
jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env, 
                       jclass klass, 
                       jvmtiHeapObjectFilter object_filter, 
                       jvmtiHeapObjectCallback heap_object_callback, 
                       void* user_data);
113reserved
void *reserved113;
114Get Objects With Tags
jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env, 
                       jint tag_count, 
                       const jlong* tags, 
                       jint* count_ptr, 
                       jobject** object_result_ptr, 
                       jlong** tag_result_ptr);
115reserved
void *reserved115;
116reserved
void *reserved116;
117reserved
void *reserved117;
118reserved
void *reserved118;
119reserved
void *reserved119;
120Set JNI Function Table
jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env, 
                       const jniNativeInterface* function_table);
121Get JNI Function Table
jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env, 
                       jniNativeInterface** function_table);
122Set Event Callbacks
jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env, 
                       const jvmtiEventCallbacks* callbacks, 
                       jint size_of_callbacks);
123Generate Events
jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env, 
                       jvmtiEvent event_type);
124Get Extension Functions
jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env, 
                       jint* extension_count_ptr, 
                       jvmtiExtensionFunctionInfo** extensions);
125Get Extension Events
jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env, 
                       jint* extension_count_ptr, 
                       jvmtiExtensionEventInfo** extensions);
126Set Extension Event Callback
jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env, 
                       jint extension_event_index, 
                       jvmtiExtensionEvent callback);
127Dispose Environment
jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env);
128Get Error Name
jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env, 
                       jvmtiError error, 
                       char** name_ptr);
129Get JLocation Format
jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env, 
                       jvmtiJlocationFormat* format_ptr);
130Get System Properties
jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env, 
                       jint* count_ptr, 
                       char*** property_ptr);
131Get System Property
jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env, 
                       const char* property, 
                       char** value_ptr);
132Set System Property
jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env, 
                       const char* property, 
                       const char* value);
133Get Phase
jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env, 
                       jvmtiPhase* phase_ptr);
134Get Current Thread CPU Timer Information
jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env, 
                       jvmtiTimerInfo* info_ptr);
135Get Current Thread CPU Time
jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env, 
                       jlong* nanos_ptr);
136Get Thread CPU Timer Information
jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env, 
                       jvmtiTimerInfo* info_ptr);
137Get Thread CPU Time
jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env, 
                       jthread thread, 
                       jlong* nanos_ptr);
138Get Timer Information
jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env, 
                       jvmtiTimerInfo* info_ptr);
139Get Time
jvmtiError (JNICALL *GetTime) (jvmtiEnv* env, 
                       jlong* nanos_ptr);
140Get Potential Capabilities
jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env, 
                       jvmtiCapabilities* capabilities_ptr);
141reserved
void *reserved141;
142Add Capabilities
jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env, 
                       const jvmtiCapabilities* capabilities_ptr);
143Relinquish Capabilities
jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env, 
                       const jvmtiCapabilities* capabilities_ptr);
144Get Available Processors
jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env, 
                       jint* processor_count_ptr);
145reserved
void *reserved145;
146reserved
void *reserved146;
147Get Environment Local Storage
jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env, 
                       void** data_ptr);
148Set Environment Local Storage
jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env, 
                       const void* data);
149Add To Bootstrap Class Loader Search
jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env, 
                       const char* segment);
150Set Verbose Flag
jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env, 
                       jvmtiVerboseFlag flag, 
                       jboolean value);
151reserved
void *reserved151;
152reserved
void *reserved152;
153reserved
void *reserved153;
154Get Object Size
jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env, 
                       jobject object, 
                       jlong* size_ptr);


Events

Handling Events
Agents can be informed of many events that occur in application programs.

To handle events, designate a set of callback functions with  SetEventCallbacks . For each event the corresponding callback function will be called. Arguments to the callback function provides additional information about the event. The callback function is usually called from within application threads and the JVM   TI implementation does not queue events in any way. This means that event callback functions must be written carefully. Here are some general guidelines. See the individual event descriptions for further suggestions.

  • Any exception thrown during the execution of an event callback can overwrite any current pending exception in the current application thread. Care must be taken to preserve a pending exception when an event callback makes a JNI call that might generate an exception.
  • Event callback functions must be re-entrant. The JVM TI implementation does not queue events. If an agent needs to process events one at a time, it can use a raw monitor inside the event callback functions to serialize event processing.
  • Event callback functions that execute JNI's FindClass function to load classes need to note that FindClass locates the class loader associated with the current native method. For the purposes of class loading, an event callback that includes a JNI environment as a parameter to the callback, can be viewed as a native method of the current class executed by the event thread.

Some JVM   TI events identify objects with JNI references. All references in JVM   TI events are JNI local references and will become invalid after the event callback returns. Unless stated otherwise, memory referenced by pointers sent by events may not be referenced after the event returns.

Events can be enabled and disabled with the function  SetEventNotificationMode . All events are initially disabled. Thus, in order to receive any event:

Except where stated otherwise, events are delivered on the thread that caused the event. Events are sent at the time they occur. The specification for each event includes the set of  phases  in which it can be sent; if an event triggering activity occurs during another phase, no event is sent.

A thread that generates an event does not change its execution status (for example, the event does not cause the thread to be suspended). If an agent wishes the event to result in suspension, then the agent is responsible for explicitly suspending the thread with  SuspendThread .

If an event is enabled in multiple environments, the event will be sent to each agent in the order that the environments were created.
Multiple Co-located Events
In many situations it is possible for multiple events to occur at the same location in one thread. When this happens, all the events are reported through the event callbacks in the order specified in this section.

If the current location is at the entry point of a method, the  MethodEntry  event is reported before any other event at the current location in the same thread.

If an exception catch has been detected at the current location, either because it is the beginning of a catch clause or a native method that cleared a pending exception has returned, the  exceptionCatch  event is reported before any other event at the current location in the same thread.

If a  singleStep  event or  breakpoint  event is triggered at the current location, the event is defined to occur immediately before the code at the current location is executed. These events are reported before any events which are triggered by the execution of code at the current location in the same thread (specifically: exception fieldAccess , and  fieldModification ). If both a step and breakpoint event are triggered for the same thread and location, the step event is reported before the breakpoint event.

If the current location is the exit point of a method (that is, the last location before returning to the caller), the  MethodExit  event and the  FramePop  event (if requested) are reported after all other events at the current location in the same thread. There is no specified ordering of these two events with respect to each other.

Co-located events can be triggered during the processing of some other event by the agent at the same location in the same thread. If such an event, of type  y , is triggered during the processing of an event of type  x , and if  x  precedes  y  in the ordering specified above, the co-located event  y  is reported for the current thread and location. If  x  does not precede  y y  is not reported for the current thread and location. For example, if a breakpoint is set at the current location during the processing of  SingleStep , that breakpoint will be reported before the thread moves off the current location.

The following events are never considered to be co-located with other events.
Event Callbacks
The event callback structure below is used to specify the handler function for events. It is set with the  SetEventCallbacks  function.
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;
    jvmtiEventReserved reserved80;
    jvmtiEventGarbageCollectionStart GarbageCollectionStart;
    jvmtiEventGarbageCollectionFinish GarbageCollectionFinish;
    jvmtiEventObjectFree ObjectFree;
    jvmtiEventVMObjectAlloc VMObjectAlloc;
} jvmtiEventCallbacks;


Event Index


Single Step

void JNICALL
SingleStep(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)
Single step events allow the agent to trace thread execution at the finest granularity allowed by the VM. A single step event is generated whenever a thread reaches a new location. Typically, single step events represent the completion of one VM instruction as defined the  Java Virtual Machine Specification . However, some implementations may define locations differently. In any case the  method  and  location parameters uniquely identify the current location and allow the mapping to source file and line number when that information is available.

No single step events are generated from within native methods.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_SINGLE_STEP = 60

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_SINGLE_STEP, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_single_step_eventsCan get single step events

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread about to execution a new instruction
methodjmethodIDMethod about to execute a new instruction
locationjlocationLocation of the new instruction


Breakpoint

void JNICALL
Breakpoint(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)
Breakpoint events are generated whenever a thread reaches a location designated as a breakpoint with  SetBreakpoint . The  method  and  location  parameters uniquely identify the current location and allow the mapping to source file and line number when that information is available.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_BREAKPOINT = 62

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_BREAKPOINT, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_breakpoint_eventsCan set and thus get Breakpoint events

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread.
threadjthreadThread that hit the breakpoint
methodjmethodIDMethod that hit the breakpoint
locationjlocationlocation of the breakpoint


Field Access

void JNICALL
FieldAccess(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jclass field_klass,
            jobject object,
            jfieldID field)
Field access events are generated whenever a thread accesses a field that was designated as a watchpoint with  SetFieldAccessWatch . The  method  and  location  parameters uniquely identify the current location and allow the mapping to source file and line number when that information is available.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_FIELD_ACCESS = 63

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_FIELD_ACCESS, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_field_access_eventsCan set watchpoints on field access - SetFieldAccessWatch

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread accessing the field
methodjmethodIDMethod where the access is occurring
locationjlocationLocation where the access is occurring
field_klassjclassClass of the field being accessed
objectjobjectObject with the field being accessed if the field is an instance field; NULL otherwise
fieldjfieldIDField being accessed


Field Modification

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)
Field modification events are generated whenever a thread modifies a field that was designated as a watchpoint with  SetFieldModificationWatch . The  method  and  location parameters uniquely identify the current location and allow the mapping to source file and line number when that information is available.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_FIELD_MODIFICATION = 64

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_FIELD_MODIFICATION, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_field_modification_eventsCan set watchpoints on field modification -SetFieldModificationWatch

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread modifying the field
methodjmethodIDMethod where the modification is occurring
locationjlocationLocation where the modification is occurring
field_klassjclassClass of the field being modified
objectjobjectObject with the field being modified if the field is an instance field; NULL otherwise
fieldjfieldIDField being modified
signature_typecharSignature type of the new value
new_valuejvalueThe new value


Frame Pop

void JNICALL
FramePop(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jboolean was_popped_by_exception)
Frame pop events are generated upon exit from a single method in a single frame as specified in a call to  NotifyFramePop . This is true whether termination is caused by executing its return instruction or by throwing an exception to its caller (see was_popped_by_exception ). However, frame pops caused by the  PopFrame  function are not reported.

The location reported by  GetFrameLocation  identifies the executable location in the returning method, immediately prior to the return.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_FRAME_POP = 61

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_FRAME_POP, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_frame_pop_eventsCan set and thus get FramePop events

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread that is popping the frame
methodjmethodIDMethod being popped
was_popped_by_exceptionjbooleanTrue if frame was popped by a thrown exception. False if method exited through its return instruction.


Method Entry

void JNICALL
MethodEntry(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method)
Method entry events are generated upon entry of Java programming language methods (including native methods).

The location reported by  GetFrameLocation  identifies the initial executable location in the method.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_METHOD_ENTRY = 65

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_METHOD_ENTRY, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_method_entry_eventsCan generate method entry events on entering a method

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread entering the method
methodjmethodIDMethod being entered


Method Exit

void JNICALL
MethodExit(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jboolean was_popped_by_exception,
            jvalue return_value)
Method exit events are generated upon exit from Java programming language methods (including native methods). This is true whether termination is caused by executing its return instruction or by throwing an exception to its caller (see was_popped_by_exception ).

The  method  field uniquely identifies the method being entered or exited. The  frame field provides access to the stack frame for the method.

The location reported by  GetFrameLocation  identifies the executable location in the returning method immediately prior to the return.

Enabling method entry or exit events will significantly degrade performance on many platforms and is thus not advised for performance critical usage (such as profiling).  Bytecode instrumentation  should be used in these cases.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_METHOD_EXIT = 66

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_METHOD_EXIT, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_method_exit_eventsCan generate method exit events on leaving a method

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread exiting the method
methodjmethodIDMethod being exited
was_popped_by_exceptionjbooleanTrue if frame was popped by a thrown exception. False if method exited through its return instruction.
return_valuejvalueThe return value of the method being exited. Undefined and should not be used if was_popped_by_exception is true.


Native Method Bind

void JNICALL
NativeMethodBind(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            void* address,
            void** new_address_ptr)
A Native Method Bind event is sent when a VM binds a Java programming language native method to the address of a function that implements the native method. This will occur when the native method is called for the first time and also occurs when the JNI function  RegisterNatives  is called. This event allows the bind to be redirected to an agent-specified proxy function. This event is not sent when the native method is unbound. Typically, this proxy function will need to be specific to a particular method or, to handle the general case, automatically generated assembly code, since after instrumentation code is executed the function at the original binding address will usually be invoked. The original binding can be restored or the redirection changed by use of the JNI function  RegisterNatives . Some events may be sent during the primordial phase, JNI and most of JVM   TI cannot be used at this time but the method and address can be save for use later.

This event is sent during the primordial, start or live  phase .

Event ID:
JVMTI_EVENT_NATIVE_METHOD_BIND = 67

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_NATIVE_METHOD_BIND, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_native_method_bind_eventsCan generate events when a native method is bound to its implementation

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread Will beNULL if sent during the primordial phase.
threadjthreadThread requesting the bind
methodjmethodIDNative method being bound
addressvoid*The address the VM is about to bind to--that is, the address of the implementation of the native method
new_address_ptrvoid**if the referenced address is changed (that is, if*new_address_ptr is set), the binding will instead be made to the supplied address.


Exception

void JNICALL
Exception(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jobject exception,
            jmethodID catch_method,
            jlocation catch_location)
Exception events are generated whenever an exception is first detected in a Java programming language method. The exception may have been thrown by a Java programming language or native method, but in the case of native methods, the event is not generated until the exception is first seen by a Java programming language method. If an exception is set and cleared in a native method (and thus is never visible to Java programming language code), no exception event is generated.

The  method  and  location  parameters uniquely identify the current location (where the exception was detected) and allow the mapping to source file and line number when that information is available. The  exception  field identifies the thrown exception object. The  catch_method  and  catch_location  identify the location of the catch clause, if any, that handles the thrown exception. If there is no such catch clause, each field is set to 0. There is no guarantee that the thread will ever reach this catch clause. If there are native methods on the call stack between the throw location and the catch clause, the exception may be reset by one of those native methods. Similarly, exceptions that are reported as uncaught ( catch_klass  et al. set to 0) may in fact be caught by native code. Agents can check for these occurrences by monitoring  ExceptionCatch  events. Note that finally clauses are implemented as catch and re-throw. Therefore they will be reported in the catch location.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_EXCEPTION = 58

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_EXCEPTION, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_exception_eventsCan get exception thrown and exception catch events

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread generating the exception
methodjmethodIDMethod generating the exception
locationjlocationLocation where exception occurred
exceptionjobjectThe exception being thrown
catch_methodjmethodIDMethod that will catch the exception, or NULL if no known catch
catch_locationjlocationlocation which will catch the exception or zero if no known catch


Exception Catch

void JNICALL
ExceptionCatch(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jobject exception)
Exception catch events are generated whenever a thrown exception is caught. If the exception is caught in a Java programming language method, the event is generated when the catch clause is reached. If the exception is caught in a native method, the event is generated as soon as control is returned to a Java programming language method. Exception catch events are generated for any exception for which a throw was detected in a Java programming language method. Note that finally clauses are implemented as catch and re-throw. Therefore they will generate exception catch events.

The  method  and  location  parameters uniquely identify the current location and allow the mapping to source file and line number when that information is available. For exceptions caught in a Java programming language method, the  exception  object identifies the exception object. Exceptions caught in native methods are not necessarily available by the time the exception catch is reported, so the  exception field is set to  NULL .

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_EXCEPTION_CATCH = 59

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_EXCEPTION_CATCH, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_exception_eventsCan get exception thrown and exception catch events

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread catching the exception
methodjmethodIDMethod catching the exception
locationjlocationLocation where exception is being caught
exceptionjobjectException being caught


Thread Start

void JNICALL
ThreadStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
Thread start events are generated by a new thread before its initial method executes.

A thread may be listed in the array returned by  GetAllThreads  before its thread start event is generated. It is possible for other events to be generated on a thread before its thread start event.

The event is sent on the newly started  thread .

This event is sent during the start or live  phase .

Event ID:
JVMTI_EVENT_THREAD_START = 52

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_THREAD_START, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread.
threadjthreadThread starting


Thread End

void JNICALL
ThreadEnd(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
Thread end events are generated by a terminating thread after its initial method has finished execution.

A thread may be listed in the array returned by  GetAllThreads  after its thread end event is generated. No events are generated on a thread after its thread end event.

The event is sent on the dying  thread .

This event is sent during the start or live  phase .

Event ID:
JVMTI_EVENT_THREAD_END = 53

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_THREAD_END, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread.
threadjthreadThread ending


Class Load

void JNICALL
ClassLoad(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)
A class load event is generated when a class is first loaded. The order of class load events generated by a particular thread are guaranteed to match the order of class loading within that thread. Array class creation does not generate a class load event. The creation of a primitive class (for example, java.lang.Integer.TYPE) does not generate a class load event.

This event is sent at an early stage in loading the class. As a result the class should be used carefully. Note, for example, that methods and fields are not yet loaded, so queries for methods, fields, subclasses, and so on will not give correct results. See "Loading of Classes and Interfaces" in the  Java Language Specification . For most purposes the  ClassPrepare  event will be more useful.

This event is sent during the start or live  phase .

Event ID:
JVMTI_EVENT_CLASS_LOAD = 55

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_CLASS_LOAD, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread loading the class
klassjclassClass being loaded


Class Prepare

void JNICALL
ClassPrepare(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)
A class prepare event is generated when class preparation is complete. At this point, class fields, methods, and implemented interfaces are available, and no code from the class has been executed. Since array classes never have fields or methods, class prepare events are not generated for them. Class prepare events are not generated for primitive classes (for example,  java.lang.Integer.TYPE ).

This event is sent during the start or live  phase .

Event ID:
JVMTI_EVENT_CLASS_PREPARE = 56

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_CLASS_PREPARE, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread generating the class prepare
klassjclassClass being prepared


Class File Load Hook

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)
Sent when the VM obtains a class file data, but before it constructs the in-memory representation for that class. Also sent when  RedefineClasses  is called in any JVM   TI environment. The agent can instrument the existing class file data sent by the VM to include profiling/debugging hooks. See the description of  bytecode instrumentation  for usage information.

This event may be sent before the VM is initialized. During this time no VM resources should be created. Some classes might not be compatible with the function (eg. ROMized classes) and this event will not be generated for these classes.

The agent must allocate the space for the modified class file data buffer using the memory allocation function  Allocate  because the VM is responsible for freeing the new class file data buffer using  Deallocate .

If the agent wishes to modify the class file, it must set  new_class_data  to point to the newly instrumented class file data buffer and set  new_class_data_len  to the length of that buffer before returning from this call. If no modification is desired, the agent simply does not set  new_class_data . If multiple agents have enabled this event the results are chained. That is, if  new_class_data  has been set, it becomes the class_data  for the next agent. As with all events, agents are called in the order the environment was created.

This event is sent during the primordial, start or live  phase .

Event ID:
JVMTI_EVENT_CLASS_FILE_LOAD_HOOK = 54

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)
          

Capabilities
Required Functionality
Optional Features
CapabilityEffect
can_generate_all_class_hook_eventsCan generate ClassFileLoadHook events for every loaded class.

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread. Will be NULL if sent during the primordial phase.
class_being_redefinedjclassThe class being redefined with RedefineClassesNULL if sent by class load.
loaderjobjectThe class loader loading the class. NULL if the bootstrap class loader.
nameconst char*Name of class being loaded as a VM internal qualified name (for example, "java/util/List"), encoded as amodified UTF-8 string. Note: if the class is defined with a NULL name or without a name specified, name will beNULL.
protection_domainjobjectThe ProtectionDomain of the class.
class_data_lenjintLength of current class file data buffer.
class_dataconst unsigned char*Pointer to the current class file data buffer.
new_class_data_lenjint*Pointer to the length of the new class file data buffer.
new_class_dataunsigned char**Pointer to the pointer to the instrumented class file data buffer.


VM Start Event

void JNICALL
VMStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)
The VM initialization event signals the start of the VM. At this time JNI is live but the VM is not yet fully initialized. Once this event is generated, the agent is free to call any JNI function. This event signals the beginning of the start phase, JVM   TI functions permitted in the start phase may be called.

In the case of VM start-up failure, this event will not be sent.

This event is sent during the start or live  phase .

Event ID:
JVMTI_EVENT_VM_START = 57

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_VM_START, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread.


VM Initialization Event

void JNICALL
VMInit(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
The VM initialization event signals the completion of VM initialization. Once this event is generated, the agent is free to call any JNI or JVM   TI function. The VM initialization event can be preceded by or can be concurrent with other events, but the preceding events should be handled carefully, if at all, because the VM has not completed its initialization. The thread start event for the main application thread is guaranteed not to occur until after the handler for the VM initialization event returns.

In the case of VM start-up failure, this event will not be sent.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_VM_INIT = 50

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_VM_INIT, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread.
threadjthreadThe initial thread


VM Death Event

void JNICALL
VMDeath(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)
The VM death event notifies the agent of the termination of the VM. No events will occur after the VMDeath event.

In the case of VM start-up failure, this event will not be sent. Note that Agent_OnUnload  will still be called in these cases.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_VM_DEATH = 51

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_VM_DEATH, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread


Compiled Method Load

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)
Sent when a method is compiled and loaded into memory by the VM. If it is unloaded, the  CompiledMethodUnload  event is sent. If it is moved, the  CompiledMethodUnload  event is sent, followed by a new  CompiledMethodLoad  event. Note that a single method may have multiple compiled forms, and that this event will be sent for each form. Note also that several methods may be inlined into a single address range, and that this event will be sent for each method.

These events can be sent after their initial occurrence with  GenerateEvents .

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_COMPILED_METHOD_LOAD = 68

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_COMPILED_METHOD_LOAD, NULL)
          

jvmtiAddrLocationMap - Native address to location entry
FieldTypeDescription
start_addressconst void*Starting native address of code corresponding to a location
locationjlocationCorresponding location. See GetJLocationFormat for the meaning of location.

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_compiled_method_load_eventsCan generate events when a method is compiled or unloaded

Parameters
NameTypeDescription
methodjmethodIDMethod being compiled and loaded
code_sizejintSize of compiled code
code_addrconst void*Address where compiled method code is loaded
map_lengthjintNumber of jvmtiAddrLocationMap entries in the address map. Zero if mapping information cannot be supplied.
mapconstjvmtiAddrLocationMap*Map from native addresses to location. The native address range of each entry is from start_address tostart_address-1 of the next entry. NULL if mapping information cannot be supplied.
compile_infoconst void*VM-specific compilation information. The referenced compile information is managed by the VM and must not depend on the agent for collection. A VM implementation defines the content and lifetime of the information.


Compiled Method Unload

void JNICALL
CompiledMethodUnload(jvmtiEnv *jvmti_env,
            jmethodID method,
            const void* code_addr)
Sent when a compiled method is unloaded from memory. This event might not be sent on the thread which performed the unload. This event may be sent sometime after the unload occurs, but will be sent before the memory is reused by a newly generated compiled method. This event may be sent after the class is unloaded.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_COMPILED_METHOD_UNLOAD = 69

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_COMPILED_METHOD_UNLOAD, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_compiled_method_load_eventsCan generate events when a method is compiled or unloaded

Parameters
NameTypeDescription
methodjmethodIDCompiled method being unloaded. For identification of the compiled method only -- the class may be unloaded and therefore the method should not be used as an argument to further JNI or JVM TI functions.
code_addrconst void*Address where compiled method code was loaded. For identification of the compiled method only -- the space may have been reclaimed.


Dynamic Code Generated

void JNICALL
DynamicCodeGenerated(jvmtiEnv *jvmti_env,
            const char* name,
            const void* address,
            jint length)
Sent when a component of the virtual machine is generated dynamically. This does not correspond to Java programming language code that is compiled--see CompiledMethodLoad . This is for native code--for example, an interpreter that is generated differently depending on command-line options.

Note that this event has no controlling capability. If a VM cannot generate these events, it simply does not send any.

These events can be sent after their initial occurrence with  GenerateEvents .

This event is sent during the primordial, start or live  phase .

Event ID:
JVMTI_EVENT_DYNAMIC_CODE_GENERATED = 70

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_DYNAMIC_CODE_GENERATED, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription
nameconst char*Name of the code, encoded as a modified UTF-8 string. Intended for display to an end-user. The name might not be unique.
addressconst void*Native address of the code
lengthjintLength in bytes of the code


Data Dump Request

void JNICALL
DataDumpRequest(jvmtiEnv *jvmti_env)
Sent by the VM to request the agent to dump its data. This is just a hint and the agent need not react to this event. This is useful for processing command-line signals from users. For example, in the Java 2 SDK a CTRL-Break on Win32 and a CTRL-\ on Solaris causes the VM to send this event to the agent.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_DATA_DUMP_REQUEST = 71

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_DATA_DUMP_REQUEST, NULL)
          

Capabilities
Required Functionality

Parameters
NameTypeDescription


Monitor Contended Enter

void JNICALL
MonitorContendedEnter(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object)
Sent when a thread is attempting to enter a Java programming language monitor already acquired by another thread.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_MONITOR_CONTENDED_ENTER = 75

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_MONITOR_CONTENDED_ENTER, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_monitor_eventsCan generate events on monitor activity

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadJNI local reference to the thread attempting to enter the monitor
objectjobjectJNI local reference to the monitor


Monitor Contended Entered

void JNICALL
MonitorContendedEntered(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object)
Sent when a thread enters a Java programming language monitor after waiting for it to be released by another thread.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_MONITOR_CONTENDED_ENTERED = 76

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_monitor_eventsCan generate events on monitor activity

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadJNI local reference to the thread entering the monitor
objectjobjectJNI local reference to the monitor


Monitor Wait

void JNICALL
MonitorWait(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jlong timeout)
Sent when a thread is about to wait on an object. That is, a thread is entering Object.wait() .

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_MONITOR_WAIT = 73

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_MONITOR_WAIT, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_monitor_eventsCan generate events on monitor activity

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadJNI local reference to the thread about to wait
objectjobjectJNI local reference to the monitor
timeoutjlongThe number of milliseconds the thread will wait


Monitor Waited

void JNICALL
MonitorWaited(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jboolean timed_out)
Sent when a thread finishes waiting on an object. That is, a thread is leaving Object.wait() .

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_MONITOR_WAITED = 74

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_MONITOR_WAITED, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_monitor_eventsCan generate events on monitor activity

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadJNI local reference to the thread that was finished waiting
objectjobjectJNI local reference to the monitor.
timed_outjbooleanTrue if the monitor timed out


VM Object Allocation

void JNICALL
VMObjectAlloc(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jclass object_klass,
            jlong size)
Sent when a method causes the virtual machine to allocate an Object visible to Java programming language code and the allocation is not detectable by other intrumentation mechanisms. Generally object allocation should be detected by instrumenting the bytecodes of allocating methods. Object allocation generated in native code by JNI function calls should be detected using  JNI function interception . Some methods might not have associated bytecodes and are not native methods, they instead are executed directly by the VM. These methods should send this event. Virtual machines which are incapable of bytecode instrumentation for some or all of their methods can send this event.

Typical examples where this event might be sent:
  • Reflection -- for example, java.lang.Class.newInstance()
  • Methods not represented by bytecodes -- for example, VM intrinsics and J2ME preloaded classes
Cases where this event would not be generated:
  • Allocation due to bytecodes -- for example, the new and newarray VM instructions
  • Allocation due to JNI function calls -- for example, AllocObject
  • Allocations during VM initialization
  • VM internal objects

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_VM_OBJECT_ALLOC = 84

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_VM_OBJECT_ALLOC, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_vm_object_alloc_eventsCan generate events on VM allocation of an object

Parameters
NameTypeDescription
jni_envJNIEnv *The JNI environment of the event (current) thread
threadjthreadThread allocating the object.
objectjobjectJNI local reference to the object that was allocated
object_klassjclassJNI local reference to the class of the object
sizejlongSize of the object (in bytes). See GetObjectSize.


Object Free

void JNICALL
ObjectFree(jvmtiEnv *jvmti_env,
            jlong tag)
An Object Free event is sent when the garbage collector frees an object. Events are only sent for tagged objects--see  heap functions .

The event handler must not use JNI functions and must not use JVM   TI functions except those which specifically allow such use (see the raw monitor, memory management, and environment local storage functions).

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_OBJECT_FREE = 83

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_OBJECT_FREE, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_object_free_eventsCan generate events when the garbage collector frees an object

Parameters
NameTypeDescription
tagjlongThe freed object's tag


Garbage Collection Start

void JNICALL
GarbageCollectionStart(jvmtiEnv *jvmti_env)
A Garbage Collection Start event is sent when a full cycle garbage collection begins. Only stop-the-world collections are reported--that is, collections during which all threads cease to modify the state of the Java virtual machine. This means that some collectors will never generate these events. This event is sent while the VM is still stopped, thus the event handler must not use JNI functions and must not use JVM   TI functions except those which specifically allow such use (see the raw monitor, memory management, and environment local storage functions).

This event is always sent as a matched pair with  GarbageCollectionFinish  (assuming both events are enabled) and no garbage collection events will occur between them.

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_GARBAGE_COLLECTION_START = 81

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_GARBAGE_COLLECTION_START, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_garbage_collection_eventsCan generate events when garbage collection begins or ends

Parameters
NameTypeDescription


Garbage Collection Finish

void JNICALL
GarbageCollectionFinish(jvmtiEnv *jvmti_env)
A Garbage Collection Finish event is sent when a full garbage collection cycle ends. This event is sent while the VM is still stopped, thus the event handler must not use JNI functions and must not use JVM   TI functions except those which specifically allow such use (see the raw monitor, memory management, and environment local storage functions).

Some agents may need to do post garbage collection operations that require the use of the disallowed JVM   TI or JNI functions. For these cases an agent thread can be created which waits on a raw monitor, and the handler for the Garbage Collection Finish event simply notifies the raw monitor

This event is always sent as a matched pair with  GarbageCollectionStart  (assuming both events are enabled).

This event is sent only during the live  phase .

Event ID:
JVMTI_EVENT_GARBAGE_COLLECTION_FINISH = 82

Enabling:
All events are initially disabled. Enable globally with
SetEventNotificationMode(JVMTI_ENABLE, 
        JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL)
          

Capabilities
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this event.
CapabilityEffect
can_generate_garbage_collection_eventsCan generate events when garbage collection begins or ends

Parameters
NameTypeDescription


Constant Index

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_OBJECT_EITHER 
JVMTI_HEAP_OBJECT_TAGGED 
JVMTI_HEAP_OBJECT_UNTAGGED 
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_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_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 


from: http://docs.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值