? VisualVM 是一个集成了命令行 JDK 工具和轻量级分析功能的可视化工具。 专为开发和生产时间使用而设计。是目前JDK自带工具里,比较综合实用的一个可视化工具,代替常用命令行工具,可以查看虚拟机进程及进程 的配置和环境信息(jps
, jinfo
),监视程序的CPU, GC, 堆, 方法区及线程的信息(jstat
、 jstack
)等, 甚至代替jConsole。
官网地址: https://visualvm.github.io/
首先在IDEA中搜索 VisualVM Launcher
插件并安装
重启IDEA,然后配置该插件,不然启动不了
点击启动按钮,再选择具体的java进程即可
在自己安装的 JAVA_HOME/bin 目录下,找 jvisualvm
(在java这边多了一个j的前缀)即可
? 打开后能看到本地所有java进程的进程名和进程ID(类似 jps), 点击具体进程就可看到详情。
方式1:点击 监视
-> 堆dump
注意:这些快照存储在内存中,当线程停止的时候快照就会丢失,如果还想利用,可以将快照进行另存为
方式二:也可以在具体的pid上右键,dump
点击 文件
,选择 装入
,文件格式选择 .hprof
, 装载即可。
点击 概述
, 查看 JVM参数
信息,可以查看当前java 进程设置的JVM参数
系统属性
点击 概述
, 查看 系统属性
信息,可以查看系统相关属性和默认属性
点击监视
查看,右上角勾选 进程
,可事实查看虚拟机进程相关信息(活动、守护进程、峰值、已启动总数)
生成线程快照
方式一:点击线程
, 再点击右上角的 线程dump
,另外,此次存储也是在内存中的,如果想备份可以在快照里另存为。
方式二:在具体的java进程中右击,保存为线程快照
读取线程快照
点击 文件
,选择 装入
,文件格式选择 .tdump
, 装载即可。
检测死锁
下面是一个简单的线程死锁案例
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
new Thread() {
@Override
public void run() {
synchronized (s1) {
s1.append("a");
s2.append("1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2) {
s1.append("b");
s2.append("2");
System.out.println(s1);
System.out.println(s2);
}
}
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (s2) {
s1.append("c");
s2.append("3");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1) {
s1.append("d");
s2.append("4");
System.out.println(s1);
System.out.println(s2);
}
}
}
}).start();
}
此时可以看到 检测到死锁标记
Dump 线程快照可以看到一下信息,线程Thread-1,线程 Thread-2处于阻塞状态
visual vm的检测结果
对于CPU、堆内存、类装载情况、线程数的监控,提供了统一的监控模块;可以点击执行垃圾回收
手动触发垃圾回收。
原文:https://www.cnblogs.com/worldline/p/15211589.html