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

jvm,一般,相关,配置,outofmemoryerror,参数,解释 · 浏览次数 : 0

小编点评

**Java OutOfMemoryError分析工具** **方法:** * `-XX:+HeapDumpOnOutOfMemoryError`:将堆转储文件存储到指定的路径上。 * `-XX:HeapDumpPath={HEAP-DUMP-FILE-PATH}`:指定堆转储文件的存储路径。 * `-XX:OnOutOfMemoryError`:当抛出 `OutOfMemoryError` 时调用指定的脚本。 * `-XX:+CrashOnOutOfMemoryError`:在 `OutOfMemoryError` 抛出时立即退出应用程序。 * `-XX:+ExitOnOutOfMemoryError`:当 `OutOfMemoryError` 抛出时立即退出应用程序,但不生成文本/二进制崩溃文件。 **示例:** ``` -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError=/scripts/restart-myapp.sh -XX:+CrashOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError ``` **使用说明:** 在运行应用程序之前,使用 `-XX:+HeapDumpOnOutOfMemoryError` 等参数启动应用程序。这将自动创建一个堆转储文件并将其存储在指定路径上。 如果 `OutOfMemoryError` 异常发生时,应用程序将自动生成 `hs_err_pid` 文件以提供有关崩溃的信息。可以使用 `fastThread` 等工具分析 `hs_err_pid` 文件。 **注意:** * 这些参数仅用于捕获 `OutOfMemoryError` 异常。 * 即使使用 `ExitOnOutOfMemoryError` 参数,应用程序仍可能出现异常,因为 JVM 可能已退出但尚未清理资源。 * `HeapDumpPath` 参数的默认值是 `null`,表示使用 `System.getProperty("java.io.memory.threshold")` 获取的内存阈值。

正文

 一般运行java应用都会根据实际情况设置一些jvm相关运行参数 特别是有关内存和oom溢出等参数,方便后续问题定位和解决

如常用的以下配置

nohup java -Xms256m -Xmx24g -Xmn8g -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:log/gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=2 -XX:GCLogFileSize=100M -XX:+CrashOnOutOfMemoryError -jar app.jar  >/dev/null 2>&1 &

具体参数说明参考官方文档 https://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

-verbose:gc 打印每次垃圾回收事件信息 和 -XX:+PrintGC 效果一样,官方文档中有说明:两者功能一样,都用于垃圾收集时的信息打印。但是也有不同点:
-verbose:gc 是 稳定版本

XX:+PrintGC 是 非稳定版本

Xms256m  配置初始堆大小 256m

-Xmx24g   最大堆大小 24g

-Xmn8g    年轻代大小 8g

-XX:+PrintGCDateStamps   此参数主要定义GC Log 的时间戳信息,通常以“基准时间”形式打印。

 2022-06-07T08:09:50.902+0800: 51117.527: [GC (Allocation Failure) [PSYoungGen: 1195854K->17659K(1205248K)] 1288769K->110574K(1311744K), 0.0581524 secs] [Times: user=0.04 sys=0.00, real=0.05 secs] 

-XX:+PrintGCDetails  打印gc详细信息 格式如下

[GC (Allocation Failure) [PSYoungGen: 1195854K->17659K(1205248K)] 1288769K->110574K(1311744K), 0.0581524 secs]

Xloggc:log/gc-%t.log             定义GC Log 的存储路径以及所输出的文件名称。

-XX:+UseGCLogFileRotation   定义GC Log 的滚动功能,需要进行开启或关闭,其通常基于Xloggc配置一起使用

-XX:NumberOfGCLogFiles=2   主要定义滚动日志文件的个数  

对应的日志文件  命名策略为:<filename>.0、<filename>.1、 ... 、 <filename>.n-1等

-XX:GCLogFileSize=100M   定义滚动日志文件的大小   

当前写日志文件大小超过该   参数值时,日志将写入下一个文件,依次类推。

-XX:+CrashOnOutOfMemoryError

# -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof    发生oom自动生成堆栈信息便于后续分析原因
# -XX:OnOutOfMemoryError=/script/restart.sh      发生oom时调用脚本重启应用程序
# -XX:+ExitOnOutOfMemoryError      发生oom立即退出,无任何信息文件生成,不建议使用
# -XX:+CrashOnOutOfMemoryError    发生oom后立即退出,JVM还会生成文本和二进制崩溃文件

重点有关OutOfMemoryError 配置说明如下

JVM提供了有用的参数来处理 OutOfMemoryError 。在本文中,我们将重点介绍这些JVM参数。在排除OutOfMemoryError故障时,它可能会很方便。这些JVM参数是:

1. -XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath

2. -XX:OnOutofmemoryError

3. -XX:+ExitOnOutOfMemoryError

4. -XX:+CrashOnOutOfMemoryError

让我们在本文中详细讨论这些JVM参数。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath

堆转储dump文件基本上是内存的快照。它包含有关内存中存在的对象、这些对象中存在的实际数据以及这些对象的引用的详细信息。堆转储是解决内存问题的重要工件。

为了诊断OutOfMemoryError或任何与内存相关的问题,必须在应用程序开始遇到OutOfMemoryError之前的某一时刻或几分钟捕获堆转储。很难在适当的时候手动捕获堆转储,因为我们不知道何时抛出OutOfMemoryError。但是,通过在命令行中启动应用程序时传递以下JVM参数,可以自动捕获堆转储:

  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -XX:HeapDumpPath={HEAP-DUMP-FILE-PATH}

例子:

  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -XX:HeapDumpPath=/crasks/my-heap-dump.hprof

在’ -XX:HeapDumpPath '中,需要指定存储堆转储的文件路径。

