JDK中除了提供大量的命令行工具外,还有两个功能强大的可视化工具:JConsole和VisualVM,这两个工具是JDK的正式成员。
一、JConsole:Java监视与管理控制台
1、启动JConsole:双击运行jdk/bin目录下的jconsole.exe文件,会自动搜索出本机运行的所有虚拟机进程。可以双击其中一个开始进行监控,也可以连接远程服务器进行监控。
双击进入一个进程后,可以看到有概览、内存、线程、类、VM概要、MBean6个标签页,概览也包括4中信息的曲线图,纵观全局,其他标签页显示该种类下更加详细的信息。
2、内存监控(相当于可视化的jstat命令)
代码:
/**
* JVM参数:-Xms100m -Xmx100m -XX:+UseSerialGC -XX:+PrintGCDetails
*/
public class MonitoringTest {
public static void main(String[]args)throws Exception{
fillHeap(1000);
//System.gc();
}
/**
*内存占位符对象,一个OOMObject大约占64KB
*/
static class OOMObject{
public byte[] placeholder =new byte[64*1024];
}
public static void fillHeap(int num)throws InterruptedException{
List list =new ArrayList();
for(int i=0;i
我们通过JConsole对该进程进行内存监控,可以看到Eden区的运行趋势呈折现状(进行YGC),而整个堆是一条像上的平滑曲线。
虚拟机启动参数只限制了Java堆为100MB,没有指定-Xmn参数(新生代大小),上图显示Eden空间为27328KB,因为没有设置-XX:SurvivorRadio(Eden和Survivor的比例)参数,所以Eden与Survivor空间比例为默认值8:1,整个新生代空间大约为27328KB×125%=34160KB。
3、线程监控(当于可视化的jstack命令)
遇到线程停顿时可以使用这个页签进行监控分析。线程长时间停顿的主要原因主要有:等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等待(活锁和死锁)。
代码:
/**
* 死锁检测演示
*/
public class MonitoringTest02 {
public static void main(String[] args) throws InterruptedException {
final Object lock1 = new Object();
final Object lock2 = new Object();
Thread t1 = new Thread(new Runnable() {
public void run() {
synchronized (lock1){
try {
Thread.sleep(100);
synchronized (lock2){}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized (lock2){
try {
Thread.sleep(100);
synchronized (lock1){}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t2");
t1.start();
t2.start();
Thread.sleep(Integer.MAX_VALUE);
}
}
我们通过“线程”标签页,可以看到当前执行的线程,我们可以点击检测死锁来看程序中是否有死锁存在
二、VisualVM:多合一故障处理工具
VisualVM是目前JDK发布的功能最强大的运行监视和故障处理程序。它除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析。而且VisualVM还具备插件扩展功能。
1、启动VisualVM:与jconsole类似,它也在jdk/bin目录下,双击jvisualvm.exe启动
2、安装插件:可以通过工具->插件->可用插件进行安装:(可根据自己的需要进行安装)
默认的不可用的话,可以访问https://visualvm.github.io/pluginscenters.html,找到自己的版本然后如下替换即可:
3、选择进程后页面的标签页根据插件安装不同显示可能不一致,但是概述、监视、线程、MBeans和JConsole类似。
4、生成、浏览堆转储快照:在监视页面下点击堆dump。打开外部dump文件:文件->载入
5、分析程序性能
在Profiler页签中,VisualVM提供了程序运行期间方法级的CPU执行时间分析以及内存分析,做Profiling分析肯定会对程序运行性能有比较大的影响,所以一般不在生产环境中使用这项功能。
要开始分析,先选择“CPU”和“内存”按钮中的一个,然后切换到应用程序中对程序进行操作,VisualVM会记录到这段时间中应用程序执行过的方法。如果是CPU分析,将会统计每个方法的执行次数、执行耗时;如果是内存分析,则会统计每个方法关联的对象数以及这些对象所占的空间。分析结束后,点击“停止”按钮结束监控过程
源代码:https://gitee.com/itcaofanqi/CaoFanqiStudyRepository/tree/master/stujvm
资料:周志明《深入理解Java虚拟机》