java配置OOM时保存堆转储文件

简介: java配置OOM时保存堆转储文件

当Java程序发生OOM(OutOfMemoryError)时,如果想要自动转储堆内存以便分析,可以在启动JVM时配置下列参数:

-XX:+HeapDumpOnOutOfMemoryError

这个参数可以让JVM在抛出OOM异常时自动生成heap dump文件。

-XX:HeapDumpPath=./java_pid<pid>.hprof

指定生成的heap dump文件的存放路径和文件名,这里使用了pid作为文件名的一部分,可以将不同时间的堆转储区分开。

-XX:OnOutOfMemoryError=<命令>

当OOM发生时,可以执行指定的命令,例如用于通知或执行脚本。

所以典型的带有堆转储的启动参数可以是:

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof -Xmx512m ...

这样就可以在OOM发生时自动获取堆转储文件。分析这个文件可以定位内存泄漏或其他内存问题。

hprof文件自定义

一开始我想要使用生成时间作为heap dump文件名的一部分,配置方法如下:

-XX:HeapDumpPath=./java_oom-%t.hprof

经过实验,果然不行,原因是 HeapDumpPath 中如果使用 %t 或者 %%t 作为时间戳占位符,在运行时实际上并不能被 JVM 解析替换。

经过询问claude,得到两个解决方案,但是我还没实验,等验证过再来更新,先记录上

1.使用时间戳+计数器的方式生成唯一堆转储文件名

主要思路是:

  1. 启动Java程序时,使用一个循环脚本wrap着它
  2. 这个循环脚本中会不停地监听Java进程的PID
  3. 当检测到OOM产生时,脚本中会做两件事:
    3.1 动态设置HeapDumpPath参数,即堆转储文件的路径,文件名使用时间戳+计数器确保唯一性
    3.2 向Java进程发送kill -3 {pid} 信号,触发堆转储

这里的关键就是一旦监听到OOM事件,动态设置一个唯一的文件名,然后通知Java进程进行堆转储。

具体示例脚本代码:

# oom_wrap.sh
COUNT=1
while true; do
   PID=$(pgrep -f java) 
   if [ $? -ne 0 ]; then
     echo "Java process died"
     exit 1
   fi
   FILE=heapdump-${DATE}+${COUNT}.hprof  
   gsignal -s 3 -p heapdumpfile $FILE $PID 
   let COUNT=COUNT+1 
   sleep 10
done

启动Java程序时,用这个脚本包着:

./oom_wrap.sh java -Xmx128m ...

这里提到的gsignal是用来向进程发送信号的工具。

每次转储后复制文件到新的唯一文件名中

可以使用 Linux 的 crontab 定时任务来完成。

例如配置一个每小时执行的脚本:/path/to/heapdump-copy.sh

# heapdump-copy.sh
DUMP_DIR=/path/to/dumps
cd $DUMP_DIR
if [ -n "$(ls -1t java_oom_*.hprof | head -n 1)" ]; then
    NEWEST_DUMP=$(ls -1t java_oom_*.hprof | head -n 1)
    NEW_FILENAME=java_oom_$(date +%Y%m%d%H%M).hprof
    cp $NEWEST_DUMP $NEW_FILENAME
    echo "Copied new heap dump file $NEW_FILENAME"
fi

脚本逻辑:

  1. 检查 dumps 目录下最新的 java 堆转储文件
  2. 如果存在的话,复制到带时间戳的新文件名中

然后在 crontab 中增加定时任务:

0 * * * * /path/to/heapdump-copy.sh

这样就可以每小时检查并复制最新生成的 OOM 堆转储文件了。

crontab 定时任务还可以结合日志记录、监控报警使用,让自动化堆转储复制更加可靠。

相关文章
|
3月前
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
395 4
|
4月前
|
资源调度 安全 Java
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
113 1
|
20天前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
117 1
|
4月前
|
Java 应用服务中间件 Linux
在Java 12环境中配置和部署Apache Tomcat的步骤。
这段部署Tomcat的冒险旅程充满技术挑战,但同时也像游戏一样充满乐趣。它需要你提前准备,仔细执行,并随时准备解决意外情况。成功后,你就可以在这匹强壮的网络野马上,带着你的Java应用,冲向Web开发的璀璨星空。
154 56
|
3月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
3月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
230 14
|
3月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
102 0
|
3月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
238 0
|
4月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
411 5
|
4月前
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
284 0