Speicherleck-Programme

Ein Speicherleck ist ein Programmfehler, der darin besteht, wiederholt Speicher zuzuordnen, ihn zu verwenden und dann die Freigabe zu vernachlässigen.

Ein Speicherleck in einem Programm mit langer Laufzeit, z. B. in einer interaktiven Anwendung, ist ein schwerwiegendes Problem, da es zu einer Speicherfragmentierung und zur Anhäufung einer großen Anzahl von meist mit Garbage-Collectionem gefüllten Seiten im Realspeicher und im Paging-Bereich führen kann. Es ist bekannt, dass Systeme aufgrund eines Speicherlecks in einem einzigen Programm keinen Seitenauslagerungsbereich mehr haben.

Ein Speicherverlust kann mit dem Befehl svmon erkannt werden, indem nach Prozessen gesucht wird, deren Arbeitssegment kontinuierlich wächst. Ein Leck in einem Kernelsegment kann durch ein mbuf-Leck oder durch einen Einheitentreiber, eine Kernelerweiterung oder sogar den Kernel verursacht werden. Um festzustellen, ob ein Segment wächst, verwenden Sie den Befehl svmon mit der Option -i , um einen Prozess oder eine Gruppe von Prozessen zu untersuchen und festzustellen, ob ein Segment weiter wächst.

Die Identifizierung der fehlerhaften Subroutine oder Codezeile ist schwieriger, insbesondere in AIXwindows-Anwendungen, die eine große Anzahl von malloc () -und free () -Aufrufen generieren. C++ stellt einen HeapView Debugger zur Analyse/Optimierung der Speicherbelegung und Speicherlecks bereit. Einige Programme anderer Anbieter sind für die Analyse von Speicherlecks vorhanden, aber sie benötigen Zugriff auf den Programmquellcode.

Einige Verwendungen der Subroutine realloc () haben zwar keine Programmierfehler, können jedoch denselben Effekt wie ein Speicherleck haben. Wenn ein Programm häufig die Subroutine realloc () verwendet, um die Größe eines Datenbereichs zu erhöhen, kann das Arbeitssegment des Prozesses zunehmend fragmentiert werden, wenn der von der Subroutine realloc () freigegebene Speicher nicht für etwas anderes wiederverwendet werden kann.

Verwenden Sie den Systemaufruf disclaim () und den Aufruf free () , um nicht mehr benötigten Speicher freizugeben. Der Systemaufruf disclaim () muss vor dem Aufruf free () aufgerufen werden. Es verschwendet CPU-Zeit für die Freigabe von Speicher nach dem letzten malloc () -Aufruf, wenn das Programm bald beendet wird. Wenn das Programm beendet wird, wird sein Arbeitssegment zerstört und die Seitenrahmen des Realspeichers, die Arbeitssegmentdaten enthielten, werden der Liste freier Seiten hinzugefügt. Im folgenden Beispiel handelt es sich um ein Speicherleck-Programm, bei dem dieInuse,PgspaceundAddress RangeDie Werte des privaten Arbeitssegments wachsen kontinuierlich:
# 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     -        -