12.2 监视并发应用程序
实现Java应用程序时,通常要使用Eclipse或者NetBeans这样的IDE来创建项目并编写源代码。而JDK(Java development kit)中包含了可用于编译、执行或生成Javadoc文档的工具。JConsole就是其中的一种图形化工具,展示了在JVM中执行的应用程序的信息。可以在JDK安装路径下的bin目录中找到它(jconsole.exe)。
如果执行该工具,就会看到如下这样的窗口。

通过在Local Process区域选定某一进程,可以监视那些在计算机上运行的进程,也可以在Remote Process区域引入远程进程的数据以监视远程进程。
一旦选定进程或者引入想要监视的进程的数据,点击Connect按钮。可以看到一个提示窗口,告诉你正在启动一个不安全的连接。该窗口与下图相似。

按下Insecure connection按钮。
你会看到屏幕上有6个选项卡。
- Overview:该选项卡展示了有关该应用程序的一般信息。
- Memory:该选项卡展示了有关内存使用情况的信息。
- Threads:该选项卡展示了应用程序的线程随时间推移的演变情况,而且允许查看某一线程的详细信息。
- Classes:该选项卡展示了当前加载类的信息以及类的数量。
- VM Summary:该选项卡展示了运行进程的Java虚拟机的信息。
- MBean:该选项卡展示了进程的MBean。Mbean是一个托管的Java对象,可以表示设备、应用程序或者任何资源,而且它是JMX API的基础。
在接下来的各小节,你将了解可在每个选项卡中获取到的信息。你可以通过http://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html来获取有关该工具的完整文档。
12.2.1 Overview选项卡
如前所述,该选项卡以图形化方式展示了有关应用程序的一般信息,你可以看出不同时间取值的变化。这些信息包括如下几点。
- Heap Memory Use:该图展示了应用程序使用的内存大小。它也展现了已用内存、指定内存和最大内存。
- Threads:该图展示了应用程序所使用线程数的演变情况。其中含有程序员以显式方式创建的线程和由JVM所创建的线程。
- Classes:该图展示了应用程序加载的类的数量。
- CPU Usage:该图展示了应用程序CPU使用的变化情况。
其外观类似于如下的屏幕截图。

12.2.2 Memory选项卡
如前所述,该选项卡以图形化方式展示了应用程序的内存使用情况。你可以查看这些指标随时间的变化情况。该选项卡的外观如下所示。

在屏幕的上方,有一个供你选择内存类型的下拉菜单。该菜单提供了多种不同的选项,例如堆内存、非堆内存,以及特定的内存工具,例如Eden Space用于展示最初为大多数对象分配的内存的信息,而Survivor Space则用于展示维持Eden Space垃圾收集器的对象所使用的内存。
之后,可以得到选定元素随时间演变的图示。最后,还有一个Details区域,用于展示内存消耗信息。
- Used区:展示应用程序当前的内存使用量。
- Committed区:用于保障JVM执行的内存量。
- Max区:JVM可以使用的最大内存量。
- GC time区:花费在垃圾收集上的时间。
12.2.3 Threads选项卡
如前所述,在Threads选项卡中,可以看到应用程序的线程随时间的变化情况。该选项卡的外观如下所示。

该屏幕展示了线程数随时间变化的演变情况。你将看到两个数值。Live Threads是当前正在运行的线程数,而Peak线程数则是最大线程数。
在底部,窗口的左部是所有当前所有线程的列表。如果选定其中一个线程,那么在右侧就会看到关于该线程的信息,例如该线程的名称、状态和当前栈追踪情况。
12.2.4 Classes选项卡
Classes选项卡展示了当前加载类的信息。该选项卡的外观如下所示。

该选项卡的上方展示了一幅图,表现了应用程序随时间变化加载类的数量的演变情况。图中的红线表示应用程序加载的类的总数,而蓝线则表示当前加载的类的数量。
选项卡的底部是细节展示区,其中含有当前信息。
- 当前加载的类。
- 总共加载的类。
- 尚未加载的类。
12.2.5 VM Summary选项卡
VM Summary选项卡展示了有关Java虚拟机的信息。该选项卡的外观如下所示。

如图所示,该选项卡展示了如下信息。
- 摘要区域:这一块区域展示了有关正在运行进程的Java虚拟机实现的信息。
- Virtual Machine:正在执行进程的Java虚拟机的名称。
- Vendor:实现该Java虚拟机的组织名称。
- Name:运行进程的机器名称。
- Uptime:从JVM启动到现在经过的时间。
- Process CPU time:JVM消耗的CPU时间。
- 线程区域:该区域展示了有关应用程序线程的信息。
- Live threads:当前运行的线程总数。
- Peak:在JVM中执行的最高线程数。
- Daemon threads:当前运行的守护线程总数。
- Total threads started:自JVM开始运行后开始执行的线程总数。
- 类区域:该区域展示了有关应用程序类的数量的信息。
- Current classes loaded:当前加载到内存中的类的数量。
- Total classes loaded:JVM开始运行后加载到内存中的类的数量。
- Total classes unloaded:JVM开始运行后从内存中卸载的类的数量。
- 内存区:该区域展示了应用程序的内存使用情况。
- Current heap size:当前堆的规模。
- Committed memory:为堆的使用分配的内存总量。
- Maximum heap size:堆的最大规模。
- Garbage collector:垃圾收集器的相关信息。
- 操作系统区:该区域展示了有关执行Java虚拟机的操作系统的信息。
- Operating System:运行JVM的操作系统的版本。
- Number of Processors:计算机所配置的核的数量或CPU数量。
- Total physical memory:操作系统可用的RAM总量。
- Free physical memory:操作系统可用的空闲RAM总量。
- Committed virtual memory:保证当前进程运行的内存。
- 其他信息:该区域展示了关于Java虚拟机的其他信息。
- VM arguments:传递给JVM的参数。
- Class path:JVM的类路径。
- Library path:JVM的库路径。
- Boot class path:JVM寻找
java.*和javax.*类的路径。
12.2.6 MBeans选项卡
MBeans选项卡展示了所有在平台上注册的MBean的信息。该选项卡的外观与下图类似。

在该选项卡的左侧,可以在目录树中看到所有正在运行的MBean。选定其中一项,将在选项卡的右侧看到MBean Info和MBean Descriptor的内容。
并发应用程序可用Threading MBean表示,它共有两个区域。Attributes区域包含MBean的属性,而Operations区域包含所有可以通过该MBean运行的操作。
12.2.7 About选项卡
最后,通过Help菜单中的About选项,可以获得当前执行的JConsole的版本信息。你会看到类似如下的窗口。

