JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。如果要把一个应用以可管理的形式启动,可以在启动是设置com.sun.management.jmxremote。前面周鑫也分享了Jconsole远程监控怎么配置,在这里我就不再重复了。废话就到这里吧,接下来咱们来看看Jconsole的一些功能页面。
1、概述:有关堆内存使用情况、线程、类加载和CPU使用情况的综述。如下图所示:
2、内存:堆内存和其他内存。如下图所示:
3、线程:峰值/活动线程,在此页面可以查看到各个线程的明细,也可以进行死锁检测。如下图所示:

4、类:监控加载和卸载的类,这个需要综合其他工具进行具体的分析。
5、Mbean:当前Java程序的Mbean的操作。
6、VM摘要:有关JVM的明细信息。
看到这里,可能有同学会不太明白,这里有些名词,例如:JVM、堆内存等等。首先解释下JVM,JVM(Java Virtual Machine,Java虚拟机的缩写),JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的);堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在进行时动态的申请某个大小的内存(堆内存、栈内存)。
使用Jconsole,我们可以很直观的观察到JAVA进程的内存、CPU、线程调度的使用情况,监控一段时间也可以进行数据的导出。
好了,到这里咱们就知道了Jconsole功能页面,接下来说说定位线程死锁的方法,可以使用Jconsole直接查看某个线程是否有死锁,也可以使用Jstack 进程ID进行查看。分析线程是否有死锁,我们必须了解线程的各个状态含义,线程在创建完毕后进入new状态,调用了线程的start方法后线程就进入了RUNNABLE状态,放入 JVM的可运行线程队列中,等待获取CPU的执行权,JVM按照线程的优先级及时间分片、轮循的方式来执行RUNNABLE状态的线程。当线程进入start代码段,开始执行时,其线程状态转变为RUNNING。线程在执行过程中如果执行了sleep、wait、join或者IO阻塞、锁等待时,则进入WAIT或BLOCK状态,在这种状态下线程放弃CPU的使用权,进入wait sets或锁sets中,知道WAIT结束、线程被唤醒或获取到锁,在这些情况下线程会再次进入到RUNNABLE状态,线程执行完毕后,线程就可以从运行线程队列中删除了。使用jstack命令查看到的线程状态如下:
Jconsole于此同时也支持插件,以Jtop为例,Jtop为JDK自带的插件,可以实时查看线程的CPU耗时,在命令行输入jconsole -pluginpath 插件的绝对路径,如下图所示:
启动的GUI会多一个标签页:
就写到这里吧,有新的掌握,再跟大家同步。