Java Virtual Machine Tool Interface
The Java™ Virtual Machine Tool Interface (JVMTI) is a two-way interface that allows communication between the VM and a native agent. It replaces both the Java Virtual Machine Debug Interface (JVMDI) and Java Virtual Machine Profiler Interface (JVMPI).
Overview
The JVMTI allows third parties to develop debugging, profiling, and monitoring tools for the VM. The interface contains mechanisms for the agent to notify the VM about the kinds of information it requires, and also provides a means of receiving relevant notifications.
Several agents can be attached to a VM at any one time.
JVMTI agents can be loaded at startup using short or long forms of the command-line option:
-agentlib:<agent-lib-name>=<options>
or
-agentpath:<path-to-agent>=<options>
In the example that follows (see Sample JVMTI agent), the directory containing the jdwp
library is assumed to be on the library path. If you require a specific library, such as jdwp
, with your JVMTI agent, you can specify the path at startup, for example:
-agentlib:jdwp=<options>
For more information about -agentlib:jdwp
, see -Xrunjdwp
.
For more information about JVMTI, see https://docs.oracle.com/javase/8/docs/technotes/guides/management/index.html.
For a guide about writing a JVMTI agent, see http://www.oracle.com/technetwork/articles/javase/jvmti-136367.html.
Eclipse OpenJ9 extensions
Eclipse OpenJ9™ extensions to the JVMTI allow a JVMTI agent to query or automatically trigger operations in the VM, including the following tasks:
Task | OpenJ9 extensions |
---|---|
Get the OS thread ID | GetOSThreadID |
Query, set, and reset the VM dump options | QueryVmDump , SetVmDump , ResetVmDump |
Trigger a VM dump, and monitor JVMTI event functions when VM dumps start and end | TriggerVmDump , VMDumpStart , VMDumpEnd |
Set VM trace options | SetVmTrace |
Subscribe to and unsubscribe from VM tracepoints | RegisterTracePointSubscriber , DeregisterTracePointSubscriber |
Query runtime environment native memory categories | GetMemoryCategories |
Query and set VM log options | QueryVmLogOptions , SetVmLogOptions |
Search for and remove a shared classes cache | IterateSharedCaches , DestroySharedCache |
Subscribe to and unsubscribe from verbose garbage collection (GC) data logging | RegisterVerboseGCSubscriber , DeregisterVerboseGCSubscriber |
The definitions that you need when you write a JVMTI agent are provided in the header files jvmti.h
and ibmjvmti.h
, in the include
directory.
Sample JVMTI agent
The following sample shows you how to write a simple JVMTI agent that uses OpenJ9 extensions to the JVMTI.
Sample JVMTI agent written in C/C++, which uses the OpenJ9 extensions
/*
* tiSample.c
*
* Sample JVMTI agent to demonstrate the OpenJ9 JVMTI dump extensions
*/
#include "jvmti.h"
#include "ibmjvmti.h"
/* Forward declarations for JVMTI callback functions */
void JNICALL VMInitCallback(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread);
void JNICALL DumpStartCallback(jvmtiEnv *jvmti_env, char* label, char* event, char* detail, ...);
/*
* Agent_Onload()
*
* JVMTI agent initialisation function, invoked as agent is loaded by the VM
*/
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
jvmtiEnv *jvmti = NULL;
jvmtiError rc;
jint extensionEventCount = 0;
jvmtiExtensionEventInfo *extensionEvents = NULL;
jint extensionFunctionCount = 0;
jvmtiExtensionFunctionInfo *extensionFunctions = NULL;
int i = 0, j = 0;
printf("tiSample: Loading JVMTI sample agent\n");
/* Get access to JVMTI */
(*jvm)->GetEnv(jvm, (void **)&jvmti, JVMTI_VERSION_1_0);
/* Look up all the JVMTI extension events and functions */
(*jvmti)->GetExtensionEvents(jvmti, &extensionEventCount, &extensionEvents);
(*jvmti)->GetExtensionFunctions(jvmti, &extensionFunctionCount, &extensionFunctions);
printf("tiSample: Found %i JVMTI extension events, %i extension functions\n", extensionEventCount, extensionFunctionCount);
/* Find the JVMTI extension event we want */
while (i++ < extensionEventCount) {
if (strcmp(extensionEvents->id, COM_IBM_VM_DUMP_START) == 0) {
/* Found the dump start extension event, now set up a callback for it */
rc = (*jvmti)->SetExtensionEventCallback(jvmti, extensionEvents->extension_event_index, &DumpStartCallback);
printf("tiSample: Setting JVMTI event callback %s, rc=%i\n", COM_IBM_VM_DUMP_START, rc);
break;
}
extensionEvents++; /* move on to the next extension event */
}
/* Find the JVMTI extension function we want */
while (j++ < extensionFunctionCount) {
jvmtiExtensionFunction function = extensionFunctions->func;
if (strcmp(extensionFunctions->id, COM_IBM_SET_VM_DUMP) == 0) {
/* Found the set dump extension function, now set a dump option to generate javadumps on
thread starts */
rc = function(jvmti, "java:events=thrstart");
printf("tiSample: Calling JVMTI extension %s, rc=%i\n", COM_IBM_SET_VM_DUMP, rc);
break;
}
extensionFunctions++; /* move on to the next extension function */
}
return JNI_OK;
}
/*
* DumpStartCallback()
* JVMTI callback for dump start event (IBM JVMTI extension) */
void JNICALL
DumpStartCallback(jvmtiEnv *jvmti_env, char* label, char* event, char* detail, ...) {
printf("tiSample: Received JVMTI event callback, for event %s\n", event);
}
The sample JVMTI agent consists of two functions, Agent_OnLoad()
and DumpStartCallback()
:
Agent_OnLoad()
This function is called by the VM when the agent is loaded at VM startup, which allows the JVMTI agent to modify VM behavior before initialization is complete. The sample agent obtains access to the JVMTI interface by using the JNI Invocation API function GetEnv()
. The agent calls the APIs GetExtensionEvents()
and GetExtensionFunctions()
to find the JVMTI extensions that are supported by the VM. These APIs provide access to the list of extensions available in the jvmtiExtensionEventInfo
and jvmtiExtensionFunctionInfo
structures. The sample uses an extension event and an extension function in the following way:
Extension event: The sample JVMTI agent searches for the extension event VmDumpStart
in the list of jvmtiExtensionEventInfo
structures, by using the identifier COM_IBM_VM_DUMP_START
provided in ibmjvmti.h
. When the event is found, the JVMTI agent calls the JVMTI interface SetExtensionEventCallback()
to enable the event, providing a function DumpStartCallback()
that is called when the event is triggered.
Extension function: Next, the sample JVMTI agent searches for the extension function SetVMDump
in the list of jvmtiExtensionFunctionInfo
structures, by using the identifier COM_IBM_SET_VM_DUMP
provided in ibmjvmti.h
. The JVMTI agent calls the function by using the jvmtiExtensionFunction
pointer to set a VM dump option java:events=thrstart
. This option requests the VM to trigger a Java dump every time a VM thread is started.
DumpStartCallback()
This callback function issues a message when the associated extension event is called. In the sample code, DumpStartCallback()
is used when the VmDumpStart
event is triggered.
Using the sample JVMTI agent
-
Build the sample JVMTI agent:
Windows:
cl /I<jre_path>\include /MD /FetiSample.dll tiSample.c /link /DLL
Linux, AIX®, and z/OS®:
gcc -I<jre_path>/include -o libtiSample.so -shared tiSample.c
where
<jre_path>
is the path to your Java runtime environment installation. -
To run the sample JVMTI agent, use the command:
java -agentlib:tiSample -version
When the sample JVMTI agent loads, messages are generated. When the JVMTI agent initiates a Java dump, the message
JVMDUMP010
is issued.
API reference
The following sections provide reference information for the OpenJ9 extensions to the JVMTI.
GetOSThreadID
You can get the OS thread ID by using the GetOSThreadID()
API:
jvmtiError GetOSThreadID(jvmtiEnv* jvmti_env, jthread thread, jlong * threadid_ptr);
Parameters
jvmti_env
: A pointer to the JVMTI environment.thread
: The thread for which the ID is required.threadid_ptr
: A pointer to a variable, used to return the thread ID that corresponds to the thread specified by thethread
parameter.
Returns
JVMTI_ERROR_NONE
: Success
JVMTI_ERROR_NULL_POINTER
: The threadid_ptr
parameter is null.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_INVALID_THREAD
: The thread is not valid.
JVMTI_ERROR_THREAD_NOT_ALIVE
: The VM state of the thread is not started or has died.
JVMTI_ERROR_UNATTACHED_THREAD
: The current thread is not attached to the VM.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI start or live phase.
Identifiers
JVMTI Extension Function identifier: com.ibm.GetOSThreadID
Macro declaration in the ibmjvmti.h
file: COM_IBM_GET_OS_THREAD_ID
QueryVmDump
You can query the VM dump options that are set for a VM by using the QueryVmDump()
API:
jvmtiError QueryVmDump(jvmtiEnv* jvmti_env, jint buffer_size, void* options_buffer, jint* data_size_ptr)
This extension returns a set of dump option specifications as ASCII strings. The syntax of the option string is the same as the -Xdump
command-line option, with the initial -Xdump:
omitted. See -Xdump. The option strings are separated by newline characters. If the memory buffer is too small to contain the current VM dump option strings, you can expect the following results:
- The error message
JVMTI_ERROR_ILLEGAL_ARGUMENT
is returned. - The variable for
data_size_ptr
is set to the required buffer size.
Parameters
jvmti_env
: A pointer to the JVMTI environment.buffer_size
: The size of the supplied memory buffer in bytes.options_buffer
: A pointer to the supplied memory buffer.data_size_ptr
: A pointer to a variable, used to return the total size of the option strings.
Returns
JVMTI_ERROR_NONE
: Success
JVMTI_ERROR_NULL_POINTER
: The options_buffer
or data_size_ptr
parameters are null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_NOT_AVAILABLE
: The dump configuration is locked because a dump is in progress.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: The supplied memory buffer in options_buffer
is too small.
Identifiers
JVMTI Extension Function identifier: com.ibm.QueryVmDump
Macro declaration in the ibmjvmti.h
file: COM_IBM_QUERY_VM_DUMP
SetVmDump
You can set VM dump options by using the SetVmDump()
API:
jvmtiError SetVmDump(jvmtiEnv* jvmti_env, char* option)
The dump option is passed in as an ASCII character string. Use the same syntax as the -Xdump
command-line option, with the initial -Xdump:
omitted. See -Xdump.
When dumps are in progress, the dump configuration is locked, and calls to SetVmDump()
fail with a return value of JVMTI_ERROR_NOT_AVAILABLE
.
Parameters
jvmti_env
: A pointer to the JVMTI environment.option
: The VM dump option string.
Note: On z/OS, you might need to convert the option string from EBCDIC to ASCII before using this JVMTI extension function.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: The parameter option is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_NOT_AVAILABLE
: The dump configuration is locked because a dump is in progress.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: The parameter option contains an invalid -Xdump
string.
Identifiers
JVMTI Extension Function identifier: com.ibm.SetVmDump
Macro declaration in the ibmjvmti.h
file: COM_IBM_SET_VM_DUMP
TriggerVmDump
You can trigger a VM dump and specify the type of dump you want by using the TriggerVmDump()
API:
jvmtiError TriggerVmDump(jvmtiEnv* jvmti_env, char* option)
Choose the type of dump required by specifying an ASCII string that contains one of the supported dump agent types. See -Xdump. JVMTI events are provided at the start and end of the dump.
Parameters
jvmti_env
: A pointer to the JVMTI environment.-
option
: A pointer to the dump type string, which can be one of the following types:stack
java
system
console
tool
heap
snap
ceedump
(z/OS only)Note: On z/OS, you might need to convert the option string from EBCDIC to ASCII before using this JVMTI extension function.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: The option parameter is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_NOT_AVAILABLE
: The dump configuration is locked because a dump is in progress.
Identifiers
JVMTI Extension Function identifier: com.ibm.TriggerVmDump
Macro declaration in the ibmjvmti.h
file: COM_IBM_TRIGGER_VM_DUMP
ResetVmDump
You can reset VM dump options to the values at VM initialization by using the ResetVmDump()
API:
jvmtiError ResetVmDump(jvmtiEnv* jvmti_env)
Parameters
jvmti_env
: The JVMTI environment pointer.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_NOT_AVAILABLE
: The dump configuration is locked because a dump is in progress.
Identifiers
JVMTI Extension Function identifier: com.ibm.ResetVmDump
Macro declaration in the ibmjvmti.h
file: COM_IBM_RESET_VM_DUMP
VMDumpStart
The following JVMTI event function is called when a VM dump starts:
void JNICALL VMDumpStart(jvmtiEnv *jvmti_env, JNIEnv* jni_env, char* label, char* event, char* detail)
The event function provides the dump file name, the name of the JVMTI event, and the detail string from the dump event. The detail string provides additional information about the event that triggered the dump. This information is the same as the information detailed in the JVMDUMP039I
message. For example:
JVMDUMP039I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" at 2014/10/17 13:31:03 - please wait."
Parameters
jvmti_env
: JVMTI environment pointer.jni_env
: JNI environment pointer for the thread on which the event occurred.label
: The dump file name, including directory path.event
: The extension event name, such ascom.ibm.VmDumpStart
.detail
: The dump event detail string. The string can be empty.
Returns
None
VMDumpEnd
The following JVMTI event function is called when a VM dump ends:
void JNICALL VMDumpEnd(jvmtiEnv *jvmti_env, JNIEnv* jni_env, char* label, char* event, char* detail)
The event function provides the dump file name, the name of the JVMTI event, and the detail string from the dump event. The detail string provides additional information about the event that triggered the dump. This information is the same as the information detailed in the JVMDUMP039I
message. For example:
JVMDUMP039I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" at 2014/10/17 13:31:03 - please wait.
Parameters
jvmti_env
: JVMTI environment pointer.jni_env
: JNI environment pointer for the thread on which the event occurred.label
: The dump file name, including directory path.event
: The extension event namecom.ibm.VmDumpEnd
.detail
: The dump event detail string. The string can be empty.
Returns
None
SetVmTrace
You can set VM trace options by using the SetVmTrace()
API:
jvmtiError SetVmTrace(jvmtiEnv* jvmti_env, char* option)
The trace option is passed in as an ASCII character string. Use the same syntax as the -Xtrace
command-line option, with the initial -Xtrace:
omitted. See -Xtrace.
Parameters
jvmti_env
: JVMTI environment pointer.option
: Enter the VM trace option string.
Note: On z/OS, you might need to convert the option string from EBCDIC to ASCII before using this JVMTI extension function.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: The option parameter is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: The option parameter contains an invalid -Xtrace
string.
Identifiers
JVMTI Extension Function identifier: com.ibm.SetVmTrace
Macro declaration in the ibmjvmti.h
file: COM_IBM_SET_VM_TRACE
RegisterTracePointSubscriber
You can subscribe to VM tracepoints by using the RegisterTracePointSubscriber()
API:
jvmtiError RegisterTracePointSubscriber(jvmtiEnv* jvmti_env, char *description, jvmtiTraceSubscriber subscriber, jvmtiTraceAlarm alarm, void *userData, void **subscriptionID)
Parameters
jvmti_env
: A pointer to the JVMTI environment.description
: An ASCII character string that describes the subscriber.subscriber
: A function of typejvmtiTraceSubscriber
.alarm
: A function pointer of typejvmtiTraceAlarm
.user_data
: A pointer to user data. This pointer is passed to the subscriber and alarm functions each time these functions are called. This pointer can be a null value.subscription_id
: A pointer to a subscription identifier. This pointer is returned by theRegisterTracePointSubscriber
call if successful. The value must be supplied to a future call to theDeregisterTracePointSubscriber
API, which is used to unsubscribe from the VM tracepoint.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: One of the supplied parameters is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is not valid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_NOT_AVAILABLE
: VM trace is not available.
JVMTI_ERROR_INTERNAL
: An internal error occurred.
Identifiers
JVMTI Extension Function identifier: com.ibm.RegisterTracePointSubscriber
Macro declaration in the ibmjvmti.h
file: COM_IBM_REGISTER_TRACEPOINT_SUBSCRIBER
jvmtiTraceSubscriber
function
-
The subscriber function type is defined as follows:
typedef jvmtiError (*jvmtiTraceSubscriber)(jvmtiEnv *jvmti_env, void *record, jlong length, void *user_data);
The subscriber function must be of type
jvmtiTraceSubscriber
, which is declared inibmjvmti.h
.This function is called with each tracepoint record that is selected through the
-Xtrace:external
option.The tracepoint record that is supplied to the subscriber function is valid only for the duration of the function. If the subscriber wants to save the data, the data must be copied elsewhere.
If the subscriber function returns an error, the alarm function is called, the subscription is disconnected, and no further tracepoints are sent to the subscriber.
Subscriber function parameters
jvmti_env
: A pointer to the JVMTI environment.record
: A UTF-8 string that contains a tracepoint record.length
: The number of UTF-8 characters in the tracepoint record.user_data
: User data that is supplied when the subscriber is registered.
jvmtiTraceAlarm
function
-
The alarm function type is defined as follows:
typedef jvmtiError (*jvmtiTraceAlarm)(jvmtiEnv *jvmti_env, void *subscription_id, void *user_data);
The alarm function must be of type
jvmtiTraceAlarm
, which is declared inibmjvmti.h
. This function is called if the subscriber function returns an error.Alarm function parameters
jvmti_env
: A pointer to the JVMTI environment.subscription_id
: The subscription identifier.user_data
: User data that is supplied when the subscriber is registered.
DeregisterTracePointSubscriber
You can unsubscribe from VM tracepoints by using the DeregisterTracePointSubscriber()
API:
jvmtiError DeregisterTracePointSubscriber(jvmtiEnv* jvmti_env, void *userData, void *subscription_id)
After the DeregisterTracePointSubscriber()
API is called, no further calls are made to the subscriber function.
Parameters
jvmti_env
: A pointer to the JVMTI environment.subscription_id
: The subscription identifier that is returned by the call to the RegisterTracePointSubscriber API.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: The subscription_id
parameter is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is not valid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
Identifiers
JVMTI Extension Function identifier: com.ibm.DeregisterTracePointSubscriber
Macro declaration in the ibmjvmti.h
file: COM_IBM_DEREGISTER_TRACEPOINT_SUBSCRIBER
GetMemoryCategories
You can query runtime environment native memory categories by using the GetMemoryCategories()
API:
jvmtiError GetMemoryCategories(jvmtiEnv* env, jint version, jint max_categories, jvmtiMemoryCategory * categories_buffer, jint * written_count_ptr, jint * total_categories_ptr);
You can query the total native memory consumption of the runtime environment for each memory category by using this API. Native memory is memory requested from the operating system using library functions such as malloc()
and mmap()
. Runtime environment native memory use is grouped under high-level memory categories, as described in the NATIVEMEMINFO
section of the Java dump topic. The data returned by the GetMemoryCategories()
API is consistent with this format. See Java dump: NATIVEMEMINFO.
The extension writes native memory information to a memory buffer specified by the user. Each memory category is recorded as a jvmtiMemoryCategory
structure, whose format is defined in ibmjvmti.h
.
You can use the GetMemoryCategories()
API to work out the buffer size you must allocate to hold all memory categories defined inside the VM. To calculate the size, call the API with a null categories_buffer
argument and a non-null total_categories_ptr
argument.
Parameters
env
: A pointer to the JVMTI environment.version
: The version of thejvmtiMemoryCategory
structure that you are using. UseCOM_IBM_GET_MEMORY_CATEGORIES_VERSION_1
for this argument, unless you must work with an obsolete version of thejvmtiMemoryCategory
structure.max_categories
: The number ofjvmtiMemoryCategory
structures that can fit in thecategories_buffer
memory buffer.categories_buffer
: A pointer to the memory buffer for holding the result of theGetMemoryCategories()
call. The number ofjvmtiMemoryCategory
slots available in thecategories_buffer
memory buffer must be accurately specified withmax_categories
, otherwiseGetMemoryCategories()
can overflow the memory buffer. The value can be null.written_count_ptr
: A pointer tojint
to store the number ofjvmtiMemoryCategory
structures to be written to thecategories_buffer
memory buffer. The value can be null.total_categories_ptr
: A pointer tojint
to store the total number of memory categories declared in the VM. The value can be null.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_UNSUPPORTED_VERSION
: Unrecognized value passed for version.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: Illegal argument; categories_buffer
, count_ptr
, and total_categories_ptr
all have null values.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The env
parameter is invalid.
JVMTI_ERROR_OUT_OF_MEMORY
: Memory category data is truncated because max_categories
is not large enough.
Identifiers
JVMTI Extension Function identifier: com.ibm.GetMemoryCategories
Macro declaration in the ibmjvmti.h
file: COM_IBM_GET_MEMORY_CATEGORIES
QueryVmLogOptions
You can query VM log options by using the QueryVmLogOptions()
API:
jvmtiError QueryVmLogOptions(jvmtiEnv* jvmti_env, jint buffer_size, void* options, jint* data_size_ptr)
This extension returns the current log options as an ASCII string. The syntax of the string is the same as the -Xsyslog
command-line option, with the initial -Xsyslog:
omitted. For example, the string "error,warn" indicates that the VM is set to log error and warning messages only. For more information, see -Xsyslog
.
Parameters
jvmti_env
: A pointer to the JVMTI environment.buffer_size
: The size of the supplied memory buffer in bytes. If the memory buffer is too small to contain the current VM log option string, theJVMTI_ERROR_ILLEGAL_ARGUMENT
error message is returned.options_buffer
: A pointer to the supplied memory buffer.data_size_ptr
: A pointer to a variable, used to return the total size of the option string.
Returns
JVMTI_ERROR_NONE
: Success
JVMTI_ERROR_NULL_POINTER
: The options
or data_size_ptr
parameters are null.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: The supplied memory buffer is too small.
Identifiers
JVMTI Extension Function identifier: com.ibm.QueryVmLogOptions
Macro declaration in the ibmjvmti.h
file: COM_IBM_QUERY_VM_LOG_OPTIONS
SetVmLogOptions
You can set VM log options by using the SetVmLogOptions()
API:
jvmtiError SetVmLogOptions(jvmtiEnv* jvmti_env, char* options_buffer)
The log option is passed in as an ASCII character string. Use the same syntax as the -Xsyslog
command-line option, with the initial -Xsyslog:
omitted. For example, to set the VM to log error and warning messages, pass in a string containing "error,warn". For more information, see -Xsyslog
.
Parameters
jvmti_env
: A pointer to the JVMTI environment.options_buffer
: A pointer to memory containing the log option.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: The parameter option is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is invalid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: The parameter option contains an invalid -Xsyslog
string.
Identifiers
JVMTI Extension Function identifier: com.ibm.SetVmLogOptions
Macro declaration in the ibmjvmti.h
file: COM_IBM_SET_VM_LOG_OPTIONS
IterateSharedCaches
You can search for shared classes caches that exist in a specified cache directory by using the IterateSharedCaches()
API:
jvmtiError IterateSharedCaches(jvmtiEnv* env, jint version, const char *cacheDir, jint flags, jboolean useCommandLineValues, jvmtiIterateSharedCachesCallback callback, void *user_data);
Information about the caches is returned in a structure that is populated by a user-specified callback function. You can specify the search directory in two ways:
- Set the value of
useCommandLineValues
totrue
and specify the directory on the command line. If the directory is not specified on the command line, the default location for the platform is used. - Set the value of
useCommandLineValues
tofalse
and use thecacheDir
parameter. To accept the default location for the platform, specifycacheDir
with anull
value.
Parameters
env
: A pointer to the JVMTI environment.version
: Version information forIterateSharedCaches
, which describes thejvmtiSharedCacheInfo
structure passed to thejvmtiIterateSharedCachesCallback
function. The values allowed are:COM_IBM_ITERATE_SHARED_CACHES_VERSION_1
COM_IBM_ITERATE_SHARED_CACHES_VERSION_2
COM_IBM_ITERATE_SHARED_CACHES_VERSION_3
COM_IBM_ITERATE_SHARED_CACHES_VERSION_4
COM_IBM_ITERATE_SHARED_CACHES_VERSION_5
cacheDir
: When the value ofuseCommandLineValues
isfalse
, specify the absolute path of the directory for the shared classes cache. If the value isnull
, the platform-dependent default is used.flags
: Reserved for future use. The only value allowed isCOM_IBM_ITERATE_SHARED_CACHES_NO_FLAGS
.useCommandLineValues
: Set this value totrue
when you want to specify the cache directory on the command line. Set this value tofalse
when you want to use thecacheDir
parameter.callback
: A function pointer to a user provided callback routinejvmtiIterateSharedCachesCallback
.user_data
: User supplied data, passed as an argument to the callback function.jint (JNICALL *jvmtiIterateSharedCachesCallback)(jvmtiEnv *env,jvmtiSharedCacheInfo *cache_info, void *user_data);
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The env
parameter is not valid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_UNSUPPORTED_VERSION
: The version
parameter is not valid.
JVMTI_ERROR_NULL_POINTER
: The callback
parameter is null.
JVMTI_ERROR_NOT_AVAILABLE
: The shared classes feature is not enabled in the VM.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: The flags
parameter is not valid.
JVMTI_ERROR_INTERNAL
: This error is returned when the jvmtiIterateSharedCachesCallback
returns JNI_ERR
.
Identifiers
JVMTI Extension Function identifier: com.ibm.IterateSharedCaches
Macro declaration in the ibmjvmti.h
file: COM_IBM_ITERATE_SHARED_CACHES
jvmtiIterateSharedCachesCallback
function
-
Callback function parameters
env
: A pointer to the JVMTI environment when callingCOM_IBM_ITERATE_SHARED_CACHES
.cache_info
: AjvmtiSharedCacheInfo
structure containing information about a shared cache.user_data
: User-supplied data, passed as an argument toIterateSharedCaches
.
Callback function returns
JNI_OK
: Continue iterating.
JNI_ERR
: Stop iterating, which causesIterateSharedCaches
to returnJVMTI_ERROR_INTERNAL
jvmtiSharedCacheInfo
structure
-
The structure of
jvmtiSharedCacheInfo
typedef struct jvmtiSharedCacheInfo { const char *name; // the name of the shared cache jboolean isCompatible; // if the shared cache is compatible with this VM jboolean isPersistent; // true if the shared cache is persistent, false if its non-persistent jint os_shmid; // the OS shared memory ID associated with a non-persistent cache, -1 otherwise jint os_semid; // the OS shared semaphore ID associated with a non-persistent cache, -1 otherwise jint modLevel; // one of: // COM_IBM_SHARED_CACHE_MODLEVEL_JAVA5 // COM_IBM_SHARED_CACHE_MODLEVEL_JAVA6 // COM_IBM_SHARED_CACHE_MODLEVEL_JAVA7 // COM_IBM_SHARED_CACHE_MODLEVEL_JAVA8 // COM_IBM_SHARED_CACHE_MODLEVEL_JAVA9 // from Java 10: the version number of the Java level on which the shared cache is created jint addrMode; // the address mode of the VM creating the shared cache: includes additional // information on whether it is a 64-bit compressedRefs cache when // COM_IBM_ITERATE_SHARED_CACHES_VERSION_3 or later is specified. jboolean isCorrupt; // if the cache is corrupted jlong cacheSize; // the total usable shared classes cache size, or -1 when isCompatible is false jlong freeBytes; // the number of free bytes in the shared classes cache, or -1 when isCompatible is false jlong lastDetach; // the last detach time specified in milliseconds since 00:00:00 on 1 January 1970 UTC, // or -1 when the last detach time is not available jint cacheType; // the type of the cache jlong softMaxBytes; // the soft limit for the available space in the cache jint layer; // the shared cache layer number } jvmtiSharedCacheInfo;
Notes:
-
The field
cacheType
is included whenCOM_IBM_ITERATE_SHARED_CACHES_VERSION_2
or later is specified. -
jvmtiSharedCacheInfo.addrMode
encodes both address mode and the compressed reference mode whenCOM_IBM_ITERATE_SHARED_CACHES_VERSION_3
or later is specified. In this case, use the following set of macros to access the address mode and compressed reference mode:
-
To get the address mode, use:
COM_IBM_ITERATE_SHARED_CACHES_GET_ADDR_MODE(jvmtiSharedCacheInfo.addrMode)
This macro returns one of the following values:
COM_IBM_SHARED_CACHE_ADDRMODE_32
COM_IBM_SHARED_CACHE_ADDRMODE_64
-
To get the compressed references mode, use:
COM_IBM_ITERATE_SHARED_CACHES_GET_CMPRSSREF_MODE(jvmtiSharedCacheInfo.addrMode)
This macro returns one of the following values:
COM_IBM_ITERATE_SHARED_CACHES_UNKNOWN_COMPRESSED_POINTERS_MODE
COM_IBM_ITERATE_SHARED_CACHES_COMPRESSED_POINTERS_MODE
COM_IBM_ITERATE_SHARED_CACHES_NON_COMPRESSED_POINTERS_MODE
-
The field
softMaxBytes
is included whenCOM_IBM_ITERATE_SHARED_CACHES_VERSION_4
or later is specified. -
The field
layer
is included whenCOM_IBM_ITERATE_SHARED_CACHES_VERSION_5
or later is specified. If the shared cache does not have a layer number, the value forlayer
is-1
.
-
DestroySharedCache
You can remove a shared classes cache by using the DestroySharedCache()
API:
jvmtiError DestroySharedCache(jvmtiEnv *env, const char *cacheDir, const char *name, jint persistence, jboolean useCommandLineValues, jint *internalErrorCode);
This extension removes a named shared classes cache of a given persistence type, in a given directory. You can specify the cache name, persistence type, and directory in one of these ways:
-
Set
useCommandLineValues
totrue
and specify the values on the command line. If a value is not available, the default values for the platform are used. -
Set
useCommandLineValues
tofalse
and use thecacheDir
,persistence
andcacheName
parameters to identify the cache to be removed. To accept the default value forcacheDir
orcacheName
, specify the parameter with anull
value.
Parameters
env
: A pointer to the JVMTI environment.cacheDir
: When the value ofuseCommandLineValues
isfalse
, specify the absolute path of the directory for the shared classes cache. If the value isnull
, the platform-dependent default is used.cacheName
: When the value ofuseCommandLineValues
isfalse
, specify the name of the cache to be removed. If the value isnull
, the platform-dependent default is used.persistence
: When the value ofuseCommandLineValues
is false, specify the type of cache to remove. This parameter must have one of the following values:
PERSISTENCE_DEFAULT
(The default value for the platform).
PERSISTENT
NONPERSISTENT
useCommandLineValues
: Set this value totrue
when you want to specify the shared classes cache name, persistence type, and directory on the command line. Set this value tofalse
when you want to use thecacheDir
,persistence
, andcacheName
parameters instead.internalErrorCode
: If notnull
, this value is set to one of the following constants whenJVMTI_ERROR_INTERNAL
is returned:COM_IBM_DESTROYED_ALL_CACHE
: Set whenJVMTI_ERROR_NONE is
returned.COM_IBM_DESTROYED_NONE
: Set when the function fails to remove any caches.COM_IBM_DESTROY_FAILED_CURRENT_GEN_CACHE
: Set when the function fails to remove the existing current generation cache, irrespective of the state of older generation caches.COM_IBM_DESTROY_FAILED_OLDER_GEN_CACHE
: Set when the function fails to remove any older generation caches. The current generation cache does not exist or is successfully removed.
Returns
JVMTI_ERROR_NONE
: Success. No cache exists or all existing caches of all generations are removed.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The env
parameter is not valid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_NOT_AVAILABLE
: The shared classes feature is not enabled in the VM.
JVMTI_ERROR_ILLEGAL_ARGUMENT
: The persistence
parameter is not valid.
JVMTI_ERROR_INTERNAL
: Failed to remove any existing cache with the given name. See the value of the internalErrorCode
parameter for more information about the failure.
Identifiers
JVMTI Extension Function identifier: com.ibm.DestroySharedCache
Macro declaration in the ibmjvmti.h
file: COM_IBM_DESTROY_SHARED_CACHE
RegisterVerboseGCSubscriber
You can subscribe to verbose garbage collection (GC) data logging by using the RegisterVerboseGCSubscriber()
API:
jvmtiError RegisterVerboseGCSubscriber(jvmtiEnv* jvmti_env, char *description, jvmtiVerboseGCSubscriber subscriber, jvmtiVerboseGCAlarm alarm, void *user_data, void **subscription_id)
Parameters
jvmti_env
: A pointer to the JVMTI environment.description
: An ASCII character string that describes the subscriber.subscriber
: A function of typejvmtiVerboseGCSubscriber
.alarm
: A function pointer of typejvmtiVerboseGCAlarm
.user_data
: A pointer to user data. This pointer is passed to the subscriber and alarm functions each time these functions are called. This pointer can be a null value.subscription_id
: A pointer to a subscription identifier. This pointer is returned by theRegisterVerboseGCSubscriber
call if successful. The value must be supplied to a future call toDeregisterVerboseGCSubscriber
API, which is used to unsubscribe from verbose GC data logging.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: One of the supplied parameters is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is not valid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
JVMTI_ERROR_NOT_AVAILABLE
: GC verbose logging is not available.
JVMTI_ERROR_INTERNAL
: An internal error has occurred.
Identifiers
JVMTI Extension Function identifier: com.ibm.RegisterVerboseGCSubscriber
Macro declaration in the ibmjvmti.h
file: COM_IBM_REGISTER_VERBOSEGC_SUBSCRIBER
jvmtiVerboseGCSubscriber
function
-
The subscriber function type is defined as follows:
typedef jvmtiError (*jvmtiVerboseGCSubscriber)(jvmtiEnv *jvmti_env, const char *record, jlong length, void *user_data);
The subscriber function must be of type
jvmtiVerboseGCSubscriber
, which is declared inibmjvmti.h
.This function is called with each record of verbose logging data produced by the VM.
This function runs under the same restrictions as the
GarbageCollectionStart
andGarbageCollectionFinish
events in the standard JVMTI specification. For more information about these events, see the JVMTI Event Index for your OpenJDK version.The verbose logging record supplied to the subscriber function is valid only for the duration of the function. If the subscriber wants to save the data, the data must be copied elsewhere.
If the subscriber function returns an error, the alarm function is called, and the subscription is deregistered.
Subscriber function parameters
jvmti_env
: A pointer to the JVMTI environment.record
: An ASCII string that contains a verbose log record.length
: The number of ASCII characters in the verbose log record.user_data
: User data supplied when the subscriber is registered.
jvmtiVerboseGCAlarm
function
-
The alarm function type is defined as follows:
typedef jvmtiError (*jvmtiVerboseGCAlarm)(jvmtiEnv *jvmti_env, void *subscription_id, void *user_data);
The alarm function must be of type
jvmtiVerboseGCAlarm
, which is declared inibmjvmti.h
. This function is called if the subscriber function returns an error.This function runs under the same restrictions as the
GarbageCollectionStart
andGarbageCollectionFinish
events in the standard JVMTI specification. For more information about these events, see the JVMTI Event Index for your OpenJDK version.Alarm function parameters
jvmti_env
: A pointer to the JVMTI environment.user_data
: User data supplied when the subscriber is registered.subscription_id
: The subscription identifier.
DeregisterVerboseGCSubscriber
You can unsubscribe from verbose Garbage Collection (GC) data logging by using the DeregisterVerboseGCSubscriber()
API:
jvmtiError DeregisterVerboseGCSubscriber(jvmtiEnv* jvmti_env, void *userData, void *subscription_id)
After the DeregisterVerboseGCSubscriber()
API is called, no further calls are made to the previously registered subscriber function.
Parameters
jvmti_env
: A pointer to the JVMTI environment.subscription_id
: The subscription identifier that is returned by the call to the RegisterVerboseGCSubscriber() API.
Returns
JVMTI_ERROR_NONE
: Success.
JVMTI_ERROR_NULL_POINTER
: The subscription_id
parameter is null.
JVMTI_ERROR_OUT_OF_MEMORY
: There is insufficient system memory to process the request.
JVMTI_ERROR_INVALID_ENVIRONMENT
: The jvmti_env
parameter is not valid.
JVMTI_ERROR_WRONG_PHASE
: The extension has been called outside the JVMTI live phase.
Identifiers
JVMTI Extension Function identifier: com.ibm.DeregisterVerboseGCSubscriber
Macro declaration in the ibmjvmti.h
file: COM_IBM_DEREGISTER_VERBOSEGC_SUBSCRIBER