JVM监控及诊断工具-GUI篇-jconsole

概述

使用上一章命令行工具或组合能帮您获取目标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内存溢出了

进程运行中的线程数变化情况:

加载类的情况:

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值