读取.jfr文件触发OutOfMemoryError,如何调整jfr工具的堆内存大小?
解决方法
方法1:通过JAVA_TOOL_OPTIONS环境变量传递JVM参数
jfr本质是运行在JVM上的Java程序,JDK提供的JAVA_TOOL_OPTIONS环境变量可以为当前会话启动的所有Java进程传递自定义JVM参数,操作方式如下:
- Linux/macOS 终端执行:
export JAVA_TOOL_OPTIONS="-Xmx4g" jfr print --events "jdk.CPULoad" <你的jfr文件路径> # 执行完后可执行unset JAVA_TOOL_OPTIONS取消环境变量,避免影响其他Java程序
- Windows cmd 执行:
set JAVA_TOOL_OPTIONS="-Xmx4g" jfr print --events "jdk.CPULoad" <你的jfr文件路径>
- Windows PowerShell 执行:
$env:JAVA_TOOL_OPTIONS="-Xmx4g" jfr print --events "jdk.CPULoad" <你的jfr文件路径>
这里的-Xmx4g代表分配4GB堆内存,你可以根据文件大小调整数值,1.5GB的jfr文件分配2-4GB堆即可正常运行。
方法2:直接调用jfr主类指定堆内存
如果不想全局设置环境变量影响其他Java进程,可以直接手动启动jfr的主类并传入JVM参数:
java -Xmx4g jdk.jfr.internal.tool.Main print --events "jdk.CPULoad" <你的jfr文件路径>
额外优化建议
如果jfr文件过大,也可以先使用jfr自带的裁剪命令缩小文件范围后再分析,无需分配过高堆内存:
# 按时间范围裁剪 jfr truncate --start <起始时间> --end <结束时间> --output 裁剪后的文件.jfr 原文件.jfr # 仅保留指定事件裁剪 jfr view --events "jdk.CPULoad" 原文件.jfr --output 仅含CPU负载事件的文件.jfr
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

