jvm分析篇---1、先认识下dump文件
目录
一、简介
二、生成方式
三、Java Web项目配置参数
四、最佳实践
一、简介
Dump文件是JVM在运行过程中生成的内存快照文件,主要用于诊断Java应用的内存问题(如内存泄漏、OOM错误)和线程状态分析。在Java Web项目中,常见的dump文件类型包括:
- 堆Dump(Heap Dump)
记录JVM堆内存中所有对象的详细信息,包括对象类型、引用关系和内存占用。 $$ \text{文件大小} \approx \text{堆内存使用量} $$ - 线程Dump(Thread Dump)
捕获所有线程的瞬时状态(如调用栈、锁状态),用于分析死锁或线程阻塞问题。
二、生成方式
-
自动触发
- OOM错误时生成:通过JVM参数配置(见第三节)
- JVM崩溃时生成:如Native代码导致的崩溃(
hs_err_pid.log
)
-
手动触发
# 生成堆Dump jmap -dump:format=b,file=heapdump.hprof <pid># 生成线程Dump jstack -l <pid> > threaddump.txt
<pid>
通过jps
或ps -ef | grep java
获取 -
通过工具触发
- JVisualVM / JConsole 的"Heap Dump"按钮
- Arthas的
heapdump
/thread
命令 - Linux信号:
kill -3 <pid>
生成线程Dump到标准输出
三、Java Web项目配置参数
在应用服务器启动脚本中(如Tomcat的catalina.sh
或catalina.bat
)添加JVM参数:
# 基础配置示例(Tomcat)
JAVA_OPTS="$JAVA_OPTS
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/dumps/webapp_heapdump.hprof
-XX:ErrorFile=/opt/dumps/hs_err_pid%p.log
-XX:+PrintGCDetails
-Xloggc:/opt/dumps/gc.log"
参数 | 作用 | 推荐值 |
---|---|---|
-XX:+HeapDumpOnOutOfMemoryError | OOM时自动生成堆Dump | 必开启 |
-XX:HeapDumpPath | 指定堆Dump保存路径 | 绝对路径(确保写权限) |
-XX:ErrorFile | JVM崩溃日志路径 | %p 表示进程ID |
-XX:+CrashOnOutOfMemoryError | OOM时强制崩溃生成完整Dump | 可选 |
-XX:OnOutOfMemoryError | 触发自定义脚本 | 如 kill -3 %p |
四、最佳实践
-
路径配置
-XX:HeapDumpPath=/var/dumps/${webapp_name}_%t.hprof
%t
自动添加时间戳,避免覆盖 -
监控集成
- 使用APM工具(如SkyWalking、Pinpoint)自动捕获Dump
- 日志系统监控
java.lang.OutOfMemoryError
关键字
-
分析工具
- Eclipse MAT:分析堆Dump内存泄漏
- FastThread:在线分析线程Dump
java -jar mat.app/Contents/MacOS/MemoryAnalyzer heapdump.hprof
-
安全策略
- 限制Dump文件访问权限(避免敏感数据泄露)
- 定期清理旧文件(通过cron任务)
注:生产环境建议配置
-XX:+ExitOnOutOfMemoryError
防止故障扩散,同时确保Dump路径磁盘空间充足(通常预留2倍堆内存空间)。