Ruby-doc有这样的描述:
ObjectSpace模块包含许多与垃圾收集工具交互的例程,允许您使用迭代器遍历所有活动对象.
ObjectSpace还为对象终结器提供支持,当特定对象即将被垃圾回收销毁时将调用这些过程.
任何人都可以用更简单的语言解释这个,如果没有,至少提供有关使用它的地方的信息?
在ruby 2.0.0/247或头上试过这个:
require 'objspace'
ObjectSpace.trace_object_allocations -> undefined method `trace_object_allocations'
for ObjectSpace:Module
Run Code Online (Sandbox Code Playgroud)
文档说它应该工作http://www.ruby-doc.org/stdlib-2.0/libdoc/objspace/rdoc/ObjectSpace.html知道我缺少什么?
在ruby 1.9.3中,我使用ObjectSpace来检查内存问题.ObjectSpace.count_objects返回一个哈希,如下所示:
{:TOTAL=>1004232, :FREE=>258543, :T_OBJECT=>12519, :T_CLASS=>10318, :T_MODULE=>1330,
:T_FLOAT=>2024, :T_STRING=>555422, :T_REGEXP=>3543, :T_ARRAY=>68372, :T_HASH=>5399,
:T_STRUCT=>542, :T_BIGNUM=>8105, :T_FILE=>10, :T_DATA=>44277, :T_MATCH=>6, :T_COMPLEX=>1,
:T_RATIONAL=>82, :T_NODE=>31973, :T_ICLASS=>1766}
Run Code Online (Sandbox Code Playgroud)
每个哈希值是什么意思?特别是,为什么:TOTAL长时间保持不变?这是否意味着没有创建新对象?
我看到了类似的帖子,但还没有好的答案.
在Mike HR和Stefan对我的一个问题发表评论之后,我注意到ObjectSpace.each_object(String)包括我能想到的任何字符串:
strings = ObjectSpace.each_object(String)
strings.include?("some random string") # => true
Run Code Online (Sandbox Code Playgroud)
要么
strings = ObjectSpace.each_object(String).to_a
strings.include?("some random string") # => true
Run Code Online (Sandbox Code Playgroud)
我认为strings应该只包括那时存在的字符串.为什么它包含任何字符串?
然而,当我计算长度时strings,它返回一个有限数:
ObjectSpace.each_object(String).to_a.length # => 15780
Run Code Online (Sandbox Code Playgroud)
这可以在Ruby 2.1.2p95(2014-05-08修订版45877)[x86_64-linux]解释器和irb上观察到.
这与Ruby 2.1中引入的冻结字符串文字优化有什么关系吗?