首页
/ Async-profiler中文件描述符泄漏导致JVM异常问题分析

Async-profiler中文件描述符泄漏导致JVM异常问题分析

2025-05-28 18:37:39作者:平淮齐Percy

在async-profiler项目的使用过程中,开发者发现了一个可能导致JVM异常行为的严重问题。该问题表现为在执行多次性能分析采集后,停止命令会返回"Unexpected EOF reading response"错误,并可能伴随应用程序出现大量EBADF(错误文件描述符)的I/O异常。

问题现象

当用户按照以下步骤操作时,约50%的概率会重现该问题:

  1. 启动CPU分析采集(使用JFR输出格式)
  2. 短暂运行后停止采集
  3. 再次启动采集
  4. 第二次尝试停止采集时出现错误

问题不仅限于CPU分析事件,使用timer事件同样可以触发。该问题在OpenJDK 11、17和21等多个版本上均能复现,且似乎与JFR输出模式有较强关联性。

根本原因

经过深入分析,发现问题根源在于async-profiler的Recording类中存在文件描述符管理缺陷。具体表现为:

  1. _memfd成员变量未正确初始化,默认为0(标准输入的文件描述符)
  2. 析构函数中会无条件关闭这个文件描述符
  3. 在运行过程中还会对fd 0执行lseek、sendfile、ftruncate和write等操作

这种对标准输入文件描述符的错误操作会引发一系列连锁反应:

  • 关闭标准输入导致后续I/O操作失败
  • 对标准输入的随机修改破坏了JVM的正常I/O状态
  • 最终表现为"Unexpected EOF"错误和应用程序的EBADF异常

解决方案

该问题已在项目的最新提交中修复,主要修改是确保_memfd成员变量初始化为-1(无效文件描述符),避免误操作标准输入。修复后,所有异常现象均消失。

经验教训

这个案例为我们提供了几个重要的开发经验:

  1. 资源句柄初始化:所有资源句柄(如文件描述符)都应显式初始化为无效值,不能依赖默认值
  2. 防御性编程:在操作资源前应验证其有效性
  3. 错误处理:对系统调用失败的情况应有妥善处理机制
  4. 测试覆盖:边界条件和异常路径的测试同样重要

对于性能分析工具这类需要与JVM深度交互的软件,任何资源管理不当都可能造成严重后果,因此需要格外谨慎。

总结

文件描述符管理是系统编程中的基础但关键的部分。async-profiler的这个案例展示了即使是一个简单的未初始化变量,也可能导致复杂的系统级问题。开发者在使用类似工具时,应当关注其版本更新,及时获取包含重要修复的稳定版本,以避免潜在的风险。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
165
2.05 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
954
563
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
60
16
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
0
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
17
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
408
387
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Python
77
71
rainbondrainbond
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
14
1