JVM-03 JVM性能调优监控工具
文章目录
- 1.Jinfo
- 1.1 查看jvm的参数
- 1.2 查看java系统参数
- 2.Jstat
- 2.1 类加载统计
- 2.2 垃圾回收统计
- 2.3 堆内存统计
- 2.4 新生代垃圾回收统计
- 2.5 新生代内存统计
- 2.6 老年代垃圾回收统计
- 2.7 老年代内存统计
- 2.8 元数据空间统计
- 2.9 gc工具
- 3.Jmap
- 3.1 实例个数以及占用内存大小
- 3.2 堆信息(mac报错)
- 3.3 堆内存dump
- 3.3.1 内存溢出示例
- 3.3.2 远程连接jvisualvm
- 4.Jstack
- 4.1 用jstack查找死锁(也可以用jvisualvm查看死锁)
- 4.2 jstack找出占用cpu最高的堆栈信息
1.Jinfo
查看正在运行的Java应用程序的扩展参数
1.1 查看jvm的参数
运行一个jar程序jps查看下进程号
1.2 查看java系统参数
2.Jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
注意:使用的jdk版本是jdk8.
2.1 类加载统计
jstat -class 10616
- Loaded:加载class的数量
- Bytes:所占用空间大小
- Unloaded:未加载数量
- Bytes:未加载占用空间
- Time:时间
2.2 垃圾回收统计
jstat -gc 10616
- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小(元空间)
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
2.3 堆内存统计
jstat -gccapacity 10616
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- EC:伊甸园区的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:当前老年代大小
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代gc次数
- FGC:老年代GC次数
2.4 新生代垃圾回收统计
jstat -gcnew 10616
- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
2.5 新生代内存统计
jstat -gcnewcapacity 10616
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0CMX:最大幸存1区大小
- S0C:当前幸存1区大小
- S1CMX:最大幸存2区大小
- S1C:当前幸存2区大小
- ECMX:最大伊甸园区大小
- EC:当前伊甸园区大小
- YGC:年轻代垃圾回收次数
- FGC:老年代回收次数
2.6 老年代垃圾回收统计
jstat -gcold 10616
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- OC:老年代大小
- OU:老年代使用大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
2.7 老年代内存统计
jstat -gcoldcapacity 10616
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:老年代大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
2.8 元数据空间统计
jstat -gcmetacapacity 10616
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
2.9 gc工具
jstat -gcutil 10616
- S0:幸存1区当前使用比例
- S1:幸存2区当前使用比例
- E:伊甸园区使用比例
- O:老年代使用比例
- M:元数据区使用比例
- CCS:压缩使用比例
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
3.Jmap
此命令可以用来查看内存信息。
3.1 实例个数以及占用内存大小
jmap -histo 10616 > /iotcloud/log.txt
- num:序号
- instances:实例数量
- bytes:占用空间大小
- class name:类名称
3.2 堆信息(mac报错)
3.3 堆内存dump
jmap -dump:format=b,file=/iotcloud/test.hprof 11264
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./ (路径)
可视化平台
jvisualvm
3.3.1 内存溢出示例
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* 描述:内存溢出测试
* @author: myx
* @date: 2019/1/20
* Copyright © 2018-hotpot. All rights reserved.
*/
public class OOMTest {
// JVM设置
// -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/iotcloud/jvm.dump
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
int i = 0;
while (true) {
list.add(new User(i++, UUID.randomUUID().toString()));
}
}
}
运行代码
导入dump文件
3.3.2 远程连接jvisualvm
启动普通的jar程序JMX端口配置:
java -Djava.rmi.server.hostname=10.1.202.28 -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar
tomcat的JMX配置
JAVA_OPTS=-Djava.rmi.server.hostname=10.1.202.28 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
jvisualvm远程连接服务需要在远程服务器上配置host(连接ip 主机名),并且要关闭防火墙
- 问题
远程访问JMX遇到连接不上的问题
4.Jstack
排查死锁
jstack 11264
4.1 用jstack查找死锁(也可以用jvisualvm查看死锁)
/** * 描述:死锁示例 * @author: myx * @date: 2019/1/20 * Copyright © 2018-hotpot. All rights reserved. */
public class DeadLockTest {
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (lock1) {
try {
System.out.println("thread1 begin");
Thread.sleep(5000);
} catch (InterruptedException e) {
}
synchronized (lock2) {
System.out.println("thread1 end");
}
}
}).start();
new Thread(() -> {
synchronized (lock2) {
try {
System.out.println("thread2 begin");
Thread.sleep(5000);
} catch (InterruptedException e) {
}
synchronized (lock1) {
System.out.println("thread2 end");
}
}
}).start();
System.out.println("main thread end");
}
}
jvisualvm查看死锁
4.2 jstack找出占用cpu最高的堆栈信息
- 使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如4977
- 按H,获取每个线程的内存情况
- 找到内存和cpu占用最高的线程tid,比如4977
- 转为十六进制得到 0x1371 ,此为线程id的十六进制表示
- 执行 jstack 4977|grep -A 10 1371,得到线程堆栈信息中1371这个线程所在行的后面10行
- 查看对应的堆栈信息找出可能存在问题的代码
更多JVM相关知识请参考目录:JVM学习目录
还没有评论,来说两句吧...