2016-04-23 7 views
0

buf.slice ([start [End]])Node.js Pufferspeicherbereinigungs

Gibt einen neuen Puffer, der den gleichen Speicher wie das Original verweist, aber versetzt und von den Start- und Zielindizes abgeschnitten.

Beachten Sie, dass das Ändern des neuen Puffersegments den Speicher im ursprünglichen Puffer ändert, da sich der zugeordnete Speicher der beiden Objekte überschneidet.

Wie behandelt Garbage Collector zugeordneten Speicher, wenn eine der Referenzen nicht mehr vorhanden ist?

Antwort

2

Wenn Sie einen Slice auf einem Puffer ausführen, erstellen Sie nur einen neuen Verweis auf den ursprünglichen Puffer, der an verschiedenen Punkten beginnt und endet.

Wenn Sie den ursprünglichen Puffer ändern, ändert sich auch die in Scheiben geschnittene Referenz.

Dies bedeutet, dass der gesamte Speicherbereich nicht für die Garbage Collection verfügbar ist, bis alle Referenzen (in Scheiben geschnitten oder nicht) nicht mehr vorhanden sind.

Hoffe das beantwortet Ihre Frage.

+0

Danke, ich nehme dann an, dass der aufgeschnittene Puffer den GESAMT ursprünglich zugewiesenen Speicher reserviert behält, aber nur den geschnittenen Teil zur Verfügung stellt. –

+0

Ja, genau das –

0

Aus der Node.js-Puffer-Dokumentation: "Die Implementierung von Puffer # slice() erstellt eine Ansicht über den vorhandenen Puffer ohne zu kopieren, wodurch Puffer # slice() weit effizienter.". Dies bedeutet, dass die Puffer auf den gleichen Speicherort verweisen, was zu der Überlappung führt. Nur wenn alle Verweise auf den Puffer entfernt wurden, kann der Speicher vom Garbage Collector (gc) neu zugewiesen werden. Wenn der GC ausgeführt wird, löscht er die Puffer, die keine Referenzen haben, und gibt den Speicher an die entsprechenden Pools zurück.

Knotenpuffer variieren im Verhalten je nachdem, wie Sie sie initialisiert haben. Wenn Sie die neuen Buffer() -Methoden verwendet haben, sind sie nun veraltet und sollten die Dokumente erneut aufrufen. Sie sollten die Methoden buffer alloc(), bufferUnsafe() und bufferUnsafeSlow() verwenden.