JavaScript-Engine: V8 9.2 bereitet auf erweiterte Shared-Memory-Funktionen vor

Um die Komprimierung von 64-Bit-Zeigern zu optimieren, laufen nun alle Instanzen in einem gemeinsamen virtuellen Speicherbereich.

In Pocket speichern vorlesen Druckansicht 29 Kommentare lesen

(Bild: Trismegist san/Shutterstock.com)

Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag

Google hat Version 9.2 der JavaScript-Engine V8 veröffentlicht. Die wesentliche Neuerung betrifft das Speichermanagement der einzelnen Instanzen, die nun in einem gemeinsamen Bereich laufen, um die Zeigerkomprimierung zu optimieren. Außerdem erlaubt die neue at-Methode einen von hinten betrachteten Zugriff auf Elemente in Arrays und Strings.

Nachdem sich Version 9.1 im Mai unter anderem auf das Optimieren des Interfaces FastTemplateCache konzentriert hat, steht im aktuellen Release die Komprimierung von 64-Bit-Zeigern im Fokus. V8 legt für alle als Isolate-Objekte verwalteten Instanzen einen 4 GByte großen virtuellen Speicher-"Käfig" an.

Hintergrund ist, dass sich 64-Bit-Zeiger in zwei Teile zerlegen lassen: 32 Bit beschreiben die Basis im Speicher und die restlichen 32 Bit den darauf setzenden Index. Durch die 4 GB-Beschränkung lassen sich alle 64-Bit-Zeiger mit derselben Basis darstellen, sodass nur noch das Speichern des Indexwerts erforderlich ist.

         |----- 32 bits -----|----- 32 bits -----| 
Pointer: |________base_______|_______index_______|

Bisher hatte jede Instanz ihren eigenen Käfig, aber ab der aktuellen Version teilt die Engine standardmäßig allen Isolate-Objekten innerhalb desselben Prozesses einen geteilten virtuellen Speicherbereich zu. Dadurch lassen sich die komprimierten Pointer direkt zwischen Instanzen innerhalb des Prozesses teilen, was bisher nicht möglich war. Die V8-Engine soll damit auf kommende Erweiterungen am in ECMAScript 2017 eingeführten Shared-Mermory-Konzept vorbereitet sein.

Nachteil des Ansatzes ist, dass alle Threads innerhalb eines Prozesses maximal 4 GByte Speicher erhalten. Wer beispielsweise für aufwändige Server-Workloads mehr benötigt, kann die Zusammenlegung über den Parameter v8_enable_pointer_compression_shared_cage = false deaktivieren.

Die zweite nennenswerte Neuerung bietet einen neuen Ansatz zum Zugriff auf Arrays, TypedArrays und Strings: Die Methode at ermöglicht neben dem regulären Zugriff über einen positiven Wert das Abrufen mit einem vom Ende des jeweiligen Arrays beziehungsweise String gezählten Index. Dieser erfolgt durch die Übergabe eines negativen Werts:

[1,2,3].at(-1) // gibt den Wert 3 zurück

Die Zählung erfolgt schon deshalb nicht 0-, sondern 1-basiert, weil sich die negative 0 nicht umsetzen ließe. Mit der neuen Methode soll Sourcecode zum einen besser lesbar sein als die Umsetzung durch den Umweg über ein_array[ein_array.length - n]. Zum anderen ist der Ansatz wohl unter anderem im Zusammenspiel mit über slice erstellte Teilkopien performanter.

Weitere Details zu Version 9.2 der JavaScript-Engine lassen sich dem V8-Blog entnehmen. Wie üblich befindet sich die Engine so lange in der Beta, bis das stabile Release von Chrome 92 erscheint.

(rme)