11

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]}

ここには循環参照パターンがあるように見えますが、これらの 4 つのオブジェクトにすべて完全に含まれているため、Mark-and-Sweep コレクターはそれらを見つけて削除する必要があります。

つまり、私の find_dependencies_function、Mass gem、または Ruby のガベージ コレクターにバグがあります。これを絞り込んで問題を特定し、このメモリ リークを解決するにはどうすればよいですか?

4

1 に答える 1