ヒープ領域中にあるオブジェクトのダンプ

ってできないかねぇ?と先日同僚に聞かれたのですが、業務中は面接したり打ち合わせしたり技術調査をしたりで時間がなさそうなのと「これは何だか趣味の領域だなぁ」と思ったので、自宅で深夜こしょこしょとruby処理系へのpatchを書いていたのでした。

で、それらしく動いてきたのでgithubにpushしておきました。
http://github.com/komamitsu/ruby_heap_monitor

使い方とかは上記のいんちき英語のREADMEをみていただければ、何とか雰囲気はわかると思うのですが、まぁpatch当ててrubyコンパイルするとObjectSpaceにprint_objectsというクラスメソッドが追加されるので書き込みモードでオープンしたFileオブジェクトを渡すとヒープ領域にあるオブジェクトをそのファイルに書き落とす、というものです。

懸念事項としては、どうもブロック内のオブジェクトに対する参照が上手く追えていないような気がするので困ったなぁ、と。

あと、Nodeオブジェクトが多すぎてうざいのだけどブロック内オブジェクトを参照しているのがNodeオブジェクトくらいしか見当たらないので、仕方なくそうしている向きがあるが、本当にそうなのか?Node以外のオブジェクトからもブロック内オブジェクトを参照しているのでは?という点が気になっています。

今回、いろいろ復習が必要そうだったのでRHGを読みなおしてみたのですが、GCのための工夫が随所に見られ、それが処理系の複雑さを激増させているのだなぁ、と改めて感じましたとさ。