Sheap
https://github.com/jhawthorn/sheap
Rubyのheap dump anaylyzer
heap dumpを探索してインタラクティブに問い合わせることができる
The answer is in your heap: debugging a big memory increase in Ruby on Rails
Rails 7.0 から Rails 7.1 にアップグレードした後、アプリケーションのメモリ使用量が約 25% 増加した
増加は起動時ではない
Pumaの設定変更はしてない
derailed_benchmarkでheap dumpを出力
あるモデルインスタンスが大量にあることがわかった
sheapでさらに調査をした
モデルインスタンスを見つけることができ、これを参照しているものをヒープのルートまで遡って特定できた
singleton classでinstance_evalしている
singleton classはRuby VMでキャッシュされる
ActionControllerやActiveRecordのインスタンスを参照するオブジェクトでsingleton methodが定義されると、GCされずに残り続けてしまう
Rails本体へのパッチで解消し、7.1.3でリリースされた https://github.com/rails/rails/pull/50298
使用例
So We've Got a Memory Leak…