Frage

Mein Programm verwendet viel Speicher. Dies ist das, was mir Valgrind Massif Tool zeigt:

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 28 38,531,086,036      760,235,208      143,002,822   617,232,386            0

Wie Sie sehen können, ist ein zusätzlicher Teil einige Male größer als nützlicher Haufen.

Was soll ich tun, um dieses zusätzliche Speicher zu reduzieren? Weniger Zuteilungen?

Ist das sogenannte Gedächtnisfragmentierung?

OS: Linux 2.6. Das Programm ist in C geschrieben. Es sollte 24 7 funktionieren und viele Daten manipuliert.

War es hilfreich?

Lösung

Ziehen Sie viele extrem kleine Objekte an - sagen Sie nur ein paar Bytes? Mit jeder Zuordnung ist eine gewisse Menge an Overhead verbunden (weil, z. B., z. free muss in der Lage sein zu sagen, wie groß der Block war).

Dies ist das, was manchmal als "interne Fragmentierung" bezeichnet wird, im Gegensatz zu "externer Fragmentierung", bei der es eine gewisse Menge an nicht zugewiesenem Speicher gibt, aber Sie können es nicht verwenden, weil es in Blöcke aufgeteilt ist, die zu klein sind, als dass Sie sie verwenden können. (Ein weiterer Grund warum malloc Kein wirklich kleiner Blöcke, ist, dass dies dazu beiträgt, die externe Fragmentierung zu verringern.)

Wenn du sind Wenn Sie viele sehr kleine Objekte zuweisen, sollten Sie sie separat verwalten, anstatt sie einzeln auf dem Haufen zuzuweisen. Dies kann auch auf andere Weise besser sein (z. B. Verbesserung des Speicherlokalität), wenn Sie es richtig machen.

Andere Tipps

Laut dem Dokumentation, Die "extra heap" -Bytes sind wie folgt:

Die Anzahl der zu diesem Zeitpunkt zugewiesenen zusätzlichen Heap -Bytes. Dies spiegelt die Anzahl der Bytes wider, die über das hinausgeht, was das Programm verlangt. Es gibt zwei Quellen für zusätzliche Haufen Bytes.

Erstens ist jeder Heap -Block administrative Bytes verbunden. Die genaue Anzahl der administrativen Bytes hängt von den Details des Allocators ab. Standardmäßig geht MASFIF 8 Bytes pro Block an, wie aus dem Beispiel ersichtlich ist. Diese Zahl kann jedoch über die Option-heap-admin geändert werden.

Zweitens rundet Allocatoren häufig die Anzahl der Bytes zusammen, die nach einer größeren Anzahl von 8 oder 16 verlangt werden. Dies ist erforderlich, um sicherzustellen, dass die Elemente innerhalb des Blocks angemessen ausgerichtet sind. Wenn N -Bytes gefragt werden, runden MASFS n bis zum nächsten Wert des von der Option -Ausrichtung angegebenen Wertes.

Das klingt für mich nicht nach Gedächtnisfragmentierung.

Gedächtnisfragmentierung wird typischerweise durch viele kleine Zuordnungen verursacht. Sie haben kleine Lücken zwischen jeder Einheit des zugewiesenen Speichers und dann wird es schwierig, einen zusammenhängenden Speicherbereich für größere Zuordnungen zu erhalten.

Um die Speicherzuweisung zu verhindern, machen Sie im Grunde weniger Zuteilungen! Verwenden Sie den Stapelraum, wo immer möglich Pooling Häufig zugewiesene Objekte, damit Sie keinen Speicher weiterweisen.

Sie könnten entweder weniger Zuweisungen von größerer Größe oder den Haufen optimieren - letztere werden implementierungsspezifisch sein.

Dies ist keine Fragmentierung, genau dann, wenn Sie nach 7 Bytes fragen, dass der Heap zuteilt Nicht weniger als 7 Bytes - Das kann sagen 16 Bytes, also werden 9 Bytes "extra" und werden tatsächlich verschwendet. Dies geschieht aus verschiedenen Gründen - zum Beispiel, um die Ausrichtung aufrechtzuerhalten.

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