因此,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.
基本上,在Ruby运行时(通过等)动态创建的所有符号都可以被垃圾收集,因为它们不会在Ruby解释器内部的幕后使用.但是,由于创建一个静态内部代码的新方法或符号而创建的符号不会被垃圾回收.例如,两者都不会被垃圾收集,但是有资格进行垃圾收集.
to_sym
:foo
def foo; end
"foo".to_sym
请参阅Richard Schneeman的帖子作为参考.