用于分析红宝石堆垃圾场的CLI。感谢Sam Saffron的想法和初始代码。
将此行添加到您的应用程序的gemfile:
gem 'heapy'然后执行:
$ bundle
或自行安装:
$ gem install heapy
运行两个输入,以输出toder.dump的值。
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
运行三个输入以显示前两个之间的差异,但前提是当对象仍保留在第三个
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump tmp/today_afternoon.dump
Retained STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
# ...
以输出文件的名义和今天存在的对象传递。
$ heapy diff tmp/yesterday.dump tmp/today.dump --output_diff=output.json
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
# ...
Writing heap dump diff to output.json
由于MRI中的垃圾收集器如何在红宝石堆上管理对象,因此在以下情况下, heapy diff可能会产生不完整或不正确的差异:
GC.compact手动压实红宝石堆或启用自动复杂性时,Heapy无法产生准确的差异,因为对象可能会进入不同的堆插槽,即使没有,它们也会出现新分配的差异。通常,将现有对象从一个堆插槽移至另一个堆的任何机制都将无效DIFF报告。在服用<after>堆库之前,请务必关闭压实。<after>转储的对象,然后将它们分配给了<before> dumver中的不同对象,然后在两个转储之间进行了处理。为了最大程度地减少发生这种情况的机会,在堆垃圾箱之间触发主要的GC三次或更多次可以帮助终身幸存者,从而在服用差异之前稳定堆。步骤1)生成一个堆转储。您可以手动执行此操作。或者您可以使用DERAIDED_BENCHMARCS之类的工具
步骤2)一旦获得了堆转储,您可以使用此CLI分析它:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump
Generation: nil object count: 209191
Generation: 14 object count: 407
Generation: 15 object count: 638
Generation: 16 object count: 748
Generation: 17 object count: 1023
Generation: 18 object count: 805
# ...
注意:您可能获得“零”一代的原因是这些对象在代码开始跟踪分配之前已加载到内存中。为了确保跟踪所有分配,您可以执行Ruby脚本此技巧。首先创建一个仅开始分配跟踪的文件trace.rb :
# trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start
现在,请确保在运行脚本之前加载此命令,您可以使用Ruby's -I指定负载路径,然后-r指定库以需要
$ ruby -I ./ -r trace script_name.rb
如果文件的最后一行是无效的JSON,请确保在将Ruby Heap Dump写入其后关闭文件。
您可以深入到特定的一代。在上一个示例中,第17代看起来很大,您可以深入研究:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17
Analyzing Heap (Generation: 17)
-------------------------------
allocated by memory (44061517) (in bytes)
==============================
39908512 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/timeout.rb:79
1284993 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/openssl/buffering.rb:182
201068 /app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:223
189272 /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.13.2.302/lib/new_relic/agent/stats_engine/stats_hash.rb:39
172531 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/net/http/header.rb:172
92200 /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.3/lib/active_support/core_ext/numeric/conversions.rb:131
您可以通过传递--lines值来限制输出:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17 --lines=6
注意:默认行值为50
如果您想阅读所有几代人,则可以使用“全”指令
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump all
您还可以将T-LO的在线基于JS的堆分析仪进行可视化。另一个工具是
查看回购后,运行$ bundle install以安装依赖项。然后,运行rake spec以运行测试。
要将此GEM安装到本地计算机上,请运行bundle exec rake install 。要发布新版本,请在version.rb中更新版本号,然后运行bundle exec rake release ,该版本将为版本创建一个git标签,推送git consits and tags,然后将.gem文件推到rubygems.org。
欢迎在https://github.com/schneems/heapy上的GitHub上的错误报告和拉动请求。该项目旨在是一个安全,热情的协作空间,预计贡献者将遵守撰稿人契约的行为准则。
根据MIT许可证的条款,该宝石可作为开源。