2010-02-15 26 views
22

Ruby'de tüm sınıflar Class sınıfının nesneleridir. Sınıflar da nesneler olduğundan, bir Ruby VM sınıf nesneleri için aynı Çöp Toplama stratejisini izler mi? Bir sınıf nesnenin çöp toplama için güvenli olduğunu belirleyen nedir?Ruby Class nesne çöp toplama

cevap

0

Nesneye bağlanan hiçbir şey olmadığında, ondan kurtulmak güvenlidir. - Çöp toplama işlemi bittiğinde, bu benim bilgimin ötesinde.

+1

Bu genel olarak doğrudur, ancak sınıflar özel bir durum olarak görülebilir. Örneğin, bir sınıfın bir örneği yoksa ve başka bir sınıf tarafından alt sınıflanmamışsa, 'bağlantılar' yoktur (sizin de söylediğiniz gibi), ancak GC için gerçekten güvenli midir? Ya birisi daha sonraki bir tarihte bundan bir örnek oluşturmak isterse. Durumun, siz çıktıkça sınıflar için net bir kesim olduğunu düşünmüyorum :) – horseyguy

+0

@banister: Tam olarak, bir GC'nin bir sınıf nesnesini özel bir alanda tedavi etmesi gereken diğer özel durumlar arasında belirtmek istediğim durum tam da budur. yol –

+1

Yeterince adil. Bir sınıf, sabit bir şey değil, değil mi? Ve bir sabitten kurtulamazsınız, çünkü ortam tamamlanıncaya kadar bir ortamda (IRB'nin 'ana' nesnesi veya çalışma zamanı olsa bile) bir değişkendir. "class String", "String = Class.new" ile aynı şeydir. – Trevoke

0

Cevabın ne olduğu hakkında hiçbir fikrim yok, ama deneylerle öğrenemiyor musunuz? pickaxe'a bir göz atın. Bunun çok naif bir testtir ve birisi daha iyi yapabilirim eminim, ama fikir olsun:

puts "program start"  
include ObjectSpace 

class SfbdTest 
    def initialize(a) 
     @a = a 
    end 
end 
define_finalizer(SfbdTest, proc{|id| puts "GC on class"}) 

puts "creating instance" 
x = SfbdTest.new(1) 
define_finalizer(x, proc{|id| puts "GC on instance"}) 

puts "zombie-ing instance" 
x = nil 

puts "forcing GC" 
GC.start() 

puts "program end" 

üretir: Bir iş parçacığı ihtiyacı olduğu gibi

[email protected]:~$ ruby -w test.rb 
program start 
creating instance 
zombie-ing instance 
forcing GC 
program end 
GC on instance 
GC on class 
[email protected]:~$ 

görünüyor, ama ne yazık ki Çalışmam gerekiyordu, özür dilerim ...

1

Bunu test ettim, cevap öyle görünüyor.

irb(main):001:0> x = [] #Memory Usage = 12MB 
=> [] 
irb(main):002:0> 120000.times {x << Class.new} #Memory usage now at 41 MB 
=> 120000 
irb(main):013:0> x = [] 
=> [] 
irb(main):011:0> GC.start() #Memory usage now at 13MB 
=> nil 
12

Daha da somut bir örnek, Andrew Cholakian'ın yanıtına benzer bir şekilde ObjectSpace kullanmaktır. Örneğin:

2.1.1 :001 > ObjectSpace.count_objects[:T_CLASS] 
=> 884 
2.1.1 :002 > 10000.times { Class.new } 
=> 10000 
2.1.1 :003 > ObjectSpace.count_objects[:T_CLASS] 
=> 20884 
2.1.1 :004 > GC.start 
=> nil 
2.1.1 :005 > ObjectSpace.count_objects[:T_CLASS] 
=> 884 

Bu anonim sınıfları (her yerde sabit kaydedilmez ya da o sınıfların herhangi örnekleri tarafından kullanılan) gerçekten çöp toplanan alırım göstermektedir.

İlgili konular