因此,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。
答案 0 :(得分:7)
基本上,所有符号在Ruby运行时动态创建(通过
to_sym
等)。可以被垃圾收集,因为它们没有在后面使用Ruby解释器里面的场景。但是,由于在代码中创建静态的新方法或符号而创建的符号不会被垃圾回收。例如,:foo
和def foo; end
都不会被垃圾回收,但"foo".to_sym
将有资格进行垃圾回收。
请参阅Richard Schneeman's post作为参考。