生成和查看dump文件

这篇具有很好参考价值的文章主要介绍了生成和查看dump文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

内存溢出
虚拟机由于堆中拥有太多不可回收对象没有回收,导致无法继续创建新对象。

有如下三种异常:

1.Java堆内存异常
报错方式
java.lang.OutOfMemoryError: Java heap space

原因
异常导致-Xms或-Xmx配置不足

使用了大量的递归或无限递归对象
使用了大量循环或死循环(循环中用到了大量的新建的对象)
使用了向数据库查询过多,可能会造成内存溢出。
有数组,List,Map中存放的是对象的引用而不是对象,这些引用会让对应的对象不能被释放。会大量存储在内存中。

2.Java栈内存异常
报错方式
Exception in thread "main" java.lang.StackOverflowError

原因
对象过大或过多异常,导致-Xss配置的内存不足

是否有递归调用
是否有大量循环或死循环
全局变量是否过多
数组、List、map数据是否过大

3.方法区内存异常
报错方式
Exception in thread "main" java.lang.OutOfMemoryError: Metaspace

原因
异常导致-XX:MetaspaceSize或-XX:MaxMetaspaceSize配置不足

解决方案:

当不通过日志文件主观来判断出问题代码时,通过分析dump文件来分析

1. 什么是dump文件?

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

2. 如何生成dump文件?

这里介绍两种方式:

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

方式一
主动生成dump文件。首先要查找运行的Java程序的pid。
使用top命令:
dump文件查看,Java,运维,java,jvm,linux

然后使用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文件?

分析dump的工具有很多:

1. Java VisualVM
2. Memory Analyzer
3. IBM HeapAnalyzer
4. Jprofiler

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

3.使用JProfiler打开
打开比较久,需耐心等待,千万不要点skip
dump文件查看,Java,运维,java,jvm,linux

4.查看Classes
dump文件查看,Java,运维,java,jvm,linux

5.查看Reference
5.1 选择一个class或者biggest object
dump文件查看,Java,运维,java,jvm,linux

5.2 Use Slected Objects
dump文件查看,Java,运维,java,jvm,linux

5.3 Incoming references
dump文件查看,Java,运维,java,jvm,linux

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

6.查看
dump文件查看,Java,运维,java,jvm,linux

7.查看Graph
dump文件查看,Java,运维,java,jvm,linux

8.查看代码
dump文件查看,Java,运维,java,jvm,linux

该方法主要用来导出数据报表,可以看出,当list数量太大时,就会导致OOM文章来源地址https://www.toymoban.com/news/detail-554841.html

到了这里,关于生成和查看dump文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java JVM 内存GC查看

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 1、命令格式 jstat命令命令格式: jstat [Options] vmid [interval] [count] 参数说明: Options,选项,我们一般使用 -gcutil 查看gc情况 vmid,VM的进程号,即

    2024年01月22日
    浏览(32)
  • 堆内存溢出自动生成DUMP文件

    如果发生了内存泄露,如果好重现,使用JVisualvm,或者jmap,Jprofiler进行Heap Dump,使用MAT进行分析。但不好重现的话,可以打开JVM的HeapDumpOnOutOfMemoryError参数,待到有了Heap Dump再使用MAT等工具分析。 说明: 通过jvm参数-XX:+HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出时候Dump出当前

    2024年02月16日
    浏览(35)
  • Linux 上的 .NET 如何自主生成 Dump

    前几天微信上有位朋友找到我,说他程序的 线程数 会偶发性瞬时飙高,让我看下大概是什么原因,截图如下: 如果这种问题每天都会出现,比较好的做法就是用 dotnet-trace 捕获 ThreadCreated 事件,但可气的是朋友说大概一个月发生次把,这种情况下用 dotnet-trace 持续监视就没必

    2024年02月11日
    浏览(52)
  • Windows下生成dump文件的三种方式

    提示:本文为描述windows平台下的dump文件生成: windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出。 windows系统默认是不产生程序dmp文件的。dump文件是C++程序发生异常时,保存当时程序运行状态的文件。 是调试异常程序重要的方法。 简

    2023年04月08日
    浏览(75)
  • 一个java文件的JVM之旅

    我是小C同学编写得一个java文件,如何实现我的功能呢?需要去JVM(Java Virtual Machine)这个地方旅行。 我高高兴兴的来到JVM,想要开始JVM之旅,它确说:“现在的我还不能进去,需要做一次转换,生成class文件才行”。为什么这样呢? JVM不能直接加载java文件的原因: Java源代码中

    2024年02月05日
    浏览(40)
  • JAVA-JVM 之Class字节码文件的组成 【上篇】

    主页传送门:📀 传送   java的特点是跨平台性,而跨平台的运行标准是Class字节码文件,Class字节码是提供平台无关性的基础模型,使我们无须考虑如何兼容异构系统,只须被JVM识别即可。   字节码是Java虚拟机中的核心,是Java源代码的一种中间表示形式。简单来说,字

    2024年02月06日
    浏览(47)
  • Linux命令200例:Dump用来做文件系统备份

    🏆作者简介,黑夜开发者,CSDN领军人物,全栈优质新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过 具体的系统的

    2024年02月10日
    浏览(41)
  • 使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查问题

    目录 1、尝试将Windbg附加到目标进程上进行动态调试,但Windbg并没有捕获到

    2024年02月14日
    浏览(41)
  • JVM第十七讲:调试排错 - Java 问题排查之Linux命令

    本文是JVM第十七讲, Java 问题调试排错 。Java 在线问题排查主要分两篇:本文是第一篇,通过linux常用命令排查。 1、在终端中登录日志系统 账号: ssh developer@172.16.101.123 密码: zcy 日志中心 2、查看模块位置的指令 find -name web-item* 或 find ./ -name item-mi* (模糊搜索以web-item开头的

    2024年02月07日
    浏览(44)
  • 如何查看linux下java版本?

    1、如何查看linux下java版本? 2、linux系统上用什么命令查看本机运行的jdk的版本的 3、linux开发哪里好? 4、linux怎样确定jdk是否安装成功 5、怎样查看linux系统里面有没有jdk的安装包 6、怎么查看linux中jdk版本 1、linux如何查看jdk版本?我们一起来了解一下吧。打开linux服务器,然后

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包