[转帖]OutOfMemoryError内存溢出相关的JVM参数

outofmemoryerror,内存,溢出,相关,jvm,参数 · 浏览次数 : 0

小编点评

**XX:+HeapDumpOnOutOfMemoryError** * 该参数指定了内存映像文件的存储路径。 * 当发生内存溢出时,JVM会自动生成内存映像文件并将其存储在指定目录下。 * 这可以帮助到诊断内存相关问题非常有效。 **XX:HeapDumpPath** * 该参数指定了内存映像文件的存储路径。 * 当发生内存溢出时,JVM会自动生成内存映像文件并将其存储在指定目录下。 * 这可以帮助到诊断内存相关问题非常有效。 **XX:OnOutOfMemoryError** * 当发生内存溢出的时候,JVM会调用任一个shell脚本。 * 最常情况下,内存溢出并不会导致整个应用都Crash掉,但是最好还是把应用重启一下,因为一旦发生了内存溢出,可能会让应用处于一种不稳定的状态,一个不稳定的应用可能会提供错误的响应。 **XX:CrashOnOutOfMemoryError** * 当发生内存溢出的时候,JVM就会退出,同时,JVM会产生文本和二进制格式的崩溃日志。 * 但我是不建议配置上这个参数的,我们应该是以一种优雅的方式退出程序,粗暴的退出方式可能会损害正在进行的事务。 **其他参数** * **-XX:+HeapDumpOnOutOfMemoryError:** 指定了内存映像文件的存储路径。 * **-XX:HeapDumpPath:** 指定了内存映像文件的存储路径。 * **-XX:+ExitOnOutOfMemoryError:** 当发生内存溢出的时候,JVM就会立即退出。 * **-XX:+CrashOnOutOfMemoryError:** 当发生内存溢出的时候,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/
        如果感觉有用,欢迎扫描开头的二维码加关注。

        文章知识点与官方知识档案匹配,可进一步学习相关知识
        Java技能树首页概览105050 人正在系统学习中

        与[转帖]OutOfMemoryError内存溢出相关的JVM参数相似的内容:

        [转帖]OutOfMemoryError内存溢出相关的JVM参数

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

        [转帖]jvm一般相关配置OutOfMemoryError关参数配置解释

        一般运行java应用都会根据实际情况设置一些jvm相关运行参数 特别是有关内存和oom溢出等参数,方便后续问题定位和解决 如常用的以下配置 nohup java -Xms256m -Xmx24g -Xmn8g -verbose:gc -XX:+PrintGCDateStamps -XX:+Print

        [转帖]fastJson与一起堆内存溢出'血案'

        https://www.jianshu.com/p/876d443c2162 现象 QA同学反映登录不上服务器 排查问题1--日志级别 查看log,发现玩家登录的时候抛出了一个java.lang.OutOfMemoryError 大概代码是向Redis序列化一个PlayerMirror镜像数据,但是

        [转帖]Java实战之OutOfMemoryError异常问题及解决方法

        https://www.jb51.net/article/244872.htm + 目录 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError (下文称OOM)异常的可能。本篇主要结合着【深入理解Java虚拟机】一书当中整理了本篇博客

        [转帖]修改jmeter内存配置(win&mac&linux)

        目录 一、背景: 二、win环境下修改jmeter内存 三、mac&linux环境下修改jmeter内存 四、验证内存是否修改成功 一、背景: 在进行大数据、高并发压测的过程性,有时会遇上JMeter卡死现象,使得测试无法进行,查看日志显示:java.lang.OutOfMemoryError: J

        [转帖]高手总结的9种 OOM 常见原因及解决方案

        https://zhuanlan.zhihu.com/p/79355050 当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。 1、Java heap space 当

        [转帖]GC overhead limit exceeded原因分析及解决方案

        https://zhuanlan.zhihu.com/p/88956975 最近一个上线运行良好的项目出现用户无法登录或者执行某个操作时,有卡顿现象。查看了日志,出现了大量的java.lang.OutOfMemoryError: GC overhead limit exceeded错误。 oracl

        [转帖]一次操作系统报错OutOfMemory Error的处理记录

        在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to a

        [转帖]JVM中OOM常见几种类型

        https://www.cnblogs.com/shemlo/p/11665917.html Java中的OOM java.lang.StackOverflowError java.lang.OutMemoryError:Java heap space java.lang.OutMemoryErro

        [转帖]

        Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to