堆dump文件分析

Java代码:

public class HeapTest2 {
static class OOMObject {
private byte[] arrs = new byte[64 * 1024];  // 会占用64k的堆内存
} public static void fillHeap(int num) throws InterruptedException {
List<OOMObject> oomObjects = new ArrayList<>();
for (int i = 0; i < num; i++) {
Thread.sleep(50);
oomObjects.add(new OOMObject());  // 不断创建OOMObject对象并将其添加到oomObjects中,使GCRoots可达
} } public static void main(String[] args) throws InterruptedException {
fillHeap(1000);
System.gc();
}
}

JVM参数配置:

设置堆内存为20M,并在发生OOM自动生成堆dump文件

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\17090889\Desktop\

运行后控制台输出:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to C:\Users\17090889\Desktop\java_pid5220.hprof ...
Heap dump file created [20723289 bytes in 0.069 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at jvm.HeapTest2$OOMObject.<init>(HeapTest2.java:16)
at jvm.HeapTest2.fillHeap(HeapTest2.java:23)
at jvm.HeapTest2.main(HeapTest2.java:29) Process finished with exit code 1

通过使用 IBM HeapAnalyzer分析结果如下:

注意:IBM HeapAnalyzer工具启动命令为:java -Xmx2048m -jar ha.jar  -Xmx参数为jvm最大内存,可依实际情况调整,尽量依本机内存情况调大,否则在找开较大的

  heapDump文件时易出现OOM

可以看到

19,148,784 bytes (96.54 %) of Java heap is used by 292 instances of jvm/HeapTest2$OOMObject

OOMObject对象在堆内存中有292个,占据了19M,96%的堆内存空间导致内存溢出。

在之前的JVM参数中再加上 打印GC日志信息

-Xms20m
-Xmx20m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:\Users\17090889\Desktop\
-XX:+PrintGCDetails
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintGCDateStamps
-Xloggc:C:\Users\17090889\Desktop\verbose.gc

待续...

线程core文件分析:

  线程core中线程的几种状态:

  NEW:未启动的,不会出现在Dump中

  RUNNABLE:就绪的,在虚拟机内执行的

  BLOCKED:受阻塞并等待监视器锁

  WATING:无限期等待另一个线程执行特定操作

  TIMED_WATING:有时限的等待另一个线程的特定操作

  TERMINATED:已退出的

最新文章

  1. eclipse左边导航package explorer自动定位
  2. zk回车事件
  3. 如何在终端实时展现git分支
  4. poj -3614 Sunscreen(贪心 + 优先队列)
  5. SQL SERVER排序函数
  6. cf442C Artem and Array
  7. 本人对于JavaScript的一些总结
  8. 2077 汉诺塔IV
  9. git的一些基本命令
  10. System.getProperty(String key)方法获取常用系统信息
  11. 如何查杀stopped进程
  12. Hadoop2.0源码包简介
  13. 转://Oracle数据库补丁分析实践
  14. Javascript - Jquery - 动画
  15. Chrome Debugger 温故而知新:上下文环境
  16. 笨方法学python之转义字符
  17. 团队作业——Beta冲刺5
  18. 20155305乔磊《网络对抗》逆向及Bof基础
  19. 51Nod 1287 加农炮 (线段树)
  20. 使用curl进行s3服务操作

热门文章

  1. Oracle命令行模式,批量执行SQL脚本
  2. 判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态 API密钥
  3. javascript-object对象属性操作之Object.defineProperty
  4. sql 为什么要用where 1=1?
  5. 状压DP : [USACO06NOV]玉米田
  6. MySQL- 查询总结
  7. 跨域资源共享(CORS)-漏洞整理
  8. Mac001--JDK安装与配置JDK环境变量
  9. HashMap -双列集合的遍历与常用的方法
  10. [Linux] 028 源码包安装过程