Weblogic14.1.1搭配OpenJDK11出现chunk rotation报错如何排查解决
问题解决指南
报错可能诱因
- JFR意外启用:Weblogic 14.1.1默认集成了JFR诊断组件,若域配置中开启了性能分析、飞行记录器相关诊断功能,或是启动参数中隐含
-XX:StartFlightRecording类配置,都会触发JFR后台运行,和常规认知里JFR默认关闭的情况不同。 - 触发IOException的常见场景:
- 权限变更:运行周期内如果有系统安全巡检脚本、定时权限整改任务修改了.jfr文件或其父目录的读写权限,会导致JFR无法读取文件大小属性,你看到的.jfr文件为空就是权限不足无法写入导致的,并非JFR没有执行写入动作。
- 文件句柄异常:进程长时间运行后出现文件句柄泄漏,达到系统设定的单进程句柄上限,或是JFR持有的chunk文件句柄被意外释放,都会触发文件访问IO异常。
- 系统层面锁冲突:Red Hat Enterprise Linux 8.4的内核文件锁机制和JDK11.0.2的JFR文件访问逻辑存在兼容性问题,长时间运行后可能出现锁占用,导致无法读取文件元信息。
获取异常细节的方案
不需要修改JDK内置模块,用JDK自带工具即可拿到完整错误信息:
- 开启JFR debug日志:在Weblogic启动参数中添加
-Xlog:jfr*=debug,该参数会输出JFR所有内部运行日志,包含该IOException的完整堆栈信息,对业务性能无明显影响。 - 报错时抓取进程状态:执行
lsof -p <Weblogic进程ID> | grep .jfr查看JFR持有的文件句柄状态,同时用jstack <Weblogic进程ID>抓取线程堆栈,可定位IO异常的直接触发原因。 - 追踪系统调用:用
strace -p <Weblogic进程ID> -e trace=file可直接捕获JFR访问文件时的系统调用错误码,比如返回EACCES对应权限问题、返回EMFILE对应句柄超限。
排查解决思路
临时规避(无需重启进程)
使用JDK自带jcmd工具直接关闭运行中的JFR记录即可停止报错:
- 先执行
jcmd <Weblogic进程ID> JFR.check查看当前运行的所有JFR记录 - 执行
jcmd <Weblogic进程ID> JFR.stop终止所有JFR记录
该操作不会影响Weblogic核心业务运行,仅会关闭JFR诊断功能。
永久修复(下次重启生效)
彻底禁用JFR功能即可完全解决该问题:
- 在Weblogic域的
setDomainEnv.sh启动脚本中添加如下参数:
export JAVA_OPTIONS="$JAVA_OPTIONS -XX:-FlightRecorder -XX:FlightRecorderOptions=defaultrecording=false"
- 登录Weblogic控制台,进入
域配置>诊断>飞行记录器页面,取消所有启用飞行记录器的勾选,避免Weblogic自动启动JFR记录。
同类问题说明
该问题在Weblogic 14.1.1 + JDK11的技术栈下非常常见,已有大量用户反馈过相同报错,根因均为Weblogic默认开启的JFR诊断组件长时间运行后出现文件访问异常,禁用JFR后均未再复现。
内容的提问来源于stack exchange,提问作者Redbirdpat
相关产品推荐
相关产品推荐

