本文主要是介绍Jconsole和VisualVM使用指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1. Jconsole
- 1.1 Jconsole简介
- 1.2 Jconsole常用功能
- 2. VisualVM
- 2.1 VisualVM简介
- 2.2 安装插件
- 3.总结
上篇文章我们一起学习了MAT工具的使用方式,除了第三方提供的JVM工具之外,JDK也自带了Jconsole和VisualVM,功能也都很强大;
1. Jconsole
1.1 Jconsole简介
JDK1.5开始新增的java监控和管理控制吧,它提供对JVM内存、线程和类的监控;
可以直接在java的安装目录,找到bin/jconsole.exe双击打开:
首先选择你想要连接的java进程,点击连接;
包括一些堆、类、线程、CPU情况;
1.2 Jconsole常用功能
Jconsole的使用还是相对比较简单;通过Jconsole主要可以了解到堆、类、线程的情况;
1.2.1 内存信息
可以查看堆(Eden、S0、S1、Old)的使用情况,了解这些使用情况为你的JVM参数优化提供重要的参考指标;
1.2.2 线程信息
这块可以查看当前进程中开启的线程数量,以及检查线程之间是否存在死锁问题;
运行这段代码:
public class JconsoleTest {public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(new Lock1(),"线程A:");Thread thread2 = new Thread(new Lock2(),"线程B:");thread1.start();thread2.start();}
}
class Resource{// 对静态资源加锁,相当于是对class加锁;public static String resource1 = "lock1";public static String resource2 = "lock2";
}class Lock1 implements Runnable{@Overridepublic void run(){try{while(true){synchronized(Resource.resource1){Thread.sleep(3000);synchronized(Resource.resource2){System.out.println("lock1获取资源2");}}}}catch(Exception e){e.printStackTrace();}}
}
class Lock2 implements Runnable{@Overridepublic void run(){try{while(true){synchronized(Resource.resource2){Thread.sleep(3000);synchronized(Resource.resource1){System.out.println("lock2获取资源1");}}}}catch(Exception e){e.printStackTrace();}}
}
可以看出,线程A已经阻塞,想获取一个字符串,但被线程B占用;
2. VisualVM
2.1 VisualVM简介
VisualVM与Jconsole相比,VisualVM的功能更全面,并且它有比较好用的插件功能;
在java的安装目录下,找到 jvisualvm.exe 双击打开:
从这首页可以看出一些内存情况,选择线程,可以查看是否有死锁问题,如果有,点击生成 dump会生成一份dump文件;
2.2 安装插件
感兴趣的同学可以安装一个插件:VisualGC,看一下功能图,你就会爱上它:
2.2.1 下载插件
下载地址:https://visualvm.github.io/pluginscenters.html
2.2.2 安装插件
3.总结
通过上面的小例子,差不多就对这两款工具有了大致的了解,其它工作中真正用它的机会不多,并且工作中大部分都接入的有APM,但本地开发过程中遇到问题,拿出来排查个线程、JVM等相关问题,还是非常有帮助的;
这篇关于Jconsole和VisualVM使用指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!