メモリー・リーク・プログラム

メモリー・リーク とは、繰り返しメモリーを割り当て、 それを使用してから、解放するのを怠ったために発生するプログラム・エラーのことです。

対話式アプリケーションなどの、長時間実行するプログラムでのメモリー・リークは、 重大な問題です。メモリーのフラグメント化や、実メモリーとページ・スペースに大部分ゴミが詰まった多数のページが累積する結果になるからです。 システムでは、1 つのプログラム内でのメモリー・リークが原因で、ページ・スペースを使い尽くしてしまうことが知られていました。

メモリー・リークは、svmon コマンドを使用して、 作業セグメントが増え続けるプロセスを探せば、検出できます。 カーネル・セグメント内のリークは、mbuf リークによって、またはデバイス・ドライバー、 カーネル・エクステンション、あるいはカーネルによっても、起きる可能性があります。 セグメントが増大しているかどうかを判別するには、 -i オプションを指定して svmon コマンドを使用し、プロセスまたはプロセスのグループを調べて、セグメントが増加し続けているかどうかを確認します。

問題のサブルーチンまたはコード行の識別はさらに困難で、特に AIXwindows アプリケーションでは、 多数の malloc() コールおよび free() コールが生成されます。 C++ には、メモリー使用率とリークの分析/チューニングのための HeapView Debugger が用意されています。 メモリー・リークの分析のためのサード・パーティー・プログラムが幾つか存在しますが、 それらのプログラムでは、プログラム・ソース・コードへのアクセスが必要になります。

一部の realloc() サブルーチンを使用すると、 実際のプログラミング・エラーではないのに、メモリー・リークと同じ影響をもたらす場合があります。 プログラムで、頻繁に realloc() サブルーチンを使用してデータ域のサイズを増やすと、realloc() サブルーチンによって解放されたストレージが、 何か他の用途に使用できない場合、プロセスの作業セグメントがどんどんフラグメント化される可能性があります。

必要なくなったメモリーを解放するには、disclaim() システム・コールおよび free() コールを使用します。 disclaim() システム・コールは、free() コールの前に使用する必要があります。 これは、プログラムがすぐに終了する予定の場合は、最後の malloc() コールの後でメモリーを解放するために、CPU 時間を浪費します。 プログラムが終了すると、作業セグメント・データが破棄され、作業セグメントが入っていた実メモリー・ページ・フレームはフリー・リストに追加されます。 以下の例は、メモリー・リーク・プログラムです。Inuse,PgspaceおよびAddress Range専用作業セグメントの値は継続的に増加しています。
# svmon -P 13548 -i 1 3
  Pid                         Command        Inuse        Pin      Pgsp  Virtual 64-bit Mthrd LPage
13548                          pacman         8535        2178      847     8533      N     N     N

Vsid     Esid Type  Description          LPage  Inuse    Pin  Pgsp  Virtual
    0       0 work  kernel seg               -   4375   2176   847     4375
48412       2 work  process private          -   2357      2     0     2357
6c01b       d work  shared library text      -   1790      0     0     1790
4c413       f work  shared library data      -     11      0     0       11
3040c       1 pers  code,/dev/prodlv:4097    -      2      0     -        -
ginger :svmon -P 13548 -i 1 3

  Pid                         Command        Inuse        Pin      Pgsp  Virtual 64-bit Mthrd LPage
13548                          pacman         8589       2178       847     8587      N     N     N

Vsid     Esid Type  Description          LPage  Inuse    Pin  Pgsp  Virtual
   0        0 work  kernel seg               -   4375   2176   847     4375
48412       2 work  process private          -   2411      2     0     2411
6c01b       d work  shared library text      -   1790      0     0     1790
4c413       f work  shared library data      -     11      0     0       11
3040c       1 pers  code,/dev/prodlv:4097    -      2      0     -        -

  Pid                         Command        Inuse        Pin      Pgsp  Virtual 64-bit Mthrd LPage
13548                          pacman         8599       2178       847     8597      N     N     N

 Vsid     Esid Type  Description          LPage  Inuse    Pin  Pgsp  Virtual
    0        0 work  kernel seg               -   4375   2176   847     4375
48412        2 work  process private          -   2421      2     0     2421
6c01b       d work  shared library text      -   1790      0     0     1790
4c413       f work  shared library data      -     11      0     0       11
3040c       1 pers  code,/dev/prodlv:4097    -      2      0     -        -