【转】jconsole JDK1.6 使用手册
原文地址 http://blog.csdn.net/honor571/article/details/7415364
转载出处 文章作者:hornet 本文地址:http://hornetblog.sinaapp.com/?p=5 |
英文版地址: http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
JConsole的图形用户界面是一个符合Java管理扩展(JMX)规范的监测工具。 JConsole使用Java虚拟机(Java VM),提供在Java平台上运行的应用程序的性能和资源消耗的信息。
在Java平台,标准版(Java SE平台)6,JConsole的已经更新到目前的外观和感觉的Windows和GNOME桌面(其他平台,将目前标准的Java图形的外观和感觉)。 在这个文件中提出的屏幕截图是从Windows XP上运行的接口的一个实例。
启动JConsole
JConsole是可执行文件, 在JDK_HOME/bin目录
中,其中JDK_HOME是在Java开发工具包(JDK)的安装目录。 如果此目录是在您的系统路径,你可以开始只需键入命令jconsole
。 否则,您必须键入可执行文件的完整路径。
命令语法
您可以使用JConsole来监视本地应用程序以及远程应用程序。
注:使用JConsole监视本地应用程序在开发和创建原型是非常有用的,但不推荐用于生产环境,因为jconsole本身也消耗大量的系统资源。 远程监控建议隔离被监视机器。
jconsole命令的语法完整的参考,请参阅
JConsole的命令手册页:Java监视和管理控制台。
设置本地监控
在命令行中键入以下命令启动JConsole的。
JConsole
当JConsole的启动时,您将获得一个本地运行JConsole的可以连接到的所有的Java应用程序的选择。
如果您要监控的特定应用程序,你知道该应用程序的进程ID,那么你也可以启动JConsole连接到该应用程序。 此应用程序必须和JConsole运行在相同的用户ID下。 该命令的语法以下。
%JConsole中 processID
以上的processID
是应用程序的进程ID(PID)。 您可以用以下方式确定一个应用程序的PID:
- 在UNIX或Linux系统,可以
使用
ps命令找到正在运行的Java
实例的PID 。 - 在Windows系统上,您可以使用任务管理器,
找到
java或者
javaw进程的PID。 - 您还可以使用
jps
命令行实用程序来确定的PID。 见的手册页的Java虚拟机进程状态工具 。
例如,如果你确定, 记事本
应用程序的进程ID是2956,那么你可以用下面的命令启动JConsole。
JConsole 2956
jconsole和被监视的应用程序必须运行在相同的用户下, 拥有管理和监控系统使用的操作系统的文件权限。 如果你不指定一个进程ID,jconsole会自动检测所有本地Java应用程序,并显示一个对话框,让你选择一个(参阅连接到 JMX代理)。
欲了解更多信息,请参阅本地监控和管理 。
设置远程监控
要启动远程监控JConsole的,您可以使用下面的命令语法。
JConsole 主机名: portNum
主机名是需要监听的主机,portNum
是你启动Java虚拟机时指定的JMX代理的端口号。 欲了解更多信息,请参阅远程监控和管理 。
如果你不指定一个主机名/端口号的组合,那么jconsole会显示一个连接对话框( 连接到JMX代理 ),让你输入一个主机名和端口号。
建立安全的远程监控
您也可以使用安全套接字层(SSL)进行安全的连接。 命令启动JConsole的安全连接是在第2章,监控和管理使用JMX技术 启用SSL JConsole的远程监控 。
连接到一个JMX代理
如果您启动jconsole的时候指定的JMX代理连接到的参数,它会自动开始监视指定的Java VM。 您可以连接到不同的主机在任何时候通过选择连接|新连接,并输入必要的信息。
否则,如果你不提供任何参数,当您启动JConsole的,第一眼看到的是连接对话框。 此对话框有两个选项,允许连接到本地或远程进程。
动态连接
在以前的版本的Java SE平台,应用程序,你想监测与JConsole的需要与下面的选项开始。
%,Dcom.sun.management.jmxremote
然而,与Java SE 6平台提供的JConsole的版本,可以连接到任何应用程序,支持附加的API。 换句话说,任何在Java SE 6 HotSpot虚拟机启动的应用程序由JConsole自动检测,并不需要使用上述的命令行选项开始。
JConsole的连接到一个本地进程
如果你不提供连接到一个特定的JMX代理启动JConsole的,你会看到下面的对话框窗口。
图3-1创建一个连接到一个本地进程
本地进程选项列出所有运行在本地系统上且和JConsole程序相同的用户ID的Java SE6 应用,包括进程ID和他们的类或参数信息。选择您要监视的应用程序,然后单击“连接”按钮。 本地进程的名单中包括以下类型的Java虚拟机的运行的应用程序。
- 启用管理代理的应用,包括Java SE 6平台
或
指定 Dcom.sun.management.jmxremote选项或
Dcom.sun.management.jmxremote.port选项开始的J2SE 5.0平台上的应用。 此外,名单中还包括任何应用程序,Java SE 6平台上开始没有任何管理属性,但以后JConsole的重视,这使得在运行时管理代理。 - 禁用管理代理,可连接的应用,应用程序在运行时禁用加载管理代。Java SE 6平台上开始支持附加的API的应用程序, 支持动态的应用程序连接,启动管理代理可以不通过在命令行
中
指定的
com.sun.management.jmxremote或com.sun.management.jmxremote.port选项。 如果选择此类应用程序连,将启用该应用的管理代理。 在连接的例子所示的对话框图 3-1中,NetBeans IDE和jconsole本身也均开始在Java SE 6平台的虚拟机。 同时出现在正常的文本,这意味着,JConsole的可以连接到它们。 在图3-1中,JConsole是选定的,值得注意的是可见的。 - 禁用应用程序,不扣押,管理代理。这些措施包括开始的J2SE 1.4.2平台上的应用,或J2SE 5.0平台上开始
没有
Dcom.sun.management.jmxremote或
com.sun.management.jmxremote.port选项。 这些应用程序的显示表中显示为灰色和JConsole中无法连接到他们。字谜
应用程序在连接的例子所示的对话框图 3-1,没有任何的管理属性与J2SE 5.0平台的虚拟机开始启用JMX代理,并因此显示为灰色,无法选择。
图3-2没有管理代理尝试连接到应用程序启用
JConsole的连接到远程进程
当打开连接对话框,你也可以连接到远程进程。
图3-3创建一个连接到远程进程
要监控远程Java虚拟机上运行的过程中,你必须提供下列资料。
- 主机名:Java虚拟机正在运行的机器上的名称。
- 端口号:当你启动Java虚拟机指定JMX代理端口号码。
- 用户名和密码:用户名和密码才能使用(需要监测只有通过JMX代理,需要密码验证的Java虚拟机)。
有关设置JMX代理的端口号的信息 ,请参阅启用远程管理。 有关用户名和密码的信息,请参阅使用密码和访问文件。
使用JMX服务URL连接
您还可以使用远程进程选项指定他们的JMX服务URL连接其他JMX代理,用户名和密码。 一个JMX服务URL的语法要求您提供用于进行连接的传输协议,以及服务接入点。
图3-4连接到一个JMX代理使用的JMX服务URL
如果JMX代理使用一个不包含在Java平台上的连接器,你需要添加连接器类到类路径中,如下所示。
%JConsole- J - Djava.class.path = JAVA_HOME / lib中/ jconsole.jar:JAVA_HOME / lib / tools.jar中
介绍JConsole的标签
一旦你连接到一个应用程序,JConsole界面由六个标签组成。
- 概述:显示有关Java VM和监视值的概述信息。
- 内存:显示内存使用信息。
- 线程:显示线程使用的信息。
- 类:显示关于类加载的信息。
- 虚拟机:显示有关Java VM的信息。
- MBean:显示MBean信息。
随时可以使用JConsole的在右上角的绿色连接状态图标,断开或重新连接到正在运行的Java虚拟机。 从下拉菜单中选择连接,然后新建
连接,您可以同时连接到任何数量运行中的Java虚拟机。
查看概述信息
概述选项卡中显示CPU使用率,内存使用率,线程数,Java VM中加载的类的监控信息。
图3-5概述“选项卡
“概述”选项卡提供了一种简单的方法相关的信息,以前只能通过多个选项卡之间切换。
保存图表数据
JConsole的,可以让您保存在一个逗号分隔值(CSV)文件中的图表提供的数据。 为了节省从图表中的数据,只需右键单击任何图表上, 选择保存
数据,然后指定其中的数据将被保存的文件。 从任何任何JConsole的不同的标签以这种方式显示的图表,您可以保存数据。
CSV格式是常用的电子表格应用程序之间的数据交换。 CSV文件可以导入到电子表格应用程序,可以用来创建这些应用程序的图表。 这些数据是两个或多个命名的列,第一列表示的时间戳。 导入电子表格应用程序的文件后,你通常需要选择的第一列,并改变其格式为“日期”或“日期/时间”。
监控内存消耗
Memory选项卡提供了内存消耗和内存池的信息。
图3-6内存“选项卡
内存标签功能“执行GC”的按钮,可以单击执行垃圾收集。 图表动态显示内存使用的堆和非堆内存的内存池。 可用的内存池取决于正在使用的版本的Java VM。 串行垃圾回收的内存池的HotSpot Java虚拟机,有以下几种。
- 伊甸园空间(堆):大多数对象最初分配内存的池。
- 生存空间(堆): 包含伊甸园空间垃圾收集后生存的对象。
- 年老代(堆): 池包含已经存在一段时间的对象。
- 永久代(非堆): 池包含的所有虚拟机本身的反射的数据,如类和方法的对象。 Java虚拟机,使用类数据共享,这一代分为只读和读写区域。
- 代码缓存(非堆):HotSpot Java虚拟机的还包括一个代码缓存,包含内存,使用本机代码的编译和存储。
您可以从图表
下拉菜单中的选项选择不同的图表显示图表这些内存池的消费。 此外,点击在右下角的角落堆和非堆图标,将切换显示图表。 最后,您可以指定您跟踪内存使用情况,从时间范围内
的下拉菜单中的选项选择的时间范围。
欲了解更多有关这些内存池的信息,请参阅下面的垃圾收集。
“详细信息”区域显示了当前内存信息:
- 已使用:目前使用的内存量,包括所有对象,可达和不可达占用的内存。
- 分配 :保证由Java虚拟机使用的内存量。 提交的内存量可能会随时间而改变。 Java虚拟机可能会释放系统内存,并已提交的内存量可能会少于最初启动时分配的内存量。 提交的内存量将始终大于或等于使用的内存量。
- 最大值,可用于内存管理的最大内存量。 它的价值可能会发生变化,或者是不确定的。 如果Java虚拟机试图增加使用的内存要大于提交的内存,内存分配可能失败,即使使用量小于
或
等于最大值(例如,当系统上的虚拟内存不足)。 - GC时间 :累计时间花在垃圾收集和调用的总数。 它可能有多个行,其中每一个代表一个垃圾收集器算法在Java虚拟机使用时间。
较低的右侧的条形图显示堆和非堆内存中的内存池消耗的内存。 列会变成红色时,使用的内存超过了内存使用阀值。
堆和非堆内存
Java虚拟机管理两种内存:堆和非堆内存,这两者都是Java虚拟机启动时创建的。
- 堆内存是运行时数据区域,Java VM的所有类实例和数组分配内存。 可能是固定或可变大小的堆。
- 非堆内存包括在所有线程和Java虚拟机内部处理或优化所需的共享的方法。 它存储了类的结构,运行常量池,字段和方法数据,以及方法和构造函数的代码,方法区在逻辑上是堆的一部分,看具体实现的方式。根据实现方式的不同,Java虚拟机可能不进行垃圾收集或压缩。 堆内存一样,方法区域可能是一个固定或可变大小。 方法区的内存不需要是连续的。
除了方法区,Java虚拟机可能需要进行内部处理或优化,这也属于非堆内存的内存。 例如,实时(JIT)编译器需要内存用于存储从Java虚拟机的高性能的代码翻译的机器码。
内存池和内存管理器
内存池和内存管理器是Java虚拟机的内存系统的关键环节。
- 一个内存池表示Java虚拟机管理的内存区域。 Java虚拟机至少有一个内存池,它可能在执行过程中创建或删除内存池。 一个内存池可以属于堆或以非堆内存。
- 一个内存管理器管理一个或多个内存池。 垃圾收集器是一个负责回收不可达的对象使用的内存的内存管理器。 Java虚拟机可能有一个或更多的内存管理器。 在执行过程中,它可以添加或删除内存管理器。 一个内存池可以由一个以上的内存管理器进行管理。
垃圾收集
垃圾收集(GC)是Java虚拟机如何释放不再被引用的对象所占用的内存。 它通常认为的对象,有作为“活着”和非引用作为或不可达对象的活动引用“死。” 垃圾收集是由死对象占用的的内存释放过程。 气相色谱法的算法和使用的参数可以对性能有巨大影响。
Java HotSpot虚拟机的垃圾收集器使用代GC。 代GC的优势,大多数都符合以下的概括。
- 他们创建有许多短暂的一生对象,例如,迭代和局部变量。
- 他们创建一些对象,有很长的生活,例如,高层次的持久对象。
代GC分为几代,并给每个指定一个或多个内存池。 当一代使用了分配的内存,虚拟机上执行一个局部的GC(也叫minor collection),内存池回收死对象使用的内存。 这部分的GC速度通常远远优于一个完整的GC。
Java HotSpot虚拟机定义了两代:年轻代(有时也被称为“托儿所”)和年老代。 年轻代包括“伊甸园空间”和两个“生存空间”。 最初,VM将所有的对象在“伊甸园”空间,大多数对象死在那里。 当它执行了一次minor GC,VM将剩余的对象从“伊甸园空间”转移到“生存空间”。 虚拟机将足够长生存时间的对象移动到年老代的空间。 当年老代填满了,将是一个完整的GC,往往是慢得多,因为它涉及到所有存活的对象。 永久代包含所有的虚拟机本身的反射,如类和方法的对象的数据。
默认情况下代安排看起来像图3-7 。
图3-7代的数据,在垃圾收集
如果垃圾收集器已经成为一个瓶颈,你可以通过自定义代大小来提高性能。 使用JConsole,你可以调查你的性能指标的敏感性实验与垃圾收集器的参数。 欲了解更多信息,请参阅调整与5.0 HotSpot虚拟机的垃圾收集。
监视线程使用
线程“选项卡上提供了有关线程使用的信息。
图3-8 Threads选项卡
在左下角的“线程”列表列出了所有的活动线程。 如果你输入一个“过滤器”字段中的字符串,线程列表将只显示其名称中包含你输入字符串线程。 点击一个线程在线程列表的名称,显示该线程的信息的权利,包括线程的名称,状态,和堆栈跟踪。
图表显示活动线程的数量随着时间的推移。 两行显示。
- 红色 :峰值线程数
- 蓝 :活动线程数。
线程选项卡提供了几个有用的操作。
findMonitorDeadlockedThreads:
检测,如果任何线程对象监视器锁定陷入死锁。 此操作返回一个死锁的线程ID数组。getThreadInfo:
返回线程的信息。 这包括名称,堆栈跟踪和监测锁,该线程目前已封锁,如果有的话,哪个线程持有该锁,以及线程争用统计。getThreadCpuTime:
返回给定的线程所消耗的CPU时间
通过MBeans选项卡,您可以通过选择的MBean树中的线程MXBean的这些附加功能。 这MXBean的访问被监视的Java虚拟机线程信息列出所有的属性和操作。 请参阅监视和管理的 MBean 。
检测死锁线程
要检查如果您的应用程序已经陷入了僵局运行(例如,您的应用程序似乎是挂了),死锁的线程可以通过点击“检测死锁”按钮检测。 如果检测到任何死锁的线程,这些都显示在一个新的标签,旁边出现的“主题”标签, 在图 3-9所示。
图3-9僵持主题
检测死锁“按钮,将涉及对象监视器和
java.util.concurrent的可拥有同步器(见API 规范文档java.lang.management.LockInfo)检测死锁循环。 Java SE 6中已加入的java.util.concurrent
锁的监控支持。 如果JConsole的连接到一个J2SE 5.0 VM,检测死锁机制只会找到相关的对象监视器死锁。 jconsole会不显示任何相关的可拥有同步器的死锁。
关于线程和守护线程的详细信息, 请
参见API文档的java.lang.Thread。
监视类载入中
“类”标签显示关于类加载的信息。
图3-10类标签
图表曲线加载的类的数量随着时间的推移。
- 红线总数(包括后来卸载的)加载的类。
- 蓝线是当前的类加载。
在选项卡底部的详细信息部分显示类的加载,因为Java虚拟机开始的总数,当前加载和卸载的数量。 跟踪类加载详细的输出,您可以勾选在顶部的右上角复选框。
查看VM信息
VM摘要“选项卡提供了对Java虚拟机的信息。
图3-11虚拟机摘要选项卡
在此选项卡中提供的信息包括以下内容。
- 摘要
- 运行时间 :开始以来,Java虚拟机的时间总额。
- 进程的CPU时间 :Java VM的开始,因为它消耗的CPU时间总量。
- 编译总时间 :累计时间花费在JIT编译。
- 主题
- 活动线程 :目前现场守护线程,加上非守护线程数量。
- 峰值 :活动线程的最高数目,因为Java虚拟机开始。
- 守护线程 :当前的活动守护线程数量。
- 总线程 :开始自Java虚拟机启动的线程总数,包括非守护进程,守护进程和终止的线程。
- 类
- 当前类装载 :目前加载到内存中的类数目。
- 总类加载 :从Java VM开始加载到内存中的类总和,包括那些后来被卸载的类。
- 已卸载类总数 :从Java虚拟机开始从内存中卸载的类的数目。
- 内存
- 当前的堆大小 :目前所占用的堆的千字节数。
- 分配的内存 :堆分配的内存总量。
- 最大堆最大值 :堆所占用的千字节的最大数目。
- 待最后确定的对象:待最后确定的对象的数量。
- 花在执行GC的垃圾收集器 :包括垃圾收集,垃圾收集器的名称,进行藏品的数量和总时间的信息。
- 操作系统
- 总物理内存
- 空闲物理内存
- 分配的虚拟内存
- 其他信息
- VM参数 :输入参数的应用程序通过Java虚拟机,不包括的主要方法的参数。
- 类路径是由系统类加载器用于搜索类文件的类路径。
- 库路径 :加载库时要搜索的路径列表。
- 引导类路径 :引导类路径是由引导类加载器用于搜索类文件。
监控和管理的MBean
MBeans选项卡显示的信息平台MBean服务器中的一个通用的方法对所有已注册的MBean。 MBeans选项卡允许您访问平台MXBean。 此外,您还可以监控和管理您的应用程序的MBean。
图3-12 MBeans选项卡
左侧的树显示当前正在运行的所有MBean。 当您选择树中的一个MBean, 其
MBeanInfo及其MBean描述符都显示在右侧,并在它下面的树中出现的任何属性,操作或通知。
所有平台MXBean和各种操作和属性是通过JConsole的MBeans选项卡访问。
构建MBean的树
默认情况下,基于对象的名称树中示MBean。jconsole会使用确切的键属性列表构建MBean树,构建时调用ObjectName.getKeyPropertyListString()方法返回类型的第一个key,和j2eeType的第二个key,如果存在的话。
然而,依靠ObjectName的关键属性的默认顺序,有时可以导致意外的结果。例如,如果两个对象的名字也有类似的key,但其key的排序不同,那么相应的MBean将不会在MBean树相同的节点下创建。
例如,假设您创建具有下列名称的三角MBean的对象。
com.sun.example:type=Triangle,side=isosceles,name=1 com.sun.example:type=Triangle,name=2,side=isosceles com.sun.example:type=Triangle,side=isosceles,name=3
至于JMX技术而言,这些对象将被视为在完全一样的方式。在对象名称的键的顺序不作任何JMX技术的差异。但是,如果JConsole连接这些MBean,并使用默认的MBean树渲染,那么对象com.sun.example:type=Triangle,name=2,side=isosceles最终会被节点Triangle下创建,在一个节点2,将包含一个子节点称为isosceles。其他两个isosceles,name= 1 name= 3,将分设在不同的节点isosceles下,如图3-13所示。
图3-13意外的MBean树渲染范例
您可以指定MBean提供一个有序的键属性列表来避免这个问题。当你在命令行启动JConsole时,通过设置系统属性com.sun.tools.jconsole.mbeans.keyPropertyList:
% jconsole -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=key[,key]*
键属性列表需要一个逗号分隔,在您所选择的, key
的地方必须是一个字符串,代表一个对象的名称键或一个空字符串的顺序。 如果在列表中指定的一个key并不适用于一个特定的MBean,那么该key将被丢弃。bjectName.getKeyPropertyListString()
返回值定义的键的顺序,将用于完成
keyPropertyList定义的键顺序。 因此,指定一个空的键列表仅仅意味着jconsole会显示MBean的ObjectName的
键。
因此,返回到上面提到的例子,你可以选择指定的keyPropertyList
系统属性启动JConsole:
% jconsole -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=side,name
JConsole中会产生的MBean树如图 3-14所示。
图3-14范例的MBean树构造使用keyPropertyList
在图3-14中,
side第一,name第二
。 因为type不是在指定的键属性列表类型的
key,因此MBean树算按默认次序排序。
根据公约所定义的JMX最佳实践准则的对象的名称, 类型的
关键应该永远是第一位的。 因此,要尊重本公约应从以下系统属性JConsole的。
%JConsole的- J - Dcom.sun.tools.jconsole.mbeans.keyPropertyList =type,side,name
上面的命令将导致JConsole的渲染如图3-15中所示
图3-15范例的MBean树尊重JMX的最佳实践构建
这显然远远超过难理解的图3-13和图3-14中显示的MBean的树。
MBean属性
选择“属性”节点显示一个MBean的所有属性,图3-16显示了Threading的所有属性。
图3-16查看所有的MBean属性
选择单个MBean属性, 其
MBeanAttributeInfo,会显示在右窗格中,如图3-17。
图3-17查看单个的MBean属性
您可以通过双击右侧窗体中粗体文本显示更多信息。 例如,如果你点击HeapMemoryUsage 对应的value值
,你会看到一个图表:图3-18 。
图3-18显示的属性值
双击数字属性值将显示一个图表,图,数值的变化。 例如,双击上的垃圾收集器的MBean 的PS Marksweep CollectionTime
属性,将显示执行垃圾收集所花费的时间。
您还可以使用JConsole设置可写属性的值。 一个可写的属性的值显示为蓝色。 在这里你可以看到内存的MBean的详细属性。
图3-19设置可写的属性值
您可以通过点击,然后编辑它们的属性。 例如,启用或禁用在JConsole详细的垃圾收集器跟踪,选择在MBeans选项卡的MXBean 和详细的
属性设置为真或假。 同样,类加载的MXBean也有详细的
属性,可以设置启用或禁用类加载的详细跟踪。
MBean操作
选择“操作”节点显示一个MBean的所有操作。你可以通过按钮去调用方法. 图3-20 所有线程的方法。
Figure 3-20 Viewing All MBean Operations
选择一个MBean树中选择一个方法,可以看到该方法的描述信息,如图 3-21 .
Figure 3-21 Viewing Individual MBean Operations
MBean通知
在左边的树中选择订阅,并点击订阅按钮。右侧将显示收到的通知。如图3-22。
Figure 3-22 Viewing MBean Notifications
选择单个MBean通知,MBeanNotificationInfo会显示在右窗格中,如图3-23所示。
Figure 3-23 Viewing Individual MBean Notifications
HotSpot的诊断的MXBean
JConsole的MBeans选项卡还允许你告诉HotSpot虚拟机执行堆转储,并通过HotSpotDiagnostic MXBean的VM选项,以获取或设置。
Figure 3-24 Viewing the HotSpot Diagnostic MBean
您可以手动执行堆转储调用com.sun.management.HotSpotDiagnostic MXBean的dumpheap命令操作。此外,您可以指定HeapDumpOnOutOfMemoryError Java VM选项,使用setVMOption操作,因此,VM执行堆转储时自动收到一个OutOfMemoryError。
创建自定义选项卡
除了现有的标准选项卡,你可以添加自己的自定义选项卡JConsole的,执行自己的监视活动。 JConsole的插件API提供了一种机制,例如,通过它可以添加标签来访问自己的应用程序的MBean。 JConsole这样的插件API定义com.sun.tools.jconsole.JConsolePlugin抽象类,你可以扩展到建立您的自定义插件。
如上所述,您的插件必须继承JConsolePlugin,并实现JConsolePlugin getTabs和newSwingWorker方法。 getTabs方法返回的选项卡的列表被添加到JConsole的,或者一个空列表。 newSwingWorker方法返回SwingWorker的负责插件的GUI更新。
您的插件必须提供一个Java归档(JAR)的文件,该文件包含一个名为META-INF/services/com.sun.tools.jconsole.JConsolePlugin文件。这个JConsolePlugin文件本身包含的所有插件完全合格的类名要添加新JConsole的标签列表。 JConsole中使用的服务提供商的装卸设施,来查找并加载插件。你可以有多个插件。
要加载到JConsole的新的自定义插件,启动JConsole的用下面的命令:
% jconsole -pluginpath plugin-path
在上面的命令,插件路径指定要查找的JConsole插件的路径。这些路径可以是目录名或JAR文件,并可以指定多个路径,用你的平台的标准分隔符字符。
一个例子JConsole的插件提供了Java SE 6平台。 JTop应用程序是JDK的演示,展示了在应用程序中运行的所有线程的CPU使用率。这个演示是有用的识别,具有较高的CPU消耗的线程,它已被更新作为一个JConsole的插件以及一个独立的GUI使用。 JTop是捆绑在一起的Java SE 6平台,作为一个演示应用程序。您可以运行的JTop插件JConsole中运行以下命令:
%JDK_HOME/bin/jconsole -pluginpath JDK_HOME/demo/management/JTop/JTop.jar
如果您连接到这种JConsole的实例,你会看到,JTop标签已被添加,显示运行各个线程的CPU使用率。
Figure 3-25 Viewing a Custom Plug-in Tab