dump文件分析OOM及线程堆栈

OutOfMemoryError (OOM)

如果项目报错: OutOfMemoryError: Java heap space,说明堆内存空间(Heap Space)中没有足够的空间来分配对象了。
一旦发生 OOM,系统有可能不可用,或者频繁重启。属于非常严重的问题。

OOM 的解决方法一:

比较简单粗暴的一种做法,是增大堆内存空间。
在 项目启动时,调大 -Xms 和 -Xmx 。
-Xms 参数用于设置JVM的初始堆内存大小,而-Xmx参数用于设置JVM的最大堆内存大小。

-Xms1024m  -Xmx2048m

OOM 的解决方法二:

-Xms 和 -Xmx 哪怕调大了,如果没有找到根本的原因,大对象不断创建,不断地占用堆内存空间,还是有可能会继续 OOM。

可以设置在发生 OOM 时自动 dump 文件,保存到指定的文件。
dump文件是进程的内存镜像,可以通过分析 dump 文件,找到导致 OOM 的代码。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof

oom 代码示例:

不断循环,不断创建对象,占用堆内存空间,模拟 OOM 的场景。

public class OomTest {

    public static void main(String[] args)  {
        createObject();
    }

    /**
     * 不断循环,不断创建对象,模拟 OOM 的场景
     *
     */
    public static void createObject()  {
        List<OomObject> oomList =new ArrayList<>();
        while (true) {
            OomObject oomObject = new OomObject();
            oomList.add(oomObject);
        }
    }

}

添加 jvm 相关启动参数( Vm option ) :

  • 点击 Edit Configurations:
    在这里插入图片描述

  • 点击 Modify options, 选择 Add Vm Options :

在这里插入图片描述

启动参数( Vm option ) 如下:

添加启动参数,设置最大内存为 8m,模拟 OOM 的场景。

HeapDumpOnOutOfMemoryError 表示在发生 OOM 时会自动 dump 。

-Xms4m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/heapdump.hprof

运行代码:

结果如下:

Connected to the target VM, address: '127.0.0.1:63909', transport: 'socket'
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:/heapdump.hprof ...
Heap dump file created [31923817 bytes in 0.263 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3210)
	at java.util.Arrays.copyOf(Arrays.java:3181)
	at java.util.ArrayList.grow(ArrayList.java:261)
	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
	at java.util.ArrayList.add(ArrayList.java:458)
	at com.example.demo.oom.OomTest.createObject(OomTest.java:21)
	at com.example.demo.oom.OomTest.main(OomTest.java:14)

可以看到 :

java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:/heapdump.hprof …

这里的 D:/heapdump.hprof ,就是 dump 文件保存的路径。

打开 dump 文件,分析大对象

点击 Profiler ,再点击 Open Snapshot ,选择 上面的 dump 文件 D:/heapdump.hprof 。

在这里插入图片描述

点击 Biggest Objects, 接着再点击 Calculate retained size and biggest objects.
可以看到 OomObject 这个对象占用了最大的内存。

结果如下:

在这里插入图片描述

使用 jdk 自带的 java visualvm ,分析dump文件, 找到 OOM 的代码

另外,也可以下载 MAT(Memory Analyzer Tool) 来分析 dump 文件。
此处使用 jdk 自带的 java visualvm 来分析 dump 文件, 找到 导致OOM 的代码 。

在 jdk 的 bin 文件中,找到 jvisualvm.exe 。点击即可运行。

在这里插入图片描述

  • 装入 hprof 后缀的 dump 文件 :

打开 VisualVM 后,点击左上角的图标 ,装入, 文件名选择 之前的 dump 文件 D:/heapdump.hprof 。

文件类型 选择 【堆Dump(*.hprof)】。

在这里插入图片描述

可以看到,在出现 OutOfMemoryError 异常错误时进行了堆转储,导致 OutOfMemoryError 异常错误的线程 是哪一个。

点击这个线程,即可显示导致OOM的线程堆栈。
生产环境的 dump 文件,一般都会很大,好几G 都有可能。要等多一会 。

在这里插入图片描述

  • 可以看到OOM的具体代码是类的哪一行:
    最好结合上面分析出来的 大对象,一起排查。大对象占据过多的内存,就会导致某一次请求时OOM

在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Dump文件是指操作系统或应用程序在出现错误或崩溃时生成的一种二进制文件,用于记录程序运行时的内存和寄存器状态等重要信息。在分析dump文件时,我们可以通过各种工具和技术进行在线分析。 首先,我们可以使用调试器来加载和分析dump文件。调试器是一种可以查看和修改程序的运行状态的工具,它可以帮助我们理解程序在崩溃时的情况。通过调试器,我们可以查看程序的调用栈、变量值和寄存器状态等,从而找到导致程序崩溃的原因。 另外,还有一些专门用于分析dump文件的工具。例如,Windbg是一种强大的调试工具,它可以加载和分析Windows系统生成的dump文件。通过Windbg,我们可以查看程序的内存使用情况,跟踪程序的执行流程,并分析崩溃时的堆栈信息。此外,还有一些第三方工具如WinDbgX、DumpChk等也可以帮助我们对dump文件进行分析。 在线分析dump文件的好处在于可以直接在操作系统或云平台上进行,无需将dump文件下载到本地。这样可以节省时间和网络带宽,并提高分析效率。同时,在线分析还能够利用云平台的计算资源,加快分析速度,特别是当dump文件较大或分析复杂时。 综上所述,通过调试器和专业工具,在线分析dump文件可以帮助我们定位和解决程序的错误和崩溃问题,提高软件质量和稳定性。在线分析还具有高效快捷的特点,适用于各种规模和类型的应用程序。 ### 回答2: dump文件分析在线是指通过在线工具或平台对dump文件进行分析和解析。dump文件是指计算机系统在运行时出现异常或崩溃时生成的一种二进制文件,其中包含了系统状态、内存数据、寄存器值等关键信息,利用这些信息可以进行相关故障排查和问题分析。 在线分析工具通常提供了一系列功能,包括自动解析和显示dump文件的内容,提供基本的系统状态信息,如进程、线程、模块等,以及其他相关调试信息。它们还可以显示内存转储的内容和分析错误的原因。 通过在线分析工具,我们可以深入分析dump文件并识别问题的根源。例如,可以显示当前运行的进程和线程状态、调用堆栈(stack trace)信息、异常代码等。这些功能可以帮助开发人员定位并解决系统异常或崩溃的问题。 在线分析dump文件的好处包括方便快捷、无需下载安装额外软件,同时也保证了数据的安全性,防止机密信息泄露。此外,一些在线工具还提供了数据导出功能,便于进一步分析和处理。 总而言之,dump文件分析在线是指通过利用在线工具或平台对dump文件进行分析和解析,以便于开发人员和系统管理员快速定位和解决计算机系统异常或崩溃问题。 ### 回答3: dump文件分析是指对运行中的程序产生的崩溃文件或转储文件进行解读和调试的过程。这些dump文件中包含了程序在崩溃或异常时的内存状态和代码执行轨迹等关键信息,通过分析这些信息可以帮助开发人员定位和解决程序的问题。 在线的dump文件分析平台提供了一种方便快捷的方式来进行dump文件分析。用户可以将dump文件上传至该平台,然后平台会对文件进行解析和分析,提取出关键信息并进行可视化展示。 通过在线dump文件分析,用户可以获得以下几方面的帮助: 首先,分析平台可以快速定位崩溃的原因。通过解析dump文件中的信息,平台可以提供详细的调用堆栈和错误信息,帮助开发人员准确定位问题代码。 其次,分析平台可以提供运行时内存状态的可视化。开发人员可以查看dump文件中的内存快照,了解程序在崩溃之前的内存分配情况和对象状态,有助于深入理解问题出现的原因。 此外,分析平台还可以提供相关的建议和解决方案。基于对dump文件分析,平台可以向用户提供类似问题的解决方案或者给出可能的线索,帮助开发人员更快地解决问题。 总之,在线dump文件分析是一种方便、高效的调试辅助工具,通过它开发人员可以更快地定位和解决程序的问题,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值