Nicht blockierende Java-Speicherzuweisung

8

Ich habe irgendwo gelesen, dass Java Speicher für Objekte in etwa 12 Maschinenbefehlen zuweisen kann. Es ist ziemlich beeindruckend für mich. Soweit ich verstehe, ist einer der Tricks, die JVM verwendet, die Vorbelegung von Speicher in Chunks. Dies hilft, die Anzahl der Anfragen an das Betriebssystem zu minimieren, was ziemlich teuer ist, denke ich. Aber selbst CAS-Operationen können auf modernen Prozessoren bis zu 150 Zyklen kosten.

Könnte also jemand die wahren Kosten der Speicherzuweisung in Java erklären und welche Tricks nutzt JVM, um die Zuweisung zu beschleunigen?

    
Denis Bazhenov 24.07.2009, 11:04
quelle

3 Antworten

17

Die JVM weist für jeden Thread (TLA oder Thread Local Area) einen Speicherbereich vor. Wenn ein Thread Speicher reservieren muss, wird "Bump the pointer allocation" in diesem Bereich verwendet. (Wenn der "freie Zeiger" auf Adresse 10 zeigt und das zuzuweisende Objekt die Größe 50 hat, dann stoßen wir einfach den freien Zeiger auf 60 und sagen dem Thread, dass er den Speicher zwischen 10 und 59 für das Objekt verwenden kann) .

    
Tnilsson 24.07.2009, 11:19
quelle
2

Der beste Trick ist der generationelle Müllsammler. Dies hält den Heap unfragmentiert, so dass das Zuweisen von Speicher den Zeiger auf den freien Speicherplatz erhöht und den alten Wert zurückgibt. Wenn Speicher ausgeht, kopiert die Garbage-Collection-Objekte und erstellt auf diese Weise einen neuen unfragmentierten Heap.

Da verschiedene Threads über den Zeiger mit dem freien Speicher synchronisiert werden müssen, werden sie bei der Erhöhung vorbelegt. So kann ein Thread neuen Speicher ohne die Sperre zuweisen.

All dies wird hier genauer erklärt: Ссылка

    
Mnementh 24.07.2009 11:11
quelle
1

Es gibt keinen einzelnen Speicherzuordner für die JVM. IIRC korrekt JVM von Sun und IBM verwalteten Speicher unterschiedlich. Im Allgemeinen wird die JVM jedoch so arbeiten, dass sie zunächst ein Stück Speicher zuweist, dieses Segment klein genug ist, um im Cache des Prozessors zu leben, was den Zugriff darauf extrem schnell macht.

Wenn Sie innerhalb der Anwendung Objekte erstellen, nehmen die Objekte Speicher innerhalb dieses Segments auf. Die Objektzuordnung innerhalb des Segments ist einfach Zeigerarithmetik.

Anfangs ist die Offset-Adresse in dem frisch geprägten Segment Null. Das erste Objekt, das zugewiesen wird, hat eine 'Adresse' (eigentlich ein Offset in das Segment) von Null. Wenn Sie ein Objekt zuweisen, dann weiß der Speichermanager, wie groß das Objekt ist, weist soviel Platz innerhalb des Segments zu (16 Bytes sagen) und erhöht dann seine "Offsetadresse" um diesen Betrag, was bedeutet, dass die Speicherzuweisung blitzschnell ist, es ist nur ein Zeiger Arithmetik.

So ein Whitepaper hier Ссылка und IBM hatte eine Menge Sachen auf ibm.com/developerworks

    
Kevin Jones 24.07.2009 11:58
quelle

Tags und Links