The JConsole graphical user interface is a monitoring tool that complies to the
Java Management Extensions (JMX) specification. JConsole uses the extensive instrumentation of the
Java Virtual Machine (Java VM) to provide information about the performance and resource
consumption of applications running on the Java platform.
In the Java Platform, Standard Edition (Java SE platform) 6, JConsole has been
updated to present the look and feel of the Windows and GNOME
desktops (other platforms will present the standard Java graphical look and feel). The screen
captures presented in this document were taken from an instance of the interface
running on Windows XP.
Starting JConsole
The jconsole executable can be found in JDK_HOME/bin, where JDK_HOME is the directory
in which the Java Development Kit (JDK) is installed. If this directory
is in your system path, you can start JConsole by simply typing
jconsole in a command (shell) prompt. Otherwise, you have to type the full
path to the executable file.
Command Syntax
You can use JConsole to monitor both local applications, namely those running on
the same system as JConsole, as well as remote applications, namely those running
on other systems.
Note - Using JConsole to monitor a local application is useful for development and for
creating prototypes, but is not recommended for production environments, because JConsole itself consumes
significant system resources. Remote monitoring is recommended to isolate the JConsole application from
the platform being monitored.
You start JConsole by typing the following command at the command line.
% jconsole
When JConsole starts, you will be given a choice of all the
Java applications that are running locally that JConsole can connect to.
If you want to monitor a specific application, and you know that
application's process ID, then you can also start JConsole so that it connects
to that application. This application must be running with the same user ID
as JConsole. The command syntax to start JConsole for local monitoring of a
specific application is the following.
% jconsole processID
In the command above processID is the application's process ID (PID). You can
determine an application's PID in the following ways:
On UNIX or Linux systems, you can use the ps command to find the PID of the java instance that is running.
On Windows systems, you can use the Task Manager to find the PID of java or javaw.
For example, if you determined that the process ID of the Notepad
application is 2956, then you would start JConsole with the following command.
% jconsole 2956
Both JConsole and the application must by executed by the same user. The
management and monitoring system uses the operating system's file permissions. If you
do not specify a process ID, JConsole will automatically detect all local Java
applications, and display a dialog box that lets you select which one you
want to monitor (see Connecting to a JMX Agent).
To start JConsole for remote monitoring, you use the following command syntax.
% jconsole hostName:portNum
In the command above, hostName is the name of the system running the
application and portNum is the port number you specified when you enabled the
JMX agent when you started the Java VM. For more information, see Remote Monitoring and Management.
If you do not specify a host name/port number combination, then JConsole will
display a connection dialog box (Connecting to a JMX Agent) to enable you to enter a
host name and port number.
If you start JConsole with arguments specifying a JMX agent to connect to,
it will automatically start monitoring the specified Java VM. You can connect to
a different host at any time by choosing Connection | New Connection and
entering the necessary information.
Otherwise, if you do not provide any arguments when you start JConsole, the
first thing you see is the connection dialog box. This dialog
box has two options, allowing connections to either Local or Remote processes.
Dynamic Attach
Under previous releases of the Java SE platform, applications that you wanted to
monitor with JConsole needed to be started with the following option.
% -Dcom.sun.management.jmxremote
However, the version of JConsole provided with the Java SE 6 platform can
attach to any application that supports the Attach API. In other words, any
application that is started in the Java SE 6 HotSpot VM is
detected automatically by JConsole, and does not need to be started using the
above command-line option.
Connecting JConsole to a Local Process
If you start JConsole without providing a specific JMX agent to connect to,
you will see the following dialog window.
Figure 3-1 Creating a Connection to a Local Process
The Local Process option lists any Java VMs running on the local
system that were started with the same user ID as JConsole, along with
their process ID and their class and/or argument information. To connect JConsole to
your application, select the application you want to monitor, then click the Connect button.
The list of local processes includes applications running in the following types of
Java VM.
Applications with the management agent enabled. These include applications on the Java SE 6 platform or on the J2SE 5.0 platform that were started with the -Dcom.sun.management.jmxremote option or with the -Dcom.sun.management.jmxremote.port option specified. In addition, the list also includes any applications that were started on the Java SE 6 platform without any management properties but which are later attached to by JConsole, which enables the management agent at runtime.
Applications that are attachable, with the management agent disabled. An attachable application supports loading the management agent at runtime. Attachable applications include applications that are started on the Java SE 6 platform that support the Attach API. Applications which support dynamic attach do not require the management agent to be started by specifying the com.sun.management.jmxremote or com.sun.management.jmxremote.port options at the command line, and JConsole does not need to connect to the management agent before the application is started. If you select this application, you will be informed in a note onscreen that the management agent will be enabled when the connection is made. In the example connection dialog shown in Figure 3-1, the NetBeans IDE and JConsole itself were both started within a Java SE 6 platform VM. Both appear in normal text, meaning that JConsole can connect to them. In Figure 3-1, JConsole is selected, and the note is visible.
Applications that are not attachable, with the management agent disabled. These include applications started on a J2SE 1.4.2 platform or started on a J2SE 5.0 platform without the -Dcom.sun.management.jmxremote or com.sun.management.jmxremote.port options. These applications appear grayed-out in the table and JConsole cannot connect to them. In the example connection dialog shown in Figure 3-1, the Anagrams application was started with a J2SE 5.0 platform VM without any of the management properties to enable the JMX agent, and consequently shows up in gray and cannot be selected.
Figure 3-2 Attempting to Connect to an Application without the Management Agent Enabled
In the example connection dialog shown in Figure 3-2, you can see that
the Anagrams application has been selected by clicking on it, but the Connect
button remains grayed-out and a note has appeared informing you that the management
agent is not enabled for this process. JConsole cannot connect to Anagrams because it
was not started with the correct Java VM or with the correct
options.
Connecting JConsole to a Remote Process
When the connection dialog opens, you are also given the option of
connecting to a remote process.
Figure 3-3 Creating a Connection to a Remote Process
To monitor a process running on a remote Java VM, you must
provide the following information.
Host name: name of the machine on which the Java VM is running.
Port number: the JMX agent port number you specified when you started the Java VM.
User name and password: the user name and password to use (required only if monitoring a Java VM through a JMX agent that requires password authentication).
To monitor the Java VM that is running JConsole, simply click Connect, using
host localhost and the port 0.
Connecting Using a JMX Service URL
You can also use the Remote Process option to connect to other
JMX agents by specifying their JMX service URL, and the user name and
password. The syntax of a JMX service URL requires that you provide
the transport protocol used to make the connection, as well as a service
access point. The full syntax for a JMX service URL is described in
the API documentation for javax.management.remote.JMXServiceURL.
Figure 3-4 Connecting to a JMX Agent Using the JMX Service URL
If the JMX agent uses a connector which is not included
in the Java platform, you need to add the connector classes to the
class path when you run the jconsole command, as follows.
In the command above, connector-path is the directory or the Java archive (Jar)
file containing the connector classes that are not included in the JDK, that
are to be used by JConsole.
Presenting the JConsole Tabs
Once you have connected JConsole to an application, JConsole is composed of six
tabs.
Overview: Displays overview information about the Java VM and monitored values.
Memory: Displays information about memory use.
Threads: Displays information about thread use.
Classes: Displays information about class loading.
VM: Displays information about the Java VM.
MBeans: Displays information about MBeans.
You can use the green connection status icon in the upper right-hand corner
of JConsole at any time, to disconnect from or reconnect to a
running Java VM. You can connect to any number of running Java VMs
at a time by selecting Connection then New Connection from the drop-down menu.
Viewing Overview Information
The Overview tab displays graphical monitoring information about CPU usage, memory usage, thread
counts, and the classes loaded in the Java VM, all in a single
screen.
Figure 3-5 Overview Tab
The Overview tab provides an easy way to correlate information that was previously
only available by switching between multiple tabs.
Saving Chart Data
JConsole allows you to save the data presented in the charts in
a Comma Separated Values (CSV) file. To save data from a chart, simply
right-click on any chart, select Save data as..., and then specify the file in which the
data will be saved. You can save the data from any of the
charts displayed in any of JConsole's different tabs in this way.
The CSV format is commonly used for data exchange between spreadsheet applications. The
CSV file can be imported into spreadsheet applications and can be used to
create diagrams in these applications. The data is presented as two or more
named columns, where the first column represents the time stamps. After importing the
file into a spreadsheet application, you will usually need to select the first
column and change its format to be "date" or "date/time" as appropriate.
Monitoring Memory Consumption
The Memory tab provides information about memory consumption and memory pools.
Figure 3-6 Memory Tab
The Memory tab features a “Perform GC” button that you can click to
perform garbage collection whenever you want. The chart shows the memory use of
the Java VM over time, for heap and non-heap memory, as well as
for specific memory pools. The memory pools available depend on which version of
the Java VM is being used. For the HotSpot Java VM, the
memory pools for serial garbage collection are the following.
Eden Space (heap): The pool from which memory is initially allocated for most objects.
Survivor Space (heap): The pool containing objects that have survived the garbage collection of the Eden space.
Tenured Generation (heap): The pool containing objects that have existed for some time in the survivor space.
Permanent Generation (non-heap): The pool containing all the reflective data of the virtual machine itself, such as class and method objects. With Java VMs that use class data sharing, this generation is divided into read-only and read-write areas.
Code Cache (non-heap): The HotSpot Java VM also includes a code cache, containing memory that is used for compilation and storage of native code.
You can display different charts for charting the consumption of these memory pools
by choosing from the options in the Chart drop-down menu. Also, clicking on
either of the Heap or Non-Heap bar charts in the bottom right-hand corner
will switch the chart displayed. Finally, you can specify the time range over
which you track memory usage by selecting from the options in the Time Range
drop-down menu.
For more information about these memory pools, see Garbage Collection below.
The Details area shows several current memory metrics:
Used: the amount of memory currently used, including the memory occupied by all objects, both reachable and unreachable.
Committed: the amount of memory guaranteed to be available for use by the Java VM. The amount of committed memory may change over time. The Java virtual machine may release memory to the system and the amount of committed memory could be less than the amount of memory initially allocated at start up. The amount of committed memory will always be greater than or equal to the amount of used memory.
Max: the maximum amount of memory that can be used for memory management. Its value may change or be undefined. A memory allocation may fail if the Java VM attempts to increase the used memory to be greater than committed memory, even if the amount used is less than or equal to max (for example, when the system is low on virtual memory).
GC time: the cumulative time spent on garbage collection and the total number of invocations. It may have multiple rows, each of which represents one garbage collector algorithm used in the Java VM.
The bar chart on the lower right-hand side shows the memory consumed by
the memory pools in heap and non-heap memory. The bar will
turn red when the memory used exceeds the memory usage threshold. You
can set the memory usage threshold through an attribute of the MemoryMXBean.
Heap and Non-Heap Memory
The Java VM manages two kinds of memory: heap and non-heap memory,
both of which are created when the Java VM starts.
Heap memory is the runtime data area from which the Java VM allocates memory for all class instances and arrays. The heap may be of a fixed or variable size. The garbage collector is an automatic memory management system that reclaims heap memory for objects.
Non-heap memory includes a method area shared among all threads and memory required for the internal processing or optimization for the Java VM. It stores per-class structures such as a runtime constant pool, field and method data, and the code for methods and constructors. The method area is logically part of the heap but, depending on the implementation, a Java VM may not garbage collect or compact it. Like the heap memory, the method area may be of a fixed or variable size. The memory for the method area does not need to be contiguous.
In addition to the method area, a Java VM may require memory
for internal processing or optimization which also belongs to non-heap memory. For example, the
Just-In-Time (JIT) compiler requires memory for storing the native machine code translated from
the Java VM code for high performance.
Memory Pools and Memory Managers
Memory pools and memory managers are key aspects of the Java VM's
memory system.
A memory pool represents a memory area that the Java VM manages. The Java VM has at least one memory pool and it may create or remove memory pools during execution. A memory pool can belong either to heap or to non-heap memory.
A memory manager manages one or more memory pools. The garbage collector is a type of memory manager responsible for reclaiming memory used by unreachable objects. A Java VM may have one or more memory managers. It may add or remove memory managers during execution. A memory pool can be managed by more than one memory manager.
Garbage Collection
Garbage collection (GC) is how the Java VM frees memory occupied by objects
that are no longer referenced. It is common to think of objects
that have active references as being "alive" and non-referenced (or unreachable) objects as "dead."
Garbage collection is the process of releasing memory used by the dead objects.
The algorithms and parameters used by GC can have dramatic effects on performance.
The Java HotSpot VM garbage collector uses generational GC. Generational GC takes advantage
of the observation that most programs conform to the following generalizations.
They create many objects that have short lives, for example, iterators and local variables.
They create some objects that have very long lives, for example, high level persistent objects.
Generational GC divides memory into several generations, and assigns one or more memory
pools to each. When a generation uses up its allotted memory, the VM
performs a partial GC (also called a minor collection) on that memory pool
to reclaim memory used by dead objects. This partial GC is usually
much faster than a full GC.
The Java HotSpot VM defines two generations: the young generation (sometimes called the
"nursery") and the old generation. The young generation consists of an "Eden space"
and two "survivor spaces." The VM initially assigns all objects to the Eden
space, and most objects die there. When it performs a minor GC, the
VM moves any remaining objects from the Eden space to one of the
survivor spaces. The VM moves objects that live long enough in the
survivor spaces to the "tenured" space in the old generation. When the tenured
generation fills up, there is a full GC that is often much slower
because it involves all live objects. The permanent generation holds all the reflective
data of the virtual machine itself, such as class and method objects.
The default arrangement of generations looks something like Figure 3-7.
Figure 3-7 Generations of Data in Garbage Collection
If the garbage collector has become a bottleneck, you can improve performance by
customizing the generation sizes. Using JConsole, you can investigate the sensitivity of your
performance metric by experimenting with the garbage collector parameters. For more information, see
Tuning Garbage Collection with the 5.0 HotSpot VM.
Monitoring Thread Use
The Threads tab provides information about thread use.
Figure 3-8 Threads Tab
The Threads list in the lower left corner lists all the active
threads. If you enter a string in the Filter field, the Threads list
will show only those threads whose name contains the string you enter. Click
on the name of a thread in the Threads list to display information
about that thread to the right, including the thread name, state, and stack
trace.
The chart shows the number of live threads over time. Two lines
are shown.
Red: peak number of threads
Blue: number of live threads.
The Threading MXBean provides several other useful operations that are not covered by
the Threads tab.
findMonitorDeadlockedThreads: Detects if any threads are deadlocked on the object monitor locks. This operation returns an array of deadlocked thread IDs.
getThreadInfo: Returns the thread information. This includes the name, stack trace, and the monitor lock that the thread is currently blocked on, if any, and which thread is holding that lock, as well as thread contention statistics.
getThreadCpuTime: Returns the CPU time consumed by a given thread
You can access these additional features via the MBeans tab by selecting the
Threading MXBean in the MBeans tree. This MXBean lists all the attributes and
operations for accessing threading information in the Java VM being monitored. See Monitoring and Managing MBeans.
Detecting Deadlocked Threads
To check if your application has run into a deadlock (for example,
your application seems to be hanging), deadlocked threads can be detected by clicking on
the "Detect Deadlock" button. If any deadlocked threads are detected, these are displayed
in a new tab that appears next to the "Threads" tab, as
shown in Figure 3-9.
Figure 3-9 Deadlocked Threads
The Detect Deadlock button will detect deadlock cycles involving object monitors and java.util.concurrent
ownable synchronizers (see the API specification documentation for java.lang.management.LockInfo). Monitoring support for java.util.concurrent
locks has been added in Java SE 6. If JConsole connects to a
J2SE 5.0 VM, the Detect Deadlock mechanism will only find deadlocks related to
object monitors. JConsole will not show any deadlocks related to ownable synchronizers.
See the API documentation for java.lang.Thread for more information about threads and daemon
threads.
Monitoring Class Loading
The Classes tab displays information about class loading.
Figure 3-10 Classes Tab
The chart plots the number of classes loaded over time.
The red line is the total number of classes loaded (including those subsequently unloaded).
The blue line is the current number of classes loaded.
The Details section at the bottom of the tab displays the total
number of classes loaded since the Java VM started, the number currently loaded
and the number unloaded. You can set the tracing of class loading to
verbose output by checking the checkbox in the top right-hand corner.
Viewing VM Information
The VM Summary tab provides information about the Java VM.
Figure 3-11 VM Summary Tab
The information presented in this tab includes the following.
Summary
Uptime: Total amount of time since the Java VM was started.
Process CPU Time: Total amount of CPU time that the Java VM has consumed since it was started.
Total Compile Time: Total accumulated time spent in JIT compilation. The Java VM determines when JIT compilation occurs. The Hotspot VM uses adaptive compilation, in which the VM launches an application using a standard interpreter, but then analyzes the code as it runs to detect performance bottlenecks, or "hot spots".
Threads
Live threads: Current number of live daemon threads plus non-daemon threads.
Peak: Highest number of live threads since Java VM started.
Daemon threads: Current number of live daemon threads.
Total threads started: Total number of threads started since Java VM started, including daemon, non-daemon, and terminated threads.
Classes
Current classes loaded: Number of classes currently loaded into memory.
Total classes loaded: Total number of classes loaded into memory since the Java VM started, including those that have subsequently been unloaded.
Total classes unloaded: Number of classes unloaded from memory since the Java VM started.
Memory
Current heap size: Number of kilobytes currently occupied by the heap.
Committed memory: Total amount of memory allocated for use by the heap.
Maximum heap size: Maximum number of kilobytes occupied by the heap.
Objects pending for finalization: Number of objects pending for finalization.
Garbage collector: Information about garbage collection, including the garbage collector names, number of collections performed, and total time spent performing GC.
Operating System
Total physical memory: Amount of random-access memory (RAM) the operating system has.
Free physical memory: Amount of free RAM available to the operating system.
Committed virtual memory: Amount of virtual memory guaranteed to be available to the running process.
Other Information
VM arguments: The input arguments the application passed to the Java VM, not including the arguments to the main method.
Class path: The class path that is used by the system class loader to search for class files.
Library path: The list of paths to search when loading libraries.
Boot class path: The boot class path is used by the bootstrap class loader to search for class files.
Monitoring and Managing MBeans
The MBeans tab displays information about all the MBeans registered with the platform
MBean server in a generic way. The MBeans tab allows you to access
the full set of the platform MXBean instrumentation, including that which is not
visible in the other tabs. In addition, you can monitor and manage your
application's MBeans using the MBeans tab.
Figure 3-12 MBeans Tab
The tree on the left shows all the MBeans currently running. When
you select an MBean in the tree, its MBeanInfo and its MBean Descriptor are
both displayed on the right, and any attributes, operations or notifications appear in
the tree below it.
All the platform MXBeans and their various operations and attributes are accessible via
JConsole's MBeans tab.
Constructing the MBean Tree
By default, the MBeans are displayed in the tree based on their
object names. The order of key properties specified when the object names are
created is preserved by JConsole when it adds MBeans to the MBean tree.
The exact key property list that JConsole will use to build the MBean
tree will be the one returned by the method ObjectName.getKeyPropertyListString(), with type as the
first key, and j2eeType, if present, as the second key.
However, relying on the default order of the ObjectName key properties can sometimes
lead to unexpected behavior when JConsole renders the MBean tree. For example, if
two object names have similar keys but their key order differs, then the
corresponding MBeans will not be created under the same node in the MBean
tree.
For example, suppose you create Triangle MBean objects with the following names.
As far as the JMX technology is concerned, these objects will be
treated in exactly the same way. The order of the keys in the
object name makes no difference to the JMX technology. However, if JConsole connects
to these MBeans and the default MBean tree rendering is used, then the
object com.sun.example:type=Triangle,name=2,side=isosceles will end up being created under the Triangle node, in a
node called 2, which in turn will contain a sub-node called isosceles. The
other two isosceles triangles, name=1 and name=3, will be grouped together under
Triangle in a different node called isosceles, as shown in Figure 3-13.
Figure 3-13 Example of Unexpected MBean Tree Rendering
To avoid this problem, you can specify the order in which the
MBeans are displayed in the tree by supplying an ordered key property list
when you start JConsole at the command line. This is achieved by setting
the system property com.sun.tools.jconsole.mbeans.keyPropertyList, as shown in the following command.
The key property list system property takes a comma-separated list of keys, in
the order of your choosing, where key must be a string representing an
object name key or an empty string. If a key specified in the
list does not apply to a particular MBean, then that key will
be discarded. If an MBean has more keys than the ones specified in
the key property list, then the key order defined by the value returned
by ObjectName.getKeyPropertyListString() will be used to complete the key order defined by
keyPropertyList. Therefore, specifying an empty list of keys simply means that JConsole will
display keys in the order they appear in the MBean's ObjectName.
So, returning to the example of the Triangle MBeans cited above, you could
choose to start JConsole specifying the keyPropertyList system property, so that all
your MBeans will be grouped according to their side key property first, and
their name key property second. To do this, you would start JConsole with
the following command.
Starting JConsole with this system property specified would produce the MBean tree shown
in Figure 3-14.
Figure 3-14 Example of MBean Tree Constructed Using keyPropertyList
In Figure 3-14, the side key comes first, followed by the name key. The
type key comes at the end because it was not specified in the
key property list, so the MBean tree algorithm applied the original key order
for the remaining keys. Consequently, the type key is appended at the end, after
the keys which were defined by the keyPropertyList system property.
According to the object name convention defined by the JMX Best Practices Guidelines, the type
key should always come first. So, to respect this convention you should start
JConsole with the following system property.
The above command will cause JConsole to render the MBean tree for
the Triangle MBeans as shown in Figure 3-15.
Figure 3-15 Example of MBean Tree Constructed Respecting JMX Best Practices
This is obviously much more comprehensible than the MBean trees shown in Figure 3-13
and Figure 3-14.
MBean Attributes
Selecting the Attributes node displays all the attributes of an MBean. Figure 3-16
shows all the attributes of the Threading platform MXBean.
Figure 3-16 Viewing All MBean Attributes
Selecting an individual MBean attribute from the tree then displays the attribute's value,
its MBeanAttributeInfo, and the associated Descriptor in the right pane, as you can
see in Figure 3-17.
Figure 3-17 Viewing an Individual MBean Attribute
You can display additional information about an attribute by double-clicking on the attribute
value, if it appears in bold text. For example, if you click on
the value of the HeapMemoryUsage attribute of the java.lang.Memory MBean, you will
see a chart that looks something like Figure 3-18.
Figure 3-18 Displaying Attribute Values
Double-clicking on numeric attribute values will display a chart that plots changes in
that numeric value. For example, double-clicking on the CollectionTime attribute of the
Garbage Collector MBean PS Marksweep will plot the time spent performing garbage collection.
You can also use JConsole to set the values of writable attributes. The
value of a writable attribute is displayed in blue. Here you can
see the Memory MBean's Verbose attribute.
Figure 3-19 Setting Writable Attribute Values
You can set attributes by clicking on them and then editing them.
For example, to enable or disable the verbose tracing of the garbage
collector in JConsole, select the Memory MXBean in the MBeans tab and set
the Verbose attribute to true or false. Similarly, the class loading MXBean also
has the Verbose attribute, which can be set to enable or disable class
loading verbose tracing.
MBean Operations
Selecting the Operations node displays all the operations of an MBean. The MBean
operations appear as buttons, that you can click to invoke the operation.Figure 3-20
shows all the operations of the Threading platform MXBean.
Figure 3-20 Viewing All MBean Operations
Selecting an individual MBean operation in the tree displays the button for invoking
the MBean operation, and the operation's MBeanOperationInfo and its Descriptor, as shown
in Figure 3-21.
Figure 3-21 Viewing Individual MBean Operations
MBean Notifications
You can subscribe to receive notifications by selecting the Notifications node in the
left-hand tree, and clicking the Subscribe button that appears on the right. The
number of notifications received is displayed in square brackets, and the Notifications node
itself will appear in bold text when new notifications are received. The notifications
of the Memory platform MXBean are shown in Figure 3-22.
Figure 3-22 Viewing MBean Notifications
Selecting an individual MBean notification displays the MBeanNotificationInfo in the right pane,
as shown in Figure 3-23.
JConsole's MBeans tab also allows you to tell the HotSpot VM to
perform a heap dump, and to get or set a VM option via
the HotSpotDiagnostic MXBean.
Figure 3-24 Viewing the HotSpot Diagnostic MBean
You can perform a heap dump manually by invoking the com.sun.management.HotSpotDiagnostic MXBean's
dumpHeap operation. In addition, you can specify the HeapDumpOnOutOfMemoryError Java VM option using
the setVMOption operation, so that the VM performs a heap dump automatically whenever
it receives an OutOfMemoryError.
Creating Custom Tabs
In addition to the existing standard tabs, you can add your own
custom tabs to JConsole, to perform your own monitoring activities. The JConsole plug-in API
provides a mechanism by which you can, for example, add a tab to
access your own application's MBeans. The JConsole plug-in API defines the com.sun.tools.jconsole.JConsolePlugin abstract
class that you can extend to build your custom plug-in.
As stated above, your plug-in must extend JConsolePlugin, and implement the JConsolePlugingetTabs
and newSwingWorker methods. The getTabs method returns either the list of tabs to
be added to JConsole, or an empty list. The newSwingWorker method returns
the SwingWorker to be responsible for the plug-in's GUI update.
Your plug-in must be provided in a Java archive (JAR) file that
contains a file named META-INF/services/com.sun.tools.jconsole.JConsolePlugin. This JConsolePlugin file itself contains a list of all the
fully-qualified class names of the plug-ins you want to add as new
JConsole tabs. JConsole uses the service-provider loading facility to look up and load the
plug-ins. You can have multiple plug-ins, with one entry per plug-in in the
JConsolePlugin.
To load the new custom plug-ins into JConsole, start JConsole with the following
command:
% jconsole -pluginpath plugin-path
In the above command, plugin-path specifies the paths to the JConsole plug-ins to
be looked up. These paths can either be to directory names or to
JAR files, and multiple paths can be specified, using your platform's standard separator
character.
An example JConsole plug-in is provided with the Java SE 6 platform. The
JTop application is a JDK demonstration that shows the CPU usage of all
threads running in the application. This demo is useful for identifying threads that
have high CPU consumption, and it has been updated to be used as
a JConsole plug-in as well as a standalone GUI. JTop is bundled with
the Java SE 6 platform, as a demo application. You can run
JConsole with the JTop plug-in by running the following command: