用於分析紅寶石堆垃圾場的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許可證的條款,該寶石可作為開源。