正しく管理されていないメモリー割り当て関数やメモリー割り当て解除関数を呼び出すと、データの使い方の効率が低下し、プログラムパフォーマンスが低下する可能性があります。ヒープトレースでは、C 標準ライブラリメモリー割り当て関数 malloc、realloc、valloc、memalign、および割り当て解除関数 free 上で割り込み処理を行うことによって、コレクタはメモリーの割り当てと割り当て解除の要求をトレースします。mmap への呼び出しはメモリー割り当てとして扱われ、これによって Java メモリー割り当てのヒープトレースイベントを記録することが可能になります。Fortran 関数 allocate および deallocate は C 標準ライブラリ関数を呼び出すので、これらのルーチンも間接的にトレースされます。
Java プログラムのヒーププロファイリングはサポートされません。
表 2–3 メモリー割り当て (ヒープトレース) メトリック
メトリック |
定義 |
---|---|
割り当て |
メモリー割り当て関数の呼び出し回数。 |
割り当てバイト数 |
メモリー割り当て関数の各呼び出しで割り当てられたバイト数の合計。 |
リーク |
対応する割り当て解除関数の呼び出しを持たなかったメモリー割り当て関数の呼び出し回数。 |
リークバイト数 |
割り当てられたが割り当て解除されなかったバイト数。 |
ヒープトレースデータを収集すれば、プログラム内のメモリーリークを見つけたり、十分なメモリーが割り当てられていない場所を確認したりできます。
メモリーリークのもう 1 つの定義は、dbx デバッグツールなどでよく使用されているもので、それによると、メモリーリークとは、プログラムのデータ空間内のどこにもポインタが存在しない、動的に割り当てられるメモリーブロックです。ここで使用されるリークの定義にはこの代替定義を含みますが、ポインタが存在するメモリーも含みます。