JFR文件转储异常咨询:仅短时间运行时能写入内容
进程终止方式导致刷盘失败:JFR默认会把事件数据先暂存到内存缓冲区,只有在缓冲区满、达到定时刷盘周期,或者进程正常退出(比如收到
SIGTERM、调用System.exit())时,才会触发缓冲区数据刷盘。如果长时间运行的进程是异常终止(比如被kill -9强制杀死、OOM崩溃、系统强制重启),JFR来不及把缓冲区的剩余数据写入磁盘,就会出现空文件。而短时间运行的进程大概率是正常退出,刷盘流程能正常完成,所以文件有内容。事件配置或触发阈值不合理:如果你的JFR录制只配置了特定类型的事件(比如GC、线程阻塞),而长时间运行时进程处于低负载、无活动状态,这些事件没有被触发,自然没有数据可写入。另外,如果给事件设置了过高的阈值(比如只记录阻塞超过10秒的线程,而长时间运行中没有这么长的阻塞),也会导致无数据生成。短时间运行时可能刚好触发了这些事件,所以文件正常写入。
滚动录制策略配置冲突:虽然你设置了最大文件容量4G,但如果同时配置了
maxage(最大保留时长)参数,长时间运行后旧的录制文件会被自动删除,而最后正在写入的缓冲区数据如果没来得及刷盘,就会只剩空文件。比如设置了maxage=1h,运行超过1小时后,之前的有效文件被清理,进程终止时缓冲区数据没写入磁盘,最终就会得到空文件。JFR组件内部故障:长时间运行过程中,JFR的内部组件可能出现内存泄漏、死锁或其他异常,导致无法继续采集或写入数据。这种情况下,JVM的错误日志(比如
hs_err_pid*.log)里通常会有相关报错信息,可以排查这些日志确认是否有JFR相关的异常。磁盘I/O或权限问题:即便磁盘有足够空间,长时间运行时可能出现磁盘I/O阻塞(比如其他进程占用大量磁盘带宽),导致JFR缓冲区的数据无法及时写入磁盘,进程终止时数据还滞留在内存中。另外,要确认进程对JFR文件所在目录的读写权限是否持续有效,部分环境下长时间运行后可能出现权限变更(比如文件系统重新挂载、权限过期),导致无法写入数据。
内容的提问来源于stack exchange,提问作者bcm99

