共计 14532 个字符,预计需要花费 37 分钟才能阅读完成。
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 技术 启用 SSLJConsole
的远程监控。
连接到一个 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 /
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-02/113412p2.htm
介绍 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 虚拟机开始的总数,当前加载和卸载的数量。跟踪类加载详细的输出,您可以勾选在顶部的右上角复选框。
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 技术 启用 SSLJConsole
的远程监控。
连接到一个 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 /
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-02/113412p2.htm
查看 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 使用率。