容器环境下Java17遇OOME退出时如何生成JFR文件?
解决JVM因OOME退出时无法生成JFR文件的问题
-XX:+ExitOnOutOfMemoryError会让JVM在触发OOME时直接终止进程,跳过了正常退出流程里的JFR dump步骤,所以默认配置下不会生成JFR文件。可以通过以下两种方式实现需求:
替换退出参数为
-XX:+CrashOnOutOfMemoryError
这个参数会让JVM在OOME时崩溃而非直接退出,崩溃过程会触发JFR的dump逻辑,生成指定的JFR文件。调整后的启动参数示例:java -XX:+CrashOnOutOfMemoryError -XX:StartFlightRecording:dumponexit=true app.jar自定义OOME异常钩子配合JFR API
如果必须保留ExitOnOutOfMemoryError,可以在代码中添加未捕获异常处理器,在OOME发生时主动调用JFR的dump方法,再触发JVM退出。示例代码:Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { if (throwable instanceof OutOfMemoryError) { try { // 指定JFR文件输出路径,按需调整 jdk.jfr.Recording.dump(java.nio.file.Paths.get("./oome-dump.jfr")); } catch (IOException e) { e.printStackTrace(); } System.exit(1); } });注意要确保JFR已正常启动,且容器进程对指定的输出路径有写入权限。
容器环境下额外注意:要确认JFR文件的输出路径在容器内有足够权限写入,避免因权限不足导致dump失败。
内容的提问来源于stack exchange,提问作者YutaSaito
相关产品推荐
相关产品推荐

