JVM-问题定位示例
内存溢出定位与分析
1. 模拟内存溢出,向集合中添加极大数量的字符串
package com.example.testcpu; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class TestJvmOutOfMemory { public static void main(String[] args) { List<Object> list = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { String str = ""; for (int j = 0; j < 1000; j++) { str += UUID.randomUUID().toString(); } list.add(str); } System.out.println("ok"); } }
2. 运行参数:
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
结果:
objc[78198]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/bin/java (0x103bf64c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x103c7a4e0). One of the two will be used. Which one is undefined. java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid78198.hprof ... Heap dump file created [7918632 bytes in 0.055 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137) at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421) at java.lang.StringBuilder.append(StringBuilder.java:136) at com.example.testcpu.TestJvmOutOfMemory.main(TestJvmOutOfMemory.java:14) Process finished with exit code 1
定位死锁问题
将dump文件导入到MAT中分析
发现服务器的CPU的负载突然增
高了、出现了死锁、死循环等,我们该如何分析呢?
1. 找到CPU占比高的进程
2. jstack查看线程情况,如发生死锁,会在最下面显示