长时间运行应用的JFR文件轮转方法及当前配置疑问
JFR DumpOnExit 行为说明(针对长时间运行应用)
针对你设置的JFR参数,直接给出结论:
- 如果没有配置
maxsize(最大缓存/文件大小)或maxage(最大保留事件时长)参数,退出时生成的JFR文件会完整记录从应用启动到退出6天内的所有事件,不会做FIFO覆盖或日志轮转。
原因解释
你启用的是默认录制(defaultrecording=true),在未设置maxsize/maxage的情况下,JFR会持续将事件写入内存缓冲区,当缓冲区占满时会自动扩容(只要系统剩余内存允许),不会丢弃旧事件。直到应用触发退出逻辑时,才会把所有缓存的事件一次性dump到dumponexitpath指定的文件中。
注意事项与优化建议
6天的全量事件记录会生成体积非常大的JFR文件,可能带来两个问题:
- 磁盘空间被大量占用,甚至导致磁盘满;
- 后续用JDK Mission Control等工具分析时,加载超大文件会非常缓慢,甚至出现内存不足。
建议调整参数优化:
- 合并你的重复
FlightRecorderOptions配置,避免冗余:JFR_OPTS="-XX=UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -Djava.net.IPv4Stack=true -XX:+DebugNonSafepoints -XX:FlightRecorderOptions=stackdepth=128,defaultrecording=true,dumponexit=true,dumponexitpath=$APP_HOME/logs/$APP_NAME_$NOW.jfr" - 添加
maxsize和maxage参数限制,比如保留最近7天的事件,且总缓存/文件大小不超过100G(根据你的磁盘和内存情况调整):JFR_OPTS="-XX=UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -Djava.net.IPv4Stack=true -XX:+DebugNonSafepoints -XX:FlightRecorderOptions=stackdepth=128,defaultrecording=true,dumponexit=true,dumponexitpath=$APP_HOME/logs/$APP_NAME_$NOW.jfr,maxage=7d,maxsize=100g" - 或者定期通过
jcmd工具手动导出指定时间段的JFR文件,避免最终文件过大:jcmd <PID> JFR.dump filename=/path/to/partial_recording.jfr starttime=2024-05-20T00:00:00 endtime=2024-05-21T00:00:00
内容的提问来源于stack exchange,提问作者prasadsh
相关产品推荐
相关产品推荐

