我在 Ruby 中遇到垃圾收集问题,我认为应该是垃圾收集的对象没有被垃圾收集。
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
做一些制作对象的事情,并找到相关的对象 ID。GC.start
, 然后:
> find_dependencies(144789180)
=> {144789180=>[61895480, 144786340, 147807540],
61895480=>[144789180],
144786340=>[144789180],
147807540=>[144789180]}
看起来这里有一个循环引用模式,但它都完全包含在这四个对象中,所以 Mark-and-Sweep 收集器应该找到它们并将它们删除。
因此,我的 find_dependencies_function、Mass gem 或 Ruby 的垃圾收集器中存在错误。如何缩小范围以找出问题所在并解决此内存泄漏?