JConsole是遵循JMX规范的监视工具,用来获取关于应用执行的信息,如线程数、内存使用或类加载。它包含在JDK中,可以用于监视本地或远程应用程序。本节讲学习如何使用JConsole监控简单的并发应用。
准备工作
本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创建一个新的Java项目。
实现过程
通过如下步骤实现范例:
-
创建名为Task的类,指定Runnable接口。实现run()方法,在100秒内输出信息到控制台:
public class Task implements Runnable{ @Override public void run() { Date start, end; start = new Date(); do { System.out.printf("%s: tick\n", Thread.currentThread().getName()); end = new Date(); } while (end.getTime() - start.getTime() < 100000); } }
-
实现包含main()方法的Main类,创建10个Task任务来创建10个线程,启动线程,然后使用join()方法等待结束:
public class Main { public static void main(String[] args) { Thread[] threads = new Thread[10]; for (int i=0; i<10; i++) { Task task=new Task(); threads[i]=new Thread(task); threads[i].start(); } for (int i=0; i<10; i++) { try { threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
打开控制台窗口,在JDK-9安装目录的bin下,执行JConsole应用。
工作原理
本节实现了非常简单的范例:运行10个线程100秒钟,这些线程输出信息到控制台。
当执行JConsole,将看到系统中正在运行的所有Java应用,选择想要监控的应用,如下图所示:
在这里选择本范例,点击连接按钮。然后,将被要求与应用建立不安全的连接,对话框如下图所示:
点击不安全的连接按钮,JConsole提供六个选项卡显示应用信息:
- 概览选项卡提供内存使用的概述、运行的线程数量、创建的对象数量以及CPU使用情况。
- 内存选项卡显示使用的内存数量。可以选择要监视的内存类型(堆、非堆或池)组合。
- 线程选项卡显示线程数量和每个线程的详细信息。
- 类选项卡显示加载的对象数量的信息。
- VM 概要选项卡提供运行应用的JVM概要。
- MBean选项卡显示有关应用的托管bean的信息。
类选项卡如下图所示:
它分为两部分,上半部分,显示实时的峰值线程数(红线)和活动线程数(蓝线)的信息。下半部分显示活跃线程数列表,选择其中一个线程,将看到所选线程的详细信息,包括状态和实际堆栈跟踪。
扩展学习
还可以使用其他应用来监视Java运行的程序。例如,包含JDK的VisualVM。访问https://visualvm.github.io/获取VisualVM的详细信息。
更多关注
- 本章“使用MultithreadedTC测试并发代码”小节