【发布时间】:2013-10-03 21:38:38
【问题描述】:
我找不到太多文档说明何时适合在 Ruby 扩展中将 VALUE 声明为 volatile 以避免过早地对使用中的对象进行垃圾回收。
这是我到目前为止所学到的。有谁可以填空吗?
当volatile不需要时需要使用:
- 在 C++ 对象成员中(因为它们从不在堆栈上?)
- 在不调用 Ruby API 的 C/C++ 方法中(因为在调用 Ruby API 之前 GC 不会打开)
当volatile确实需要使用时
- 在调用任何 Ruby
ALLOC或malloc宏/函数的 C/C++ 方法中(因为这些会在内存高度碎片化时触发 GC) - 在调用任何 Ruby 函数的 C/C++ 方法中(例如,
rb_funcall、rb_ary_new等)
其他避免GC的方法
- 标记正在使用的
VALUEs - 在对象创建期间禁用 GC,然后重新启用它
- 不要使用 Ruby 的分配方式(有风险)
一切都正确吗?我缺少什么细节?除了标记,volatile是唯一的方法吗?
【问题讨论】:
标签: c++ c ruby garbage-collection mark-and-sweep