命令行工具
jps
jps -q 只看进程id
jps -l 显示java进程的完整类名
jps -m 查看传递给主类main()的参数
jps -v 列出虚拟机启动时的jvm参数
以上参数可以组合使用
jstat
查看JVM统计信息
例:jstat -gc -t 19788 1000 10
-gc:打印gc统计信息 ;-t:打印程序已经运行了多长时间(秒);19788:进程id;1000:每隔多少秒打印一次(毫秒);10:一共打印10次
经验:
- 可以比较两次测量的间隔时间以及总GC时间的增量,得出GC时间占运行总时间的比例。日过比例超过20%,说明目前堆的压力比较大;如果比例超过90%,说明堆里几乎没有可用空间,随时都可能抛出OOM
- 得到连续多组OU值,取出每组的最小值,如果这些值呈上升趋势,说明老年代内存已使用量在不断上涨,意味着无法回收的对象在不断增加,很可能存在内存泄
jinfo
Configuration Info for Java。查看虚拟机配置参数信息,也可用于调整虚拟机的参数配置。
查看:
jinfo -sysprops PID:查看由System.getProperties()取得的参数
jinfo -flags PID:查看全部虚拟机参数
jinfo -flag [参数] PID:查看有没有指定参数
修改:
可以在运行时修改部分参数,并立即生效。但是不是所有的参数都支持动态修改,只有被标记为manageable的flag才可以被实时修改
jmap
jmap(JVM Memory Map)。获取dump文件(堆转储快照文件,二进制文件);获取目标Java进程的内存相关信息。
使用一导出内存映像文件
手动:jmap -dump:format=b,file=d:\1.hprof PID
jmap -dump:live,format=b,file=d:\1.hprof PID (只dump存活的对象)
自动(当OOM时自己dump):配置两个JVM参数,-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\filename.hprof
使用二显示堆内存相关信息
jmap -heap PID > a.txt
jmap -histo PID > b.txt
(新版JDK使用有变化)
jhat
jhat(JVM Analysis Tool)分析jmap生成的heap dump文件。jhat内置了一个微型的HTTP/HTML服务器,可以在浏览器查看分析结果
(jhat在JDK9、JDK10中已经被删除,官方建议用VisualVM代替)
基本使用语法:jhat [option][dumpfile]
默认使用7000端口
jstack
jstack(JVM Stack Trace):生成指定进程当前时刻的线程快照(虚拟机堆栈跟踪)即每一条线程正在执行的方法堆栈的集合。
可用于定位长时间停顿的原因,如线程间死锁
官方帮助文档:jstack
模拟死锁代码:
package other.并发;
/**
* @author: 小手WA凉
* @create: 2024-10-09
*/
public class ThreadDeadLock {
final static Object lock1 = new Object();
final static Object lock2 = new Object();
public static void deadLock() {
new Thread(() -> {
synchronized (lock1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (lock2) {
}
}
}).start();
new Thread(() -> {
synchronized (lock2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (lock1) {
}
}
}).start();
}
public static void main(String[] args) {
ThreadDeadLock.deadLock();
}
}
jstack PID分析:
GUI
JDK自带
jconsole
从Java5开始JDK自带的java监控工具,用于对JVM中内存、线程和类的监控
Visual VM
功能更强大的故障诊断和性能监控的可视化工具
也可独立安装(JDK9之后不自带了):VisualVM: Home
visual vm功能强大之一就是可以自己安装插件,比如Visual GC
主要功能:
生成/读取堆dump内存快照
查看JVM参数和系统属性
查看运行中的虚拟机进程
生成/读取线程快照
程序资源的实时监控