共计 892 个字符,预计需要花费 3 分钟才能阅读完成。
JVM 异样阐明(超链接)一文中已介绍了,JVM 每个运行时区域——程序计数器、Java 虚拟机栈、本地办法栈、Java 堆、办法区、间接内存产生 OutOfMemoryError 的不同起因和不同错误信息。
Java 堆,是线程共享内存,简直所有的对象实例以及数组都应在堆上调配。如下堆的内存透露谬误也是咱们经常遇到的
java.lang.OutOfMemoryError: Java heap space
工具 VisualVM 的介绍
应用 VisualVM 排查堆内存透露
- 查看 GC
老年代 Old 和年老代 Eden 区在一直增长,简直已满。Full GC 次数增多,内存没有无效开释。这是内存透露的显著迹象
- 查看系统日志
已有 Full GC 的日志,紧接着开始报错 OutOfMemoryError
- 剖析 Heap Dump
导入 Dump 后,能够看到占用内存最大的类和实例——OOMMonitor 类中的 placeholder 变量
- 示例代码
public class OOMMonitor {
static class OOMobject {public byte[] placeholder = new byte[64 * 1024];
}
public static void fillHeap(int num) throws InterruptedException {List<OOMobject> list = new ArrayList<OOMobject>();
for (int i = 0; i < num; i++) {
// 稍作延时, 令监督曲线的变动更加显著
Thread.sleep(500);
list.add(new OOMobject());
System.out.println("Hello World");
}
}
public static void main(String[] args) throws Exception {fillHeap(1000);
}
}
- 示例 VM 配置参数
-Xms20m
-Xmx20m
-verbose:gc
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/heapdump.hprof
扫一扫,关注我
正文完