Java虚拟机(四) —— 调优工具与调优案例
调优工具
jinfo
查看JVM参数
jinfo -flags [pid]
可以看出ParallelGC是Java8的JVM的默认垃圾收集器。
查看java系统参数
jinfo -sysprops [pid]
jstat
类加载数量
jstat -class [pid]
列名 | 含义 |
---|---|
Loaded | 加载class的数量 |
Bytes | 所占空间的大小 |
Unloaded | 未加载的数量 |
Bytes | 未加载的类占用的空间 |
Time | 加载的用时 |
列名 | 参数 | 含义 |
---|---|---|
S0 | 0.00 | Servivor0 区使用的空间 |
S1 | 50.04 | Servivor1 区使用的空间 |
E | 27.75 | Eden区使用的空间 |
O | 0.01 | Old区使用的空间 |
M | 98.12 | Metaspace 元空间 |
CCS | 95.67 | 压缩类空间利用率为百分比 |
YGC | 1 | Young GC 也就是MinorGC,程序运行以来MinorGC发生的次数 |
YGCT | 0.006 | MinorGC的总耗时 |
FGC | 0 | 程序运行以来FullGC发生的次数 |
FGCT | 0.000 | FullGC的总耗时 |
GCT | 0.006 | MinorGC + FullGC的总耗时 |
jmap
jmap -histo [pid]
jmap -heap [pid]
visual vm
jvisualvm
调优案例
使用快照分析OOM异常
运行参数
-Xms10M
-Xmx10M
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/Test/oom.dump
运行程序
class User{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public User(String id) {
this.id = id;
}
}
public class OOMTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
for(;;){
userList.add(new User(UUID.randomUUID().toString()));
}
}
}
运行结果
使用加载heap文件的方式,导入到visualvm中。可以看出User的实例过多,导致的OOM。
使用jstack、visualvm排查死锁程序
public class DeadLockTest {
public static void main(String[] args) {
Object lock1 = new Object();
Object lock2 = new Object();
new Thread(() -> {
synchronized (lock1){
System.out.println("A get lock1");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2){
System.out.println("A get lock2");
}
}
System.out.println("A finish");
}).start();
new Thread(() -> {
synchronized (lock2){
System.out.println("B get lock2");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1){
System.out.println("B get lock2");
}
}
System.out.println("B finish");
}).start();
}
}
使用jstack [pid]
可以看到线程的堆栈信息,而且如果存在死锁,会有提示。
使用visualvm也是一样的
jstack占用CPU最高的堆栈信息
dir
关于作者
后端程序员,五年开发经验,从事互联网金融方向。技术公众号「清泉白石」。如果您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。