为什么我的ObjectSpace.dump不完整?

时间:2016-02-15 12:11:47

标签: ruby heap-memory

我有一个我不熟悉ObjectSpace.dump_all方法的行为:我需要关闭我的ruby控制台以获得没有截断的结果。

如何重现:

1)打开一个irb控制台(用2.2.3,2.2.4,2.3.0测试)

$ irb

2)运行以下脚本:

require 'objspace'
ObjectSpace.trace_object_allocations_start
dump = ObjectSpace.dump_all(output: :file)
cmd = "tail -1 #{dump.path}"
# => "tail -1 /var/folders/d2/xs3bvd7j1xb8t4bp188bbwc80000gn/T/rubyheap20160215-45059-6djhip.json"
`#{cmd}`
# => "{\"address\":\"0x7fb0822a7df0\", \"type\":\"NODE\", \"frozen\":true, \"node_type\":\"NODE_ARRAY\", \"references\":[\"0"

3)在另一个控制台中,运行相同的tail命令:

$ tail -1 /var/folders/d2/xs3bvd7j1xb8t4bp188bbwc80000gn/T/rubyheap20160215-45059-6djhip.json
{"address":"0x7fb0822a7df0", "type":"NODE", "frozen":true, "node_type":"NODE_ARRAY", "references":["0%

4)在这一步,我们清楚地看到转储没有通过有效的json完成。好的,下一步:关闭irb控制台并重做:

$ tail -1 /var/folders/d2/xs3bvd7j1xb8t4bp188bbwc80000gn/T/rubyheap20160215-45059-6djhip.json
{"address":"0x7fb0822a7fa8", "type":"OBJECT", "class":"0x7fb08216ba68", "ivars":3, "references":["0x7fb0822a7f08"], "memsize":40, "flags":{"wb_protected":true, "old":true, "long_liv
ed":true, "marked":true}}

现在,该文件是一个有效的Json。 但为什么必须关闭irb控制台才能获得全部导出?

1 个答案:

答案 0 :(得分:1)

好的,dump_all返回一个打开的File对象。 在dump_all之后,您必须关闭文件:

dump = ObjectSpace.dump_all(output: :file)
dump.close

Thx Uri Agassi