JVM监控和诊断工具
文章目录
简单命令行工具
1、javac和java指令
- 作用:
- 位置:在jdk的安装目录下面的bin目录下
2、jps:查看正在运行的java进程
参数:
- -q 只显示进程id
- -l 显示全类名(如果是jar包,jar包会完整路径)
- -m 输出启动时传递给启动类main()的参数 String[] args;
- -v 打印每一个的进程JVM参数的详细信息
- hostid 远程访问,需要安装jstatd
3、jstat:查看JVM统计信息
3.1、什么是jstat?
参数:
-
-class pid 显示ClassLoader的信息
- 信息说明:
- Loaded: 已完成加载类的总数量
- Bytes: 已加载类的字节数
- Unloaded: 未完成加载的类数量
- Bytes: 未完成加载的类数量的字节数
- Time: 加载完成的时间
- 信息说明:
-
-gc pid
-
SOC: Survivor0的当前剩余空间
-
SIC:Survivor1的当前剩余空间
-
SOU : Survivor0的使用空间
-
SIU:Survivor1的使用空间
-
EC:Eden的剩余空间
-
EU:Eden的使用空间
-
OC:Old的剩余空间
-
OU:Old的使用空间
-
MC:Metaspace的总空间
-
MU:Metaspace的剩余空间
-
CCSC:压缩类空间容量
-
CCSU:使用的压缩类空间
-
YGC:YGC垃圾收集的数量
-
YGCT:YGC执行的时间
-
FGC: Full GC垃圾收集的数量
-
FGCT:Full GC执行的时间
-
GCT: GC的总时间
-
-compiler pid 即时编译器的一些参数
-
compiled:执行的编译任务数
-
Failed:执行编译失败的数量
-
Invaild:编译的失效的数量
-
Time:即时编译的总时间
-
FailedType: 失败类的类型
-
FailedMethod: 失败的类的方法
-
-gccapacity pid 内存池生成和空间容量
-
其他见官网
3.2、jstat有什么作用?
1)查看有关jvm的相关参数(GC详细,堆栈空间详细以及元空间的空间数据)
2)可以判断出现内存泄漏
- 在长时间的运行java程序中,我们可以运行jstat命令连续获取多行性能数据,并取几行数据的OU列的最小值(已占用的老年代内存)
- 重复多次,获取多组OU的最小值。如果呈现上升趋势,则可以说明老年代占用的,意味着无法回首的对象在不断增加,很可能出现内存泄漏。
4、jinfo:实时查看和修改 JVM 配置参数
4.1、有什么用?
- 查看虚拟机的配置信息
- 调整虚拟机的配置参数
4.2、命令结构
jinfo [选项] pid
- jinfo -sysprops pid
- 输出系统属性
- -flags pid
- 输出全部的参数
- -flag name=value pid
- 动态设置jvm参数
- info pid
- 默认打印全部的信息
- -flag name
- 输出对应名称的参数
- -flag [±]name
- 开启或者关闭对应名称的参数
- 只有被标记为 manageable 的参数才可以被动态修改
4.3、查看所有的JVM启动初始值
java -XX:+PrintFlagsInitial
4.4、插卡所有参数的最终值
java -XX:+PrintFlagsFinal
4.5、查看哪些已经被用户或者 JVM 设置过的详细的 XX 参数的名称和值
java -XX:+PrintCommandLineFlags
5、jmap:导出内存映像文件和查看内存使用情况
5.1、官方文档
5.2、使用语法
jmap [option] pid
jmap [option] <executable <core>
jmap [option] [server_id@] <remote server IP or hostname>
5.3、常用命令
-
-dump 生成dump文件(java堆转储快照)
- -dump:live只保存堆中的存活对象
6、jhat:jdk自带堆分析工具
6.1、命令
jhat <option> <dumpfile>
- -port port-number
- 设置 jhat HTTP Server 的端口号,默认 7000
访问http://localhost:7000/
7、jsatck:打印JVM中的线程快照
7.1、用途
- 追踪虚拟机的堆栈。
- 生成线程快照,用于定位线程出现长时间停顿的原因。如线程间死锁,死循环,请求外部资源导致的长时间等待
7.2、参数说明
option 参数 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用本地方法的话,可以显示 C/C++的堆栈 |
7.3、实践——使用jstack来查看死锁
1)编写代码
public class TestDeadLock {
public static void main(String[] args) {
//测试死锁现象,使用jstack查看死锁
Object o1 = new Object();
Object o2 = new Object();
new Thread(() -> {
synchronized (o1) {
try {
System.out.println("t1拿到了o1");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("t1拿到了o2");
}
}
}).start();
new Thread(() -> {
synchronized (o2) {
try {
System.out.println("t2拿到了o2");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("t2拿到了o1");
}
}
}).start();
}
}
2)使用jps查看pid
3)jstack pid
在thread dump留意
- 死锁 DeadLock
- 等待资源 Waiting on condition
- 等待获取监视器,Waiting on monitor entry
- 阻塞,Blocked
- 执行中,Runnable
- 暂停,Suspended
- 对象等待中,Object.wait() 或 TIMED_WAITING
- 停止,Parked
8、jcmd多功能命令行
8.1、作用
- 实现前面除了 jstat 之外所有命令的功能
- 用它来导出堆、内存使用、查看 Java 进程、导出线程信息、执行 GC、JVM 运行时间等。
8.2、命令
- jcmd -l
- 列出所有的JVM进程
- jcmd pid 具体命令