Frage

Meine Anwendung ähnlich wie hypotetical Programm:

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

Hat keine Speicherlecks, aber auf meinem System, der Verbrauch an Speicher (oben, Spalte VSS) wächst ohne Grenzen (zB auf 300% des verfügbaren physischen Speichers). Ist das normal?

Aktualisiert - den Speicher für eine Weile nutzen und befreien Sie es dann. Ist das ein Unterschied?

War es hilfreich?

Lösung

Versuchen hinzufügen

  sbrk(-1);

am Ende jeder Schleife zu sehen, ob es Unterschied macht.

Die freie () nur freigibt Speicher, aber es ist ihm nicht zurück zu OS geben.

Andere Tipps

Das Verhalten ist normal. Zitiert man 3 malloc:

BUGS

Standardmäßig folgt Linux eine optimistische Speicherzuordnungsstrategie. Das bedeutet, dass, wenn malloc () gibt nicht-NULL es keine Garantie dafür gibt, dass die        Speicher wirklich verfügbar ist. Dies ist ein wirklich schlechten Fehler. Für den Fall, es stellt sich heraus, dass das System aus dem Speicher ist, einen oder mehrere Prozesse werden        von dem berüchtigten OOM Killer getötet. Im Falle Linux unter Umständen eingesetzt wird, wo es wäre weniger wünschenswert, plötzlich einige zu verlieren zufällig        Prozesse gepflückt, und darüber hinaus die Kernel-Version ist ausreichend neu, kann man dieses Verhalten Overcommit mit einem Befehl wie ausschalten:

       # echo 2 > /proc/sys/vm/overcommit_memory

Siehe auch das Kernel-Dokumentation Verzeichnis, Dateien vm / overcommit-Buchhaltung und sysctl / vm.txt.

Sie müssen (lesen / schreiben), um den Speicher berühren für den Linux-Kernel, um es tatsächlich zu reservieren.

Das Betriebssystem ordnet in der Regel alle Seiten als Copy-on-Write-Klone der „0“ Seite, das heißt eine feste Seite mit Nullen gefüllt. Lesen von den Seiten 0 zurück, wie erwartet. Solange Sie nur lesen, alle Verweise gehen die der gleiche physikalische Speicher. Sobald Sie einen Wert der „COW“ schreiben ist gebrochen und ein echter, physischer Seitenrahmen ist für Sie bereitgestellt. Diese bedeutet, dass, solange Sie sich nicht auf den Speicher schreiben halten bis der virtuelle Speicheradressraum abläuft Zuteilen Speicher oder Ihre Seitentabelle der gesamten verfügbaren Speicher füllt.

Solange Sie die ihm zugewiesenen Stücke das System nicht berühren sie nicht wirklich für Sie reservieren.
Sie können jedoch aus adressierbaren Raum laufen, die eine Grenze ist das Betriebssystem auf die Prozesse auferlegt, und ist nicht unbedingt das Maximum, das Sie mit dem Systemzeigertyp ansprechen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top