2010-02-15 32 views
22

Trong ruby ​​tất cả các lớp là đối tượng của lớp Class. Vì các lớp cũng là các đối tượng, nên một máy ảo Ruby có thực hiện theo cùng một chiến lược Bộ sưu tập rác cho các đối tượng lớp không? Điều gì quyết định rằng một đối tượng lớp là an toàn cho việc thu gom rác thải?Bộ sưu tập rác đối tượng Ruby Class

Trả lời

0

Khi không có gì liên kết với đối tượng, thì sẽ an toàn để loại bỏ nó. Theo như thu gom rác thải, điều đó vượt quá sự hiểu biết của tôi.

+1

Điều này là đúng, nhưng các lớp học có thể được xem là trường hợp đặc biệt. Ví dụ nếu một lớp không có trường hợp và không được phân lớp bởi bất kỳ lớp nào khác, nó không có 'liên kết' (như bạn nói) nhưng nó có thực sự an toàn đối với GC không? Điều gì xảy ra nếu ai đó có ý định xây dựng một thể hiện từ nó vào một ngày sau đó. Tôi không nghĩ rằng tình hình là rõ ràng cho các lớp học như bạn làm ra :) – horseyguy

+0

@banister: Đây chính xác là trường hợp tôi muốn chỉ ra trong số các trường hợp đặc biệt khác mà GC có thể phải đối xử với một đối tượng lớp trong một đặc biệt cách –

+1

Đủ công bằng. Một lớp học không là gì ngoài một hằng số, phải không? Và bạn không thể loại bỏ một hằng số, vì nó là một biến trong một môi trường (ngay cả khi nó là đối tượng 'chính' của IRB hoặc thời gian chạy), cho đến khi môi trường được thực hiện. "chuỗi lớp" giống với "String = Class.new". – Trevoke

0

Tôi không biết câu trả lời là gì, nhưng bạn có thể không tìm ra bằng cách thử nghiệm không? Hãy xem qua số pickaxe. Tôi chắc chắn rằng đây là một thử nghiệm rất ngây thơ, và ai đó có thể làm tốt hơn, nhưng bạn sẽ có được ý tưởng:

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" 

Tạo:

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

Hình như nó cần một chủ đề, nhưng tiếc là tôi 'được cho là đang hoạt động, xin lỗi ...

1

Tôi đã thử nghiệm điều này, câu trả lời là có vẻ như vậy.

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

Ví dụ cụ thể hơn, tương tự như câu trả lời của Andrew Cholakian là sử dụng ObjectSpace. Ví dụ:

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 

Điều này cho thấy các lớp ẩn danh (không được lưu ở bất kỳ nơi nào hoặc được sử dụng bởi bất kỳ trường hợp nào) thực sự thu gom rác.

Các vấn đề liên quan