JVM监控及诊断工具之JConsole以及Visual VM
Posted 爱上口袋的天空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM监控及诊断工具之JConsole以及Visual VM相关的知识,希望对你有一定的参考价值。
一、图形化工具主要分为以下两类
1、JDK自带的工具
- jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等
- Visual VM:VIsual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。
- JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。
2、第三方工具
- MAT:MAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄露和减少内存消耗
- JProfiler:商业软件,需要付费。功能强大
二、 JConsole
1、简介
jconsole:从Java5开始,在JDK自带的Java监控和管理控制台。用于对JVM中内存、线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监控工具。
2、测试新建的程序
package com.kgf.kgfjavalearning2021.jvm.jconsole; import java.util.ArrayList; import java.util.List; import java.util.Random; /*** * -Xms600m -Xmx600m -XX:SurvivorRatio=8 */ public class HeapInstanceTest byte[] buffer = new byte[new Random().nextInt(1024*100)]; public static void main(String[] args) try Thread.sleep(3000); catch (InterruptedException e) e.printStackTrace(); List<HeapInstanceTest> list = new ArrayList<>(); while (true) list.add(new HeapInstanceTest()); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace();
在idea中配置环境变量:
然后启动程序
3、打开cmd窗口,并且使用jconsole命令打开GUI界面(因为配置了jdk的环境变量)
可以看到上面我们选择本地进程中的进程,然后点击连接
进入后看到如下的界面:
4、使用jconsole检测死锁程序
下面我们创建一个死锁的程序:
package com.kgf.kgfjavalearning2021.jvm.command; /*** * 测试线程间的死锁问题 */ public class JstackLockTest public static void main(String[] args) StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); new Thread(new Runnable() @Override public void run() synchronized (sb1) sb1.append("a"); sb2.append("1"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); synchronized (sb2) sb1.append("b"); sb2.append("2"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); ).start(); new Thread(new Runnable() @Override public void run() synchronized (sb2) sb1.append("c"); sb2.append("3"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); synchronized (sb1) sb1.append("d"); sb2.append("4"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); ).start();
三、Visual VM
1、简介
Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个JDK命令行工具,使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等,甚至代替JConsole。在JDK6 Update 7以后,Visual VM便作为JDK的一部分发布(VisualVM在JDK/bin目录下)即:它完全免费
主要功能:
- 1.生成/读取堆内存/线程快照
- 2.查看JVM参数和系统属性
- 3.查看运行中的虚拟机进程
- 4.程序资源的实施监控
- 5.JMX代理连接、远程环境监控、CPU分析和内存分析
官方地址:VisualVM: Home
使用:
在jdk安装目录中找到jvisualvm.exe,然后双击执行即可 打开DOS窗口,输入jvisualvm就可以打开该软件
插件的安装:
1)、首先在IDEA中搜索VisualVM Launcher插件并安装:
2)、 重启IDEA,然后配置该插件
3)、 使用两种方式来运行程序
4)、 运行效果 还是打开jvisualvm界面,只是不需要我们手动打开jvisualvm而已
5)、连接方式
5.1)、本地连接
监控本地Java进程的CPU、类、线程等5.2)、远程连接
5.2.1、确定远程服务器的ip地址
5.2.2、添加JMX(通过JMX技术具体监控远程服务器哪个Java进程)
5.2.3、修改bin/catalina.sh文件,连接远程的tomcat
5.2.4、在…/conf中添加jmxremote.access和jmxremote.password文件
5.2.5、将服务器地址改成公网ip地址
5.2.6、设置阿里云安全策略和防火墙策略
5.2.7、启动tomcat,查看tomcat启动日志和端口监听
5.2.8、JMX中输入端口号、用户名、密码登录
2、主要功能
2.1、测试程序
package com.kgf.kgfjavalearning2021.jvm.visualvm; import java.util.ArrayList; import java.util.List; import java.util.Random; /*** * -Xms600m -Xmx600m -XX:SurvivorRatio=8 */ public class VisualVMTest public static void main(String[] args) List<Object> list = new ArrayList<>(); while (true) try Thread.sleep(5); catch (InterruptedException e) e.printStackTrace(); list.add(new Picture(new Random().nextInt(100*50))); class Picture private byte[] pixels; public Picture(int length) this.pixels = new byte[length];
配置环境变量:
2.2、使用idea上安装的visualvm插件直接启动程序
2.3、生成堆内存快照
2.3.1、方式1:
2.3.2、方式2:
2.4、注意: 生成堆内存快照如下图:
这些快照存储在内存中,当线程停止的时候快照就会丢失,如果还想 利用,可以将快照进行另存为操作,如下图:
2.5、 装入堆内存快照
查看hprof详细信息:
可以双击进入查看类里面具体信息:
3、使用visualvm检测JstackLockTest.java程序的死锁问题
package com.kgf.kgfjavalearning2021.jvm.command; /*** * 测试线程间的死锁问题 */ public class JstackLockTest public static void main(String[] args) StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); new Thread(new Runnable() @Override public void run() synchronized (sb1) sb1.append("a"); sb2.append("1"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); synchronized (sb2) sb1.append("b"); sb2.append("2"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); ).start(); new Thread(new Runnable() @Override public void run() synchronized (sb2) sb1.append("c"); sb2.append("3"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); synchronized (sb1) sb1.append("d"); sb2.append("4"); try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); ).start();
我们生成dump文件看看:
4、Visual VM的CPU抽样和内存抽样
4.1、测试代码:
package com.kgf.kgfjavalearning2021.jvm.visualvm; import java.util.ArrayList; import java.util.List; import java.util.Random; /*** * -Xms600m -Xmx600m -XX:SurvivorRatio=8 */ public class VisualVMTest public static void main(String[] args) List<Object> list = new ArrayList<>(); while (true) try Thread.sleep(5); catch (InterruptedException e) e.printStackTrace(); list.add(new Picture(new Random().nextInt(100*50))); class Picture private byte[] pixels; public Picture(int length) this.pixels = new byte[length];
4.2、启动程序,打开visualvm监控热点方法
过滤功能
cpu快照
4.3、内存堆柱状图
4.4、每个线程分配
以上是关于JVM监控及诊断工具之JConsole以及Visual VM的主要内容,如果未能解决你的问题,请参考以下文章