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