当您传递这两个JVM参数时,当抛出OutOfMemoryError时,堆转储将被自动捕获并写入指定的文件路径。

一旦捕获了堆转储,就可以使用诸如HeapHero、Eclipse MAT之类的工具来分析堆转储。

-XX:OnOutOfMemoryError

您可以将JVM配置为在抛出OutOfMemoryError时调用任何脚本。大多数情况下,OutOfMemoryError不会使应用程序崩溃。但是,一旦发生OutOfMemoryError,最好重新启动应用程序。因为OutOfMemoryError可能会使应用程序处于不稳定状态。来自不稳定应用程序实例的请求可能导致错误的结果。

例子:

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

当您传递此参数时,JVM将调用“/scripts/restart-myapp.sh“,每当抛出OutOfMemoryError时编写脚本。在这个脚本中,您可以编写代码来优雅地重新启动应用程序。

-XX:+CrashOnOutOfMemoryError

当您传递此参数时,JVM将在抛出OutOfMemoryError时立即退出。除了退出,JVM还会生成文本和二进制崩溃文件(如果启用了核心文件)。但就我个人而言,我不喜欢配置这个论点,因为我们应该始终以实现优雅的退出为目标。突然退出可能/将危及正在进行的交易。

我运行了一个生成OutOfMemoryError的应用程序,其参数为’ -XX:+CrashOnOutOfMemoryError’。当抛出OutOfMemoryError时,我可以看到JVM立即退出。下面是标准输出流中的消息:

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

从消息中,您可以看到要在“C:\workspace\tier1app-svn\trunk\buggyapp\hs_err_pid26064.log”中生成的hs_err_pid文件。hs_err_pid文件包含有关崩溃的信息。您可以使用fastThread之类的工具来分析hs_err_pid文件。但是hs_err_pid中的大部分时间信息都是非常基本的。仅对OutOfMemoryError进行故障排除是不够的。

-XX:+ExitOnOutOfMemoryError

当您传递这个参数时,JVM将在抛出OutOfMemoryError时立即退出。如果要终止应用程序,可以传递此参数。但就我个人而言,我不喜欢配置这个论点,因为我们应该始终以实现优雅的退出为目标。突然退出可能/将危及正在进行的交易。

我用这个 -XX:+ExitOnOutOfMemoryError 参数运行了相同的内存泄漏程序。与’ -XX:+CrashOnOutOfMemoryError '不同,这个JVM参数在JVM刚刚退出没有生成任何文本/二进制文件。

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

与[转帖]jvm一般相关配置OutOfMemoryError关参数配置解释相似的内容:

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

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

[转帖]为什么说JVM是黑盒子般存在,从Java 虚拟机原理内存开始

https://maimai.cn/article/detail?fid=1739907745&efid=ALbQzkwOvQr-0GryeUzRsw 为什么要学习 JVM 在很多 Java 程序员的开发生涯里,JVM 一直是黑盒子一般的存在,大家只知道运行 Java 程序需要依靠 JVM,千篇一律

[转帖]JVM监控及诊断工具-命令行

https://www.cnblogs.com/xiaojiesir/p/15622372.html 性能指标 停顿时间(响应时间) 提交请求和返回响应之间使用的时间,一般比较关注平均响应时间 常用操作的响应时间列表: 操作 响应时间 打开一个站点 几秒 数据库查询一条记录(有索引) 十几毫秒 机械

[转帖]【JVM】GC算法与垃圾收集器

引入 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,可以有效的防止内存泄露,有效的使用空闲的内存; 内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般

[转帖]java中方法不要写太长的真正原因

https://www.iteye.com/blog/enetor-976070 java中一般建议一个方法不要写的过长,不方便维护和阅读是其中的一个原因,但是其真正性能的原因大家知道吗? 我们知道,JVM一开始是以解释方式执行字节码的。当这段代码被执行的次数足够多以后,它会被动态优化并编译成机器码

[转帖]一文看尽 JVM GC 调优

https://zhuanlan.zhihu.com/p/428731068 首先看一个著名的学习方法论 向橡皮鸭求助学会提问,提问也是一门艺术提问前,先投入自己的时间做好功课发生了什么事情问题的基本情况你投入的研究和发现能正确提出你的问题,你的问题差不多已经解决一半深入的思考你的问题,大多情况下,

[转帖]【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列

【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列 作者:冰河 2022-11-04 四川 本文字数:13519 字 阅读完需:约 44 分钟 写在前面 最近,一直有小伙伴让我整理下关于 JVM 的知识,经过十几天的收集与整理,初版算是整理出来了。希望对大家有所帮助。 JDK 是

[转帖]JVM metaspace outofmemory

https://www.jianshu.com/p/1ca44f94e42f 解决服务器进程退出问题(metaspace溢出) 现象 策划反应服务器进不去,远程看了一下进程消失了(crash) 有时候也会出现能登录,但是无法执行操作(进程还在),无法被正常shutdown 进程根目录下出现了java

[转帖]JVM内存非典型术语介绍(shallow/retained/rss/reserved/committed)

https://www.jianshu.com/p/871d6bb3a32d JVM内存非典型术语介绍(shallow/retained/rss/reserved/committed) 背景 ​ 在服务器性能优化内存这一项时,有一些现象很诡异。如top显示的RES很大,但是实际jvm堆内存占用很小,

[转帖]jvm crash when overwritten running jar

https://www.jianshu.com/p/bf0a051e4c63 现象 策划热更完配置表后 jvm直接就crash了(开发机linux) crash日志 日志分析 从crash日志看是reload配置表 使用Reflections扫描配置类 最终读取jar包 java.util.zip.