JConsole JDK1.6 使用手册

阅读更多
转载出处
文章作者: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 JDK1.6 使用手册_第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 JDK1.6 使用手册_第2张图片

 

JConsole的连接到远程进程

当打开连接对话框,你也可以连接到远程进程。

图3-3创建一个连接到远程进程

JConsole JDK1.6 使用手册_第3张图片

要监控远程Java虚拟机上运行的过程中,你必须提供下列资料。

  • 主机名:Java虚拟机正在运行的机器上的名称。
  • 端口号:当你启动Java虚拟机指定JMX代理端口号码。
  • 用户名和密码:用户名和密码才能使用(需要监测只有通过JMX代理,需要密码验证的Java虚拟机)。

有关设置JMX代理的端口号的信息 ,请参阅启用远程管理。 有关用户名和密码的信息,请参阅使用密码和访问文件。

 

使用JMX服务URL连接

您还可以使用远程进程选项指定他们的JMX服务URL连接其他JMX代理,用户名和密码。 一个JMX服务URL的语法要求您提供用于进行连接的传输协议,以及服务接入点。

图3-4连接到一个JMX代理使用的JMX服务URL

JConsole JDK1.6 使用手册_第4张图片

如果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 JDK1.6 使用手册_第5张图片

“概述”选项卡提供了一种简单的方法相关的信息,以前只能通过多个选项卡之间切换。

保存图表数据

JConsole的,可以让您保存在一个逗号分隔值(CSV)文件中的图表提供的数据。 为了节省从图表中的数据,只需右键单击任何图表上, 选择保存数据,然后指定其中的数据将被保存的文件。 从任何任何JConsole的不同的标签以这种方式显示的图表,您可以保存数据。

CSV格式是常用的电子表格应用程序之间的数据交换。 CSV文件可以导入到电子表格应用程序,可以用来创建这些应用程序的图表。 这些数据是两个或多个命名的列,第一列表示的时间戳。 导入电子表格应用程序的文件后,你通常需要选择的第一列,并改变其格式为“日期”或“日期/时间”。

 

监控内存消耗

Memory选项卡提供了内存消耗和内存池的信息。

图3-6内存“选项卡

JConsole JDK1.6 使用手册_第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 JDK1.6 使用手册_第7张图片

如果垃圾收集器已经成为一个瓶颈,你可以通过自定义代大小来提高性能。 使用JConsole,你可以调查你的性能指标的敏感性实验与垃圾收集器的参数。 欲了解更多信息,请参阅调整与5.0 HotSpot虚拟机的垃圾收集。

 

监视线程使用

线程“选项卡上提供了有关线程使用的信息。

图3-8 Threads选项卡

JConsole JDK1.6 使用手册_第8张图片

在左下角的“线程”列表列出了所有的活动线程。 如果你输入一个“过滤器”字段中的字符串,线程列表将只显示其名称中包含你输入字符串线程。 点击一个线程在线程列表的名称,显示该线程的信息的权利,包括线程的名称,状态,和堆栈跟踪。

图表显示活动线程的数量随着时间的推移。 两行显示。

  • 红色 :峰值线程数
  •  :活动线程数。

线程选项卡提供了几个有用的操作。

  • findMonitorDeadlockedThreads:检测,如果任何线程对象监视器锁定陷入死锁。 此操作返回一个死锁的线程ID数组。
  • getThreadInfo:返回线程的信息。 这包括名称,堆栈跟踪和监测锁,该线程目前已封锁,如果有的话,哪个线程持有该锁,以及线程争用统计。
  • getThreadCpuTime:返回给定的线程所消耗的CPU时间

通过MBeans选项卡,您可以通过选择的MBean树中的线程MXBean的这些附加功能。 这MXBean的访问被监视的Java虚拟机线程信息列出所有的属性和操作。 请参阅监视和管理的 MBean 

检测死锁线程

