【jvm】 OutOfMemoryError内存溢出相关的JVM参数

JVM提供了很多处理内存溢出的相关参数,本文主要来讲解下这些参数,当你遇到内存溢出的时候可能会对你非常有帮助,这些参数主要有:

  • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath

  • .-XX:OnOutOfMemoryError

  • -XX:+ExitOnOutOfMemoryError

  • -XX:+CrashOnOutOfMemoryError

下面我们来详细的看下每个参数的意义和用法。

1.-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath

Heap Dump就是内存的一个映像,它包含了内存中的对象的详细信息,包括对象包含的数据、对象之间的引用关系等等。Heap Dump是用来诊断内存相关问题最重要的原料。

为了能够解决OutOfMemoryError或者是内存相关的问题,当发生内存溢出或者将要发生内存溢出的时候,我们首先需要去获取Heap Dump,在发生内存的时间点人工去获取Heap Dump是不现实的,因为我们不知道什么时候会发生内存溢出,但是在JVM启动的时候通过命令行给JVM传递如下的参数就可以在发生内存溢出的时候,自动生成Heap Dump:

比如:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof

-XX:HeapDumpPath指定了内存映像文件的存储路径。

只要给JVM传递了这2个参数,当发生内存溢出的时候,JVM会自动在指定目录下生成内存映像文件。

只要拿到了内存映像文件,就可以使用诸如MAT、HeapHero之类的工具来进行分析问题了。

2.-XX:OnOutOfMemoryError

当发生内存溢出的时候,还可以让JVM调用任一个shell脚本。大多数时候,内存溢出并不会导致整个应用都Crash掉,但是最好还是把应用重启一下,因为一旦发生了内存溢出,可能会让应用处于一种不稳定的状态,一个不稳定的应用可能会提供错误的响应。使用举例:

-XX:OnOutOfMemoryError=/scripts/restart-myapp.sh

当给JVM传递上述参数的时候,如果发生了内存溢出,JVM会调用/scripts/restart-myapp.sh这个脚本,在这个脚本中你可以去用优雅的办法来重启你的应用。

3.-XX:+CrashOnOutOfMemoryError

如果给JVM传递了这个参数,当发生内存溢出的时候,JVM就会退出,同时,JVM会产生文本和二进制格式的崩溃日志。但是,我是不建议配置上这个参数的,我们应该是以一种优雅的方式退出程序,粗暴的退出方式可能会损害正在进行的事务。

以前遇到过有个应用配置了-XX:+CrashOnOutOfMemoryError这个参数,当发生内存溢出的时候,JVM立马就退出了,并且在控制台有如下日志打印:

Aborting due to java.lang.OutOfMemoryError: GC overhead limit exceeded # # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (debug.cpp:308), pid=26064, tid=0x0000000000004f4c # fatal error: OutOfMemory encountered: GC overhead limit exceeded # # JRE version: Java(TM) SE Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode windows-amd64 compressed oops) # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:\workspace\tier1app-svn\trunk\buggyapp\hs_err_pid26064.log # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp #

日志中可以看出来,在C:\workspace\tier1app-svn\trunk\buggyapp\hs_err_pid26064.log目录下生成了崩溃日志文件,它里面包含了崩溃的详细信息。有些工具(fastThread)可以用来分析这个日志, 但是大多数时候,这些信息都很基础,根本无法定位内存溢出的原因。

4.-XX:+ExitOnOutOfMemoryError

如果传递了这个参数,当发生内存溢出的时候,JVM就会立马退出。如果你想在发生内存溢出的时候关闭应用那么可以使用这个参数。我一般也不会使用这个参数,道理同上。

我之前也遇到过配置了这个参数的应用,在发生内存溢出之后应用就退出了,不同的是这次JVM任何日志也没有产生,直接就退出了

转自:https://mp.weixin.qq.com/s/odcQT_Tup5yfazGNtj-bPg


__EOF__

本文作者彬在俊
本文链接https://www.cnblogs.com/erlou96/p/16878316.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   彬在俊  阅读(310)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示