垃圾收集符号Ruby 2.2.1

时间:2015-12-10 11:39:10

标签: ruby garbage-collection ruby-2.2

因此,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。

1 个答案:

答案 0 :(得分:7)

  

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

请参阅Richard Schneeman's post作为参考。