背景与现状:
- 直到最近,Ruby 缺乏在 Ruby 和原生 gem 内部检测原生级内存泄漏的机制,Ruby 终止时不会释放仍存活的对象或其虚拟机使用的内存,虽系统会回收所有内存,但这导致无法确定内存是泄漏还是未清理。
- 2021 年开发了ruby\_memcheck工具来检测原生 gem 中的内存泄漏,但使用启发式方法可能导致假阴性,且限于 Linux 系统。
RUBY_FREE_AT_EXIT 功能的实现:
- 2023 年,GitHub 的 Adam Hess 与作者合作开发了该功能,通过设置环境变量可在 Ruby 终止时释放所有内存,实现过程中存在循环依赖问题,通过确定需保持存活的对象来解决。
RUBY_FREE_AT_EXIT 的影响:
- 运行 Ruby 测试和规范后,通过 Valgrind 和 macOS 泄漏工具发现了 30 多个内存泄漏,如正则表达式匹配超时的内存泄漏。
- 该内存泄漏在GitHub PR #9765中被修复,主要改变包括更改超时检查函数、修改中断检查宏以及添加超时处理标签。
如何使用 RUBY_FREE_AT_EXIT:
- 有两个使用场景,一是在原生 gem 中查找原生级内存泄漏,对于原生 gem 维护者,可使用测试套件结合 RUBY_FREE_AT_EXIT 和内存泄漏检查工具;二是在 Ruby 应用中查找原生级内存泄漏,若怀疑应用存在此类问题可使用该功能和内存泄漏工具,但不能用于查找 Ruby 级内存泄漏。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。