2010-02-15 13 views
22

रूबी में सभी वर्ग कक्षा कक्षा की वस्तुएं हैं। चूंकि कक्षाएं भी वस्तुएं हैं, क्या रूबी वीएम कक्षा वस्तुओं के लिए एक ही कचरा संग्रहण रणनीति का पालन करता है? क्या निर्धारित करता है कि कचरा संग्रह के लिए एक वर्ग वस्तु सुरक्षित है?रूबी क्लास ऑब्जेक्ट कचरा संग्रह

उत्तर

0

जब ऑब्जेक्ट से जोड़ने के लिए कुछ भी नहीं है, तो इससे छुटकारा पाने के लिए सुरक्षित है। जहां तक ​​कचरा संग्रह चलाया जाता है, वह मेरे ज्ञान से परे है।

+1

यह सामान्य रूप से सच है, लेकिन कक्षाओं को एक विशेष मामले के रूप में देखा जा सकता है। उदाहरण के लिए यदि किसी वर्ग के पास कोई उदाहरण नहीं है और किसी अन्य वर्ग द्वारा उप-वर्गीकृत नहीं किया गया है तो इसमें कोई 'लिंक' नहीं है (जैसा कि आप कहते हैं) लेकिन क्या यह वास्तव में जीसी के लिए सुरक्षित है? क्या होगा यदि कोई व्यक्ति बाद की तारीख में इसका उदाहरण बनाना चाहता है। मुझे नहीं लगता कि स्थिति कक्षाओं के लिए स्पष्ट रूप से कटौती के रूप में है :) – horseyguy

+0

@banister: यह वही मामला है जब मैं अन्य विशेष मामलों में इंगित करना चाहता था जहां एक जीसी को विशेष रूप से कक्षा वस्तु का इलाज करना पड़ सकता है रास्ता –

+1

पर्याप्त मेला। एक वर्ग कुछ भी स्थिर नहीं है, है ना? और आप निरंतर से छुटकारा नहीं पा सकते हैं, क्योंकि यह पर्यावरण के भीतर एक चर है (भले ही यह आईआरबी, या रनटाइम की 'मुख्य' वस्तु है), जब तक पर्यावरण पूरा नहीं हो जाता है। "कक्षा स्ट्रिंग" "स्ट्रिंग = क्लास.न्यू" जैसी ही बात है। – Trevoke

0

मुझे नहीं पता कि जवाब क्या है, लेकिन क्या आप प्रयोग से नहीं ढूंढ सकते? pickaxe पर एक नज़र डालें। मुझे यकीन है कि यह एक बहुत ही सरल परीक्षण है, और कोई बेहतर कर सकते हैं, लेकिन आप अंदाजा हो:

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" 

का उत्पादन:

[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]:~$ 

ऐसा लगता है कि एक धागा जरूरत है, लेकिन दुर्भाग्य से मैं मुझे काम करना चाहिए, माफ करना ...

1

मैंने इसका परीक्षण किया, जवाब ऐसा लगता है कि ऐसा लगता है।

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

एक और भी अधिक ठोस उदाहरण, एंड्रयू Cholakian के जवाब के लिए इसी तरह ObjectSpace उपयोग करने के लिए है। उदाहरण के लिए:

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 

यह दिखाता है कि गुमनाम वर्गों (कहीं भी एक निरंतर में सहेजा या उन वर्गों में से किसी भी इंस्टेंस द्वारा नहीं किया जाता) वास्तव में कचरा एकत्र मिलता है।

संबंधित मुद्दे