当前位置: 首页 > news >正文

生成和查看dump文件

在日常开发中,即使代码写得有多谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM)。当发生这种情况时,我们怎么去排查,怎么去分析原因呢?

1. 什么是dump文件?

dump文件是一个进程或者系统在某一个给定的时间的快照。
dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开。
dump文件中包含了程序运行的模块信息、线程信息、堆栈调用信息、异常信息等数据。
在服务器运行我们的Java程序时,是无法跟踪代码的,所以当发生线上事故时,dump文件就成了一个很关键的分析点。

2. 如何生成dump文件?

这里介绍两种方式:

一种是主动的
一种是被动的

方式一
主动生成dump文件。首先要查找运行的Java程序的pid。
使用top命令:
在这里插入图片描述

然后使用jmap命令生成dump文件。file后面是保存的文件名称,1246则是java程序的PID。

jmap -dump:format=b,file=/Users/zhangjiguo/dump.hprof 1246

命令中的1246是需要dump文件的java进程的pid(括号及括号中的内容要记得删掉),可以通过top命令进行获取

方式二
其实在很多时候我们是不知道何时会发生OOM,所以需要在发生OOM时自动生成dump文件。
其实很简单,只需要在启动时加上如下参数即可。HeapDumpPath表示生成dump文件保存的目录。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\tmp
我们还需要模拟出OOM错误,以此触发产生dump文件,首先写个接口:

private static Map<String, String> map = new HashMap<>();@RequestMapping("/oom")
public String oom() throws Exception {for (int i = 0; i < 100000; i++) {map.put("key" + i, "value" + i);}return "oom";
}

然后在启动时设置堆内存大小为32M。
-Xms32M -Xmx32M
因为要后台启动,并且输出日志,所以最后启动命令就是这样:

 java -Xms32M -Xmx32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/zhangjiguo/dump.hprof  -jar auth-client-api-1.0.0.RELEASE.jar

然后请求oom的接口,查看日志,果然发生了OOM错误。
查看保存dump的目录,果然生成了对应的dump文件。

3. 如何查看dump文件?

这里我介绍使用Jprofiler,有可视化界面,功能也比较完善。

3.使用JProfiler打开
打开比较久,需耐心等待,千万不要点skip
在这里插入图片描述

4.查看Classes
在这里插入图片描述

5.查看Reference
5.1 选择一个class或者biggest object
在这里插入图片描述

5.2 Use Slected Objects
在这里插入图片描述

5.3 Incoming references
在这里插入图片描述

  • incoming references 显示这个对象被谁引用
  • outcoming references 显示这个对象引用的其他对象

6.查看
在这里插入图片描述

7.查看Graph
在这里插入图片描述

8.查看代码
在这里插入图片描述

该方法主要用来导出数据报表,可以看出,当list数量太大时,就会导致OOM

http://www.lryc.cn/news/24082.html

相关文章:

  • K8S集群1.24使用docker作为容器运行时出现就绪探针间歇性异常
  • 士大夫身份第三方水电费第三方
  • RDO一体化部署OpenStack
  • CC2530+ESP8266使用MQTT协议上传阿里云的问题
  • Java基础:爬虫
  • 纯手动搭建大数据集群架构_记录008_搭建Hbase集群_配置集群高可用---大数据之Hadoop3.x工作笔记0169
  • Linux系统认知——驱动认知
  • Spring boot装载模板代码并自动运行
  • 全国领先——液力悬浮仿生型人工心脏上市后在同济医院成功植入
  • 基于蚂蚁优化算法的柔性车间调度研究(Python代码实现)
  • 云原生周刊:开源漏洞仍然是开发人员面临的挑战 | 2023.2.27
  • Docker学习总结
  • Android 9.0系统源码_通知服务(三)应用发送状态栏通知的流程
  • python中的序列——笔记
  • taobao.user.seller.get( 查询卖家用户信息 )
  • WebRTC Qos策略
  • Mysql数据查询
  • Kafka入门(五)
  • 如何快速在windows系统中切换node.js版本
  • 设计模式-单例模式(java)
  • Revit中复合墙图层的规则和CAD识别翻模墙
  • 【DL】Paddle BML Codelab环境使用说明 - 知识点目录
  • python正则表达式处理文本-re模块
  • 换了固态硬盘需要重装系统吗?教你如何实现不重装系统!
  • 网上医疗预约挂号系统
  • 专题:一看就会的C++类模板讲解 (1)
  • 什么是“奥卡姆剃刀”,如何用“奥卡姆剃刀”解决复杂问题?复杂问题简单化
  • 角谷定理(递归)
  • 数学小课堂:微积分复盘(高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。)
  • JAVA线程池原理详解一