要检查如果您的应用程序已经陷入了僵局运行(例如,您的应用程序似乎是挂了),死锁的线程可以通过点击“检测死锁”按钮检测。 如果检测到任何死锁的线程,这些都显示在一个新的标签,旁边出现的“主题”标签, 在图 3-9所示。

图3-9僵持主题

JConsole JDK1.6 使用手册_第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类标签

JConsole JDK1.6 使用手册_第10张图片

图表曲线加载的类的数量随着时间的推移。

  • 红线总数(包括后来卸载的)加载的类。
  • 蓝线是当前的类加载。

在选项卡底部的详细信息部分显示类的加载,因为Java虚拟机开始的总数,当前加载和卸载的数量。 跟踪类加载详细的输出,您可以勾选在顶部的右上角复选框。

查看VM信息

VM摘要“选项卡提供了对Java虚拟机的信息。

图3-11虚拟机摘要选项卡

JConsole JDK1.6 使用手册_第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选项卡

JConsole JDK1.6 使用手册_第12张图片

左侧的树显示当前正在运行的所有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树渲染范例

JConsole JDK1.6 使用手册_第13张图片

您可以指定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

JConsole JDK1.6 使用手册_第14张图片

在图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的最佳实践构建

JConsole JDK1.6 使用手册_第15张图片

这显然远远超过难理解的图3-13和图3-14中显示的MBean的树。

MBean属性

选择“属性”节点显示一个MBean的所有属性,图3-16显示了Threading的所有属性。

图3-16查看所有的MBean属性

JConsole JDK1.6 使用手册_第16张图片

选择单个MBean属性,  MBeanAttributeInfo,会显示在右窗格中,如图3-17。

图3-17查看单个的MBean属性

JConsole JDK1.6 使用手册_第17张图片

您可以通过双击右侧窗体中粗体文本显示更多信息。 例如,如果你点击HeapMemoryUsage 对应的value值,你会看到一个图表:图3-18 。

图3-18显示的属性值

JConsole JDK1.6 使用手册_第18张图片

双击数字属性值将显示一个图表,图,数值的变化。 例如,双击上的垃圾收集器的MBean 的PS Marksweep CollectionTime属性,将显示执行垃圾收集所花费的时间。

您还可以使用JConsole设置可写属性的值。 一个可写的属性的值显示为蓝色。 在这里你可以看到内存的MBean的详细属性。

图3-19设置可写的属性值

设置一个MBean的可写属性的值。

您可以通过点击,然后编辑它们的属性。 例如,启用或禁用在JConsole详细的垃圾收集器跟踪,选择在MBeans选项卡的MXBean 和详细的属性设置为真或假。 同样,类加载的MXBean也有详细的属性,可以设置启用或禁用类加载的详细跟踪。

 

MBean操作

选择“操作”节点显示一个MBean的所有操作。你可以通过按钮去调用方法. 图3-20 所有线程的方法。

Figure 3-20 Viewing All MBean Operations

JConsole JDK1.6 使用手册_第19张图片

选择一个MBean树中选择一个方法,可以看到该方法的描述信息,如图 3-21 .

Figure 3-21 Viewing Individual MBean Operations

JConsole JDK1.6 使用手册_第20张图片

MBean通知

在左边的树中选择订阅,并点击订阅按钮。右侧将显示收到的通知。如图3-22。

Figure 3-22 Viewing MBean Notifications

JConsole JDK1.6 使用手册_第21张图片

选择单个MBean通知,MBeanNotificationInfo会显示在右窗格中,如图3-23所示。

Figure 3-23 Viewing Individual MBean Notifications

JConsole JDK1.6 使用手册_第22张图片

HotSpot的诊断的MXBean

JConsole的MBeans选项卡还允许你告诉HotSpot虚拟机执行堆转储,并通过HotSpotDiagnostic MXBean的VM选项,以获取或设置。

Figure 3-24 Viewing the HotSpot Diagnostic MBean

JConsole JDK1.6 使用手册_第23张图片

您可以手动执行堆转储调用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

JConsole JDK1.6 使用手册_第24张图片

你可能感兴趣的:(JConsole)