首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectSpace.each_object(Foo).count

ObjectSpace.each_object(Foo).count
EN

Stack Overflow用户
提问于 2016-12-17 12:01:26
回答 2查看 253关注 0票数 2

我在试着找出ObjectSpace.each_object

在控制台中:

代码语言:javascript
复制
class Foo; end  
Foo.new  
ObjectSpace.each_object(Foo).count  
=> 1  
GC.start  
ObjectSpace.each_object(Foo).count  
=> 1 

我看过一些例子,我知道第二个计数应该是0。

你知道这是怎么回事吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-17 12:32:40

这取决于你的控制台。

IRB

最后一个结果被保存为_,即使它还没有被明确地分配。运行GC.start不会删除最后一个对象:

代码语言:javascript
复制
irb(main):001:0> class Foo; end
=> nil
irb(main):002:0>
irb(main):003:0* Foo.new
=> #<Foo:0x007fca7a309f98>
irb(main):004:0> p ObjectSpace.each_object(Foo).count; GC.start; p ObjectSpace.each_object(Foo).count
1
1
=> 1
irb(main):005:0> p ObjectSpace.each_object(Foo).count; GC.start; p ObjectSpace.each_object(Foo).count
1
0
=> 0

刺探

您可以使用___访问最后一个结果和第二个到最后一个结果:

代码语言:javascript
复制
[1] pry(main)> 'a'
=> "a"
[2] pry(main)> 'b'
=> "b"
[3] pry(main)> p _, __
"b"
"a"
=> ["b", "a"]

Pry保存了_out_ Pry::HistoryArray中最后100个结果:

代码语言:javascript
复制
[1] pry(main)> class Foo; end
=> nil
[2] pry(main)> Foo.new
=> #<Foo:0x007fd093102118>
[3] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[4] pry(main)> GC.start
=> nil
[5] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[6] pry(main)> _out_[2]
=> #<Foo:0x007fd093102118>

您可以使用_out_.pop!删除它的最后一个元素:

代码语言:javascript
复制
[1] pry(main)> class Foo; end
=> nil
[2] pry(main)> Foo.new
=> #<Foo:0x007fa90b1ad360>
[3] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[4] pry(main)> GC.start
=> nil
[5] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[6] pry(main)> 5.times{_out_.pop!}
=> 5
[7] pry(main)> GC.start
=> nil
[8] pry(main)> ObjectSpace.each_object(Foo).count
=> 0

在脚本中

如果你执行:

代码语言:javascript
复制
class Foo; end

Foo.new
p ObjectSpace.each_object(Foo).count

GC.start
p ObjectSpace.each_object(Foo).count

在脚本中,你可以得到:

代码语言:javascript
复制
1
0
票数 1
EN

Stack Overflow用户

发布于 2016-12-17 15:24:53

GC.start不强制垃圾收集器启动。

从文档中看有点不清楚,但它只是指示引擎安排垃圾收集。也就是说,不能依赖GC.start立即从堆中移除对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41198367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档