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
22
A
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.
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
- 1. Bộ sưu tập rác Ruby/Rails
- 2. C bộ sưu tập # rác với đối tượng tham chiếu
- 3. Bộ sưu tập rác java
- 4. Cách cấu hình bộ sưu tập rác trong Ruby
- 5. Bộ sưu tập rác với Ruby C Extension
- 6. Bộ sưu tập rác
- 7. Bộ sưu tập rác mỗi 100 giây
- 8. Bộ sưu tập rác và cgo
- 9. C# Bộ sưu tập rác Bộ rễ hoạt động
- 10. Bộ sưu tập và chủ đề rác
- 11. Bộ sưu tập rác trong dalvik vm
- 12. Bộ sưu tập rác trong bash
- 13. Bộ sưu tập Rác Javascript tạm dừng
- 14. Thu hồi bộ sưu tập rác PHP
- 15. Bộ sưu tập rác trong .Net 4.0
- 16. Bộ sưu tập rác tại Delphi
- 17. WinRT có bộ sưu tập rác không?
- 18. Bộ sưu tập Garbarge trong Ruby với Thông tư Đối tượng Tham khảo
- 19. REST - Xóa bộ sưu tập đối tượng
- 20. Các đối tượng tự sở hữu trong Bộ sưu tập rác mục tiêu-C
- 21. Đối tượng Dereferencing trong một mảng cho Bộ sưu tập rác Java
- 22. NewLISP có sử dụng bộ sưu tập rác không?
- 23. làm mới trình duyệt không làm bộ sưu tập rác
- 24. Bộ sưu tập Bộ lọc Thư rác Công khai
- 25. Thực hiện IXmlSerializable trên một đối tượng bộ sưu tập
- 26. Sắp xếp một bộ sưu tập của các đối tượng
- 27. Bộ sưu tập bản đồ của các đối tượng
- 28. Phát triển trò chơi Android và Bộ sưu tập rác
- 29. Kích hoạt bộ sưu tập rác .NET bên ngoài
- 30. Bộ sưu tập rác trong android (Thực hiện thủ công)
Đ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
@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 –
Đủ 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