概述
使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:
1. 无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。
2. 要求用户登录到目标Java应用所在的宿主机上,使用起来不是很方便。
3. 分析数据通过终端输出,结果展示不够直观。
为此,JDK提供了一些内存泄漏的分析工具,如 jconsole , jvisualvm 等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。
图形化综合诊断工具
JDK自带的三个工具:
1、jconsole : JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等
位置 :jdk\bin\jconsole.exe
2、Visual VM : Visual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。
位置 :jdk\bin\jvisualvm.exe
3、JMC : Java Mission Control
, 内置 Java Flight Recorder
。能够以极低的性能开销收集Java虚拟机的性能数据。
第三方工具:
- MAT : MAT(Memory Analyzer Tool)是基于 Eclipse 的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗Eclipse的插件形式
- JProfiler : 商业软件,需要付费。功能强大。与VisualVM类似
- Arthas : Alibaba开源的Java诊断工具。深受开发者喜爱。
- Btrace : Java运行时追踪工具。可以在不停机的情况下,跟踪指定的方法调用、构造函数调用和系统内存等信息。
2. jConsole
基本概述
jconsole:
-
从Java5开始,在JDK中自带的java监控和管理控制台。
-
用于对JVM中内存、线程和类等的监控,是一个基于JMX(
java management extensions
)的GUI性能监控工具。
官方教程:
https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html
启动
jdk/bin目录下,启动 jconsole.exe
命令即可
不需要使用jps命令来查询
三种连接方式
Local
使用JConsole连接一个正在本地系统运行的JVM,并且执行程序的和运行JConsole的需要是同一个用户。
JConsole使用文件系统的授权通过RMI连接器连接到平台的MBean服务器上。
这种从本地连接的监控能力只有Sun的JDK具有。
Remote
使用下面的URL通过RMI连接器连接到一个JMX代理,service:jmx:rmi://jndi/rmi://hostName:portNum/jmxrmi。
JConsole为建立连接,需要在环境变量中设置mx.remote.credentials来指定用户名和密码,从而进行授权。
Advanced
使用一个特殊的URL连接JMX代理。
一般情况使用自己定制的连接器而不是RMI提供的连接器来连接JMX代理,或者是一个使用JDK1.4的实现了JMX和JMX Rmote的应用。
主要作用
- 监控内存
- 监控线程
- 类加载与虚拟机信息
/**
* -Xms600m -Xmx600m -XX:SurvivorRatio=8
* 新生代:老年代=1:2=200:400
* 新生代:
* eden:s0:s1=8:1:1=160:20:20
*
*/
public class TestJconsol {
byte[] buffer=new byte[new Random().nextInt(1024*100)];
public static void main(String[] args) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ArrayList<TestJconsol> list = new ArrayList<>();
while (true){
TestJconsol testJconsol = new TestJconsol();
list.add(testJconsol);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
启动程序,打开jconsole
可以看到进程的概览,内存,线程,类,概要等信息
从概览可以看出堆内存的使用情况一直上升,到了600M后,就OOM了
Eden内存的情况,到了160M后 进行gc,占用内存就减小了,具有周期性
edenGC后,将存活的对象放到Survivor区
老年代 内存的使用情况不断上升 ,到了400m就OOM内存溢出了
进程运行中的线程数变化情况:
加载类的情况: