【发布时间】:2013-08-26 12:44:10
【问题描述】:
我想知道为什么下面的代码显然不会垃圾收集据称不再在任何地方引用的匿名模块(未扩展/包含,未命名,包含设置为 nil 的数组)。
如果有人能用相对简单/通用的编程语言来阐明幕后发生的事情,我将不胜感激。有没有一种特殊的红宝石方法来实现这一点?无论如何都不能对匿名模块/类进行垃圾收集吗?还是我只是被我得到的内存统计数据误导了?
注意:我使用的是 ruby 1.9.3;不知道 ruby 2.x 是否会改变任何东西...... 注意 2:无论模块是否定义 foo 方法,结果都是相同的
提前致谢。
puts("INITIAL OBJECT SPACE OBJECTS : #{ObjectSpace.count_objects}")
i = 100000
ms = []
i.times do
ms << Module.new do
def foo()
puts('foo method called')
end
end
end
puts("#{i} MODULES CREATED")
puts("OBJECT SPACE OBJECTS : #{ObjectSpace.count_objects}")
ms = nil
ObjectSpace.garbage_collect
puts("#{i} MODULES GARBAGE COLLECTED")
puts("WAITING TO END PROGRAM")
stop = gets
puts("FINAL OBJECT SPACE OBJECTS : #{ObjectSpace.count_objects}")
我说“显然没有垃圾收集”,因为我的操作系统任务管理器没有显示该进程的内存使用量有任何减少,并且调用 ObjectSpace.count_objects 会产生以下内容,我读到(错误地如此?)为:没有你的模块使用的内存没有被释放。
初始对象空间对象:{:TOTAL=>14730, :FREE=>251, :T_OBJECT=>8, :T_CLASS=>542, :T_MODULE=>21, :T_FLOAT=>7, :T_STRING=>6349 , :T_REGEXP=>24, :T_ARRAY=>1009, :T_HASH=>14, :T_BIGNUM=>3, :T_FILE=>10, :T_DATA=>408, :T_MATCH=>108, :T_COMPLEX=>1, : T_NODE=>5956, :T_ICLASS=>19}
已创建 100000 个模块
对象空间对象:{:TOTAL=>311794, :FREE=>59829, :T_OBJECT=>6, :T_CLASS=>542, :T_MODULE=>100021, :T_FLOAT=>7, :T_STRING=>3332, :T_REGEXP=>22, :T_ARRAY=>23868, :T_HASH=>10, :T_BIGNUM=>3, :T_FILE=>3, :T_DATA=>100324, :T_COMPLEX=>1, :T_NODE=>23807, :T_ICLASS =>19}
100000 模块垃圾收集 等待结束程序
最终对象空间对象:{:TOTAL=>311794, :FREE=>107155, :T_OBJECT=>6, :T_CLASS=>542, :T_MODULE=>100021, :T_FLOAT=>7, :T_STRING=>3335 , :T_REGEXP=>22, :T_ARRAY=>203, :T_HASH=>10, :T_BIGNUM=>3, :T_FILE=>3, :T_DATA=>100324, :T_COMPLEX=>1, :T_NODE=>143, : T_ICLASS=>19}
【问题讨论】:
-
试试这个ruby-doc.org/core-1.9.3/GC.html#method-c-start 而不是
ObjectSpace.garbage_collect。请告诉我。 -
对我来说,它产生相同的值 21 - 31 - 31,使用您下面答案中的代码示例(请参阅那里的评论)。
标签: ruby class module garbage-collection anonymous-class