所以从 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。