PR

特定の状態にあるメモリーの保持者を調べる

 -hrオプションの結果を-hb*オプションを使って絞り込めば,どの状態にあるデータをどの保持者が持っているのかを知ることができそうです。しかし,そうしたプロファイル結果を直接取得することはできません。GHCでは今のところ,-hrオプションと-hbオプションを同時に使用できないからです。このため,別の-h<x>オプションによる結果を-hbオプションで絞り込み,その結果を-hrオプションで絞り込む必要があります。

 例として,BLACKHOLEの保持者を表示してみましょう。型やクロージャによる情報は,-hyオプションや-hdオプションに型やクロージャを表現する文字列を与えること抽出できます。-hrオプションとともに-hdBLACKHOLEまたは-hyBLACKHOLEを渡せば,BLACKHOLEの保持者を見ることができます。

$ ./Lazy2 +RTS -hdBLACKHOLE -K100M
500000500000
$ hp2ps -c Lazy2.hp
または
$ ./Lazy2 +RTS -hyBLACKHOLE -K100M
500000500000
$ hp2ps -c Lazy2.hp
Retainer Profiling: 0, at -0.015600 seconds
        Average number of visits per object = 1.074874
Retainer Profiling: 1, at 0.109202 seconds
        Average number of visits per object = 1.500114
Retainer Profiling: 2, at 0.249602 seconds
        Average number of visits per object = 1.500667

Retainer sets created during profiling:
SET 2 = {<MAIN.SYSTEM>}

 この結果から,1回も利用されないデータであるBLACKHOLEの保持者は,「SYSTEM」として表現されたシステムのスタックであることがわかります。

 -hrオプションと-hb*オプションを直接組み合わせることはできませんが,このように他のオプションとうまく組み合わせることで,特定状態にあるメモリーの保持者を調べられます。

 GHCのRTSでは,プロファイル結果を絞り込むための様々な方法が用意されています。興味があればGHCのマニュアルを参照してください(参考リンク)。

 さて,こうして得られた情報を使って領域漏れの問題を解決するには,具体的には何をすればいいでしょうか。次回はそれを説明します。