CLI لتحليل مقالب كومة روبي. بفضل Sam Saffron للفكرة والرمز الأولي.
أضف هذا السطر إلى Gemfile في التطبيق الخاص بك:
gem 'heapy'
ثم تنفيذ:
$ bundle
أو تثبيته بنفسك على النحو التالي:
$ gem install heapy
قم بتشغيل اثنين من المدخلات لإخراج قيم اليوم. 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
نظرًا لكيفية قيام جامع القمامة في التصوير بالرنين المغناطيسي بإدارة الكائنات على كومة الياقوت ، قد ينتج عن heapy diff
فرقًا غير مكتملة أو غير صحيحة في ظل الظروف التالية:
GC.compact
أو مع تمكين الانتشار التلقائي ، لا يمكن لـ Heapy إنتاج فرق دقيقة ، لأن الكائنات قد تنتقل إلى فتحات كومة مختلفة وستظهر على أنها مخصصة حديثًا حتى لو لم تكن كذلك. بشكل عام ، فإن أي آلية تنقل الكائنات الموجودة من فتحة كومة إلى أخرى ستؤدي إلى إبطال تقارير Diff. قم دائمًا بإيقاف تشغيل الضغط قبل أخذ <after>
تفريغ الكومة.<after>
إذا قام Ruby بتخصيصها في فتحات الكومة التي كانت تشغلها مسبقًا من قبل كائنات مختلفة في DUMP <before>
، والتي تم تعاملها بعد ذلك بين كلا القمامة. لتقليل فرصة حدوث ذلك ، يمكن أن يؤدي تشغيل GC كبرى ثلاث مرات أو أكثر بين مقالب الكومة إلى مساعدة الناجين وبالتالي تثبيت الكومة قبل أخذ فرق.الخطوة 1) توليد تفريغ كومة. هل يمكن أن تفعل هذا يدويًا. أو يمكنك استخدام أداة مثل derained_benchmarks
الخطوة 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
# ...
ملاحظة: السبب في أنك قد تحصل على جيل "لا شيء" هو تحميل هذه الكائنات في الذاكرة قبل أن تبدأ الكود في تتبع المخصصات. لضمان تتبع جميع التخصيصات ، يمكنك تنفيذ البرنامج النصي الخاص بك في هذه الخدعة. قم أولاً بإنشاء ملف trace.rb
ملف والذي يبدأ فقط تتبع التخصيص:
# trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start
-r
-I
$ ruby -I ./ -r trace script_name.rb
إذا كان السطر الأخير من ملفك غير صالح JSON ، فتأكد من إغلاق الملف بعد كتابة تفريغ كومة Ruby إليه.
يمكنك أن تنتقل إلى جيل معين. في المثال السابق ، يبدو الجيل 17'th كبيرًا بشكل غريب ، يمكنك الحفر فيه:
$ 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
إذا كنت ترغب في قراءة جميع الأجيال ، يمكنك استخدام التوجيه "All"
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump all
يمكنك أيضًا استخدام محلل الكومة القائم على JS على الإنترنت من T-Lo للتصورات. أداة أخرى هي Harb
بعد التحقق من إعادة الريبو ، قم $ bundle install
لتثبيت التبعيات. ثم ، قم بتشغيل rake spec
لتشغيل الاختبارات.
لتثبيت هذه الأحجار الكريمة على جهازك المحلي ، قم بتشغيل bundle exec rake install
. لإصدار إصدار جديد ، قم بتحديث رقم الإصدار في version.rb
، ثم قم بتشغيل bundle exec rake release
، والذي سيقوم بإنشاء علامة GIT للإصدار ، و Push Git Commits و Tags ، ودفع ملف .gem
إلى rubygems.org.
يتم الترحيب بتقارير الأخطاء وطلبات السحب على Github على https://github.com/schneems/heapy. يهدف هذا المشروع إلى أن يكون مساحة آمنة ومرحبة للتعاون ، ومن المتوقع أن يلتزم المساهمون بقواعد سلوك العهد المساهم.
الجوهرة متوفرة كمصدر مفتوح بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا.