[转帖]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/
如果感觉有用,欢迎扫描开头的二维码加关注。
[转帖]OutOfMemoryError内存溢出相关的JVM参数的更多相关文章
- Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
转载自:http://blog.sina.com.cn/s/blog_701c951f0100n1sp.html 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题, ...
- Java内存区域与内存溢出异常(JVM学习系列1)
相对于C.C++等语言来说,Java语言一个很美好的特性就是自动内存管理机制.C语言等在申请堆内存时,需要malloc内存,用完还有手动进行free操作,若程序员忘记回收内存,那这块内存就只能在进程退 ...
- Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug
由于android获取图片过大是会出现内存溢出的Bug 07-02 05:10:13.792: E/AndroidRuntime(6016): java.lang.OutOfMemoryError 解 ...
- 日志导致jvm内存溢出相关问题
生产环境日志级别为info,请看如下这行代码: LOGGER.debug("the DTO info: {}", JSON.toJSONString(DTO)); 这段代码主要有两 ...
- Java中OutOfMemoryError(内存溢出)的情况及解决办法
java.lang.OutOfMemoryError: Java heap space // TODO Auto-generated method stub Vector v = new Vector ...
- tomcat的OutOfMemoryError内存溢出解决方法
在tomcat安装路径bin目录下 打开catalina.bat在第一行加上 set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSi ...
- JVM探秘2--详解内存溢出OutOfMemoryError异常
JVM运行时内存被划分成多个区域,而除了程序计数器之外,其他几个区都会出现OutOfMemoryError异常,主要原因就是对应内存区域的内存不足以再分配内存,一般要么是内存泄漏了要么就是内存参数设置 ...
- 定位JVM内存溢出问题思路总结
JVM的内存溢出问题,是个常见而有时候有非常难以定位的问题.定位内存溢出问题常见方法有很多,但是其实很多情况下可供你选择的有效手段非常有限.很多方法在一些实际场景下没有实用价值.这里总结下我的一些定位 ...
- 性能测试三十六:内存溢出和JVM常见参数及JVM参数调优
堆内存溢出: 此种溢出,加内存只能缓解问题,不能根除问题,需优化代码堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java h ...
- 关于JVM内存溢出的原因分析及解决方案探讨
前言:JVM中除了程序计数器,其他的区域都有可能会发生内存溢出. 0.什么是内存溢出 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出. 1. ...
随机推荐
- 如何在Windows上将iOS应用上传到App Store
Application Uploader iOS App上架工具是一款非常好用的针对iOS苹果应用程序软件开发的实用编程工具,它的主要作用是帮助用户进行快速的程序应用设计和程序应用调试,节省用户进 ...
- Solon Web 开发:二、开发知识准备
1.约定 //资源路径约定(不用配置:也不能配置) resources/app.yml( 或 app.properties ) #为应用配置文件 resources/WEB-INF/static/ 或 ...
- 高性能 Jsonpath 框架,Snack3 3.2.57 发布
Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表示,ONode也 ...
- Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)
插件热插拔管理机制,简称:H-Spi.是框架提供的生产时用的另一种高级扩展方案.相对E-Spi,H-Spi 更侧重隔离.热插热拔.及管理性. 应用时,是以一个业务模块为单位进行开发,且封装为一个独立插 ...
- 深挖 Rundll32.exe 的多种“滥用方式”以及其“独特”之处
恶意软件作者通常会编写恶意软件模仿合法的Windows进程.因此,我们可能会看到恶意软件伪装成svchost.exe.rundll32.exe或lsass.exe进程,攻击者利用的就是大多数Windo ...
- PS 创建网络去掉反冲增强
一.当物料为反冲物料时,创建网络数据,希望去掉反冲标识 二.增强实施 在BAPI中传入反冲标识为空 在标准代码中发现反冲标识的赋值位置 判断当不传入反冲标识,将物料自带的反冲标识清空 定期更文,欢迎关 ...
- 汇编 | mov. add. sub指令
Description 前面我们用到了mov, add. sub指令,它们都带有两个操作对象.到现在,我们知道,mov指令可以有以下几种形式. mov 寄存器,数据 比如: mov ax,8 mov ...
- 【每日一题】23.Removal (计数DP)
补题链接:Here 计数DP讲解:Here 这是一个计数类的dp dp[i][j]表示前i个数字中,删除j个元素的方案数 很容易得到转移方程:\(f[i][j] = f[i - 1][j - 1] + ...
- 华东交通大学2019年ACM 双基 程序设计竞赛 个人题解(A - K)
目前先放几道题面,等晚上做完实验补 Update:A ~ D,更新剩余的题面(题面复制会有链接水印,懒得一一去除.直接截图) A.签到 真·签到题 输出祝贺祖国成立70周年!即可 B.欧涛的烦恼 思路 ...
- (组合游戏)SG函数与SG定理详解
有一段时间没记录知识类的博客了,这篇博客就说一下SG函数和SG定理吧 SG函数是用于解决博弈论中公平组合游戏(Impartial Combinatorial Games,ICG)问题的一种方法. 什么 ...