7

所以从 Ruby 2.2+ 版本开始引入符号的垃圾回收。我在 irb 中编写了以下代码片段:

before =  Symbol.all_symbols.size #=>3331
100_000.times do |i|
  "sym#{i}".to_sym
end

Symbol.all_symbols.size #=> 18835
GC.start
Symbol.all_symbols.size #=>3331

因此,正如预期的那样,它收集了所有动态生成的符号to_sym

那么 GC 是如何知道要收集哪些符号的呢?即使它们在程序中被引用,它会收集符号吗?符号垃圾回收是如何工作的?如果程序中引用了我创建的符号之一,它还会收集它吗?

我正在使用 Ruby 2.2.1。

4

1 回答 1

9

基本上,在 Ruby 运行时(通过等)动态创建的所有符号都可以被垃圾收集,因为它们没有在 Ruby 解释器的幕后使用。但是,由于创建新方法而创建的符号或静态位于代码内部的符号将不会被垃圾回收。例如,两者都不会被垃圾收集,但是有资格进行垃圾收集。to_sym:foodef foo; end"foo".to_sym

请参阅Richard Schneeman 的帖子作为参考。

于 2015-12-10T11:55:46.707 回答