OutOfMemoryError内存溢出相关的JVM参数

原文在这里: OutOfMemoryError内存溢出相关的JVM参数
扫一扫加关注【爪哇优太儿】
JVM提供了很多处理内存溢出的相关参数,本文主要来讲解下这些参数,当你遇到内存溢出的时候可能会对你非常有帮助,这些参数主要有:

1.-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath

2.-XX:OnOutOfMemoryError

3.-XX:+ExitOnOutOfMemoryError

4.-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://blog.gceasy.io/2019/06/19/outofmemoryerror-related-jvm-arguments/
如果感觉有用,欢迎扫描开头的二维码加关注。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值