Tôi đang gặp vấn đề với việc thu gom rác trong Ruby nơi một đối tượng mà tôi cho là bộ sưu tập rác không bị thu gom rác.Bộ sưu tập Garbarge trong Ruby với Thông tư Đối tượng Tham khảo
require 'ruby-mass'
def find_dependencies(_object_id,_mapped = {})
mapped = _mapped
points_to_object = Mass.references(Mass[_object_id])
ids = points_to_object.keys.map{|x| /\#(\d*)/.match(x).captures.first.to_i}
mapped[_object_id] = ids
unmapped = ids - mapped.keys
unmapped.each do |x|
new_deps = find_dependencies(x,mapped)
mapped.merge(new_deps)
end
mapped
end
Thực hiện một số nội dung tạo đối tượng và tìm ID đối tượng có liên quan. GC.start
, sau đó:
> find_dependencies(144789180)
=> {144789180=>[61895480, 144786340, 147807540],
61895480=>[144789180],
144786340=>[144789180],
147807540=>[144789180]}
Dường như có một mô hình tham chiếu vòng tròn ở đây, nhưng nó là tất cả hoàn toàn chứa trong bốn đối tượng, vì vậy các nhà sưu tập Mark-and-Sweep nên tìm chúng và loại bỏ chúng.
Vì vậy, hoặc có lỗi trong find_dependencies_function của tôi, đá quý khối lượng hoặc bộ thu gom rác của Ruby. Làm cách nào để thu hẹp điều này xuống để tìm hiểu vấn đề là gì và giải quyết sự rò rỉ bộ nhớ này?
Mark-and-quét không thể xử lý những thứ như thế. Để làm điều này, bạn phải sử dụng WeakRef trong các đối tượng đó để cho phép bộ thu loại bỏ toàn bộ cây. – Linuxios
Tại sao không thể đánh dấu và quét xử lý những thứ này? Tôi có thể thấy chúng sẽ trượt qua tính toán tham chiếu như thế nào, nhưng chúng không được đánh dấu và phải được thu thập, phải không? – aaronjg
Lần đầu tiên tôi phải hỏi - làm thế nào để bạn mất tham chiếu đối tượng? Có hoàn toàn * không * tài liệu tham khảo khác để các subobjects? – Linuxios