2013-07-26 16 views
5

Ruby 1.9.3'te, bellek sorununu denetlemek için ObjectSpace kullanıyorum.ObjectSpace.count_objects'deki her bir hash değerinin anlamı nedir?

{: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} 

her karma değer ne anlama gelir: ObjectSpace.count_objects gibi görünen bir karma döndürür? Ve özellikle, neden: TOTAL uzun bir süre değişmeden kalıyor? Yeni bir nesne yaratılmadığı anlamına mı geliyor?

similar posting gördüm, ancak henüz iyi bir cevap yok.

+0

Olası çoğaltılabilir [On Ruby 1.9, ObjectSpace.count \ _objects çağrılırken karma tuşların anlamları nedir (özellikle: FREE,: T \ _ICLASS,: T \ _DATA ve: T \ _NODE)?] (https://stackoverflow.com/questions/3789929/on-ruby-1-9-what-are-the-meanings-of-the-hash-keys-when-calling-objectspace-cou) –

cevap

1
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>131, :T_OBJECT=>1550, :T_CLASS=>921, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18368, :T_REGEXP=>185, :T_ARRAY=>4 
196, :T_HASH=>254, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1311, :T_MATCH=>84, :T_COMPLEX=>1, :T_NODE=>3121, :T_ICLASS=>32} 
>> class MyClass ; end 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>203, :T_OBJECT=>1562, :T_CLASS=>923, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18333, :T_REGEXP=>185, :T_ARRAY=>4 
274, :T_HASH=>268, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1320, :T_MATCH=>97, :T_COMPLEX=>1, :T_NODE=>2956, :T_ICLASS=>32} 
>> MyClass = nil 
(irb):4: warning: already initialized constant MyClass 
(irb):2: warning: previous definition of MyClass was here 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>87, :T_OBJECT=>1572, :T_CLASS=>923, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18425, :T_REGEXP=>185, :T_ARRAY=>43 
39, :T_HASH=>279, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1328, :T_MATCH=>107, :T_COMPLEX=>1, :T_NODE=>2876, :T_ICLASS=>32} 
>> MyClass 
=> nil 
>> GC.start 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>7356, :T_OBJECT=>1549, :T_CLASS=>921, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>14100, :T_REGEXP=>184, :T_ARRAY=> 
3821, :T_HASH=>244, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>5, :T_DATA=>1285, :T_MATCH=>8, :T_COMPLEX=>1, :T_NODE=>657, :T_ICLASS=>32} 
>> 

T_CLASS nesnesine bakarak bunların sayım olduğunu görebiliriz. Sınıfı çıkardığımda ve Çöp Toplayıcıyı başlattığımda, sayımı tekrar azaltır.

TOTAL değeri değişmeden kalır, sayımın değişmediği MyClass gibi yeni bir nesne oluşturduğunuzda hiç bir nesne oluşturulmadığı anlamına gelmez. Bu, sadece zaman zaman değil, gerçek zamanlı olarak tekrar değerlendirileceği anlamına gelebilir.

Ancak, biraz matematikle, değerleri topladığımda ve TOTAL sayısını kaldırdığımda, TOTAL alırım. Yani, nesnelerin sayısının, count_objects nesnelerin sayısı hakkında rapor verdiği zaman, mantıklı olan sayıların sayısı gibi görünüyor.

+0

Teşekkürler vgoff, Şimdi Toplam ve Ücretsiz'in anlamı nedir? Ayrıca, karma veya dizi oluşturmuyorsanız, neden sayısı değişmeye devam ediyor? –

+0

Aradığınız yöntemlerin, uygulamalarında Array veya Hash nesneleri oluşturmadığından emin misiniz? Özgür, bakmadım, belki de serbest bırakılmış ve GC için hazır olan bir sayıdır? Yine de olsa tamamen spekülasyon. – vgoff

+0

Örneğinizde, sadece bir sınıf oluşturuyorsunuz değil mi? Dizi veya karma değil, ama değişmeye devam ediyorlar. Belki GC çalışıyor? –