2014-09-25 5 views
11

Ich lese aus einigen Dokumenten, dass Hotspot VM verwendet eine Datenstruktur namens Oop Maps, um alle OOPs in VM zu verwalten. Meine Frage ist, wann wird diese Oop Map Datenstruktur generiert? Zur Kompilierzeit oder zur Laufzeit? Weitere detaillierte Dokumente dazu werden mehr als begrüßt. Danke Jungs.Was bedeutet Oop Maps in Hotspot VM genau

+1

Interessanter Gast, aber warum gibt es negative Stimmen ohne Kommentar? Jemand wird von JVM Kopfverletzungen bekommen? – jkj

+0

Ich sehe nur eine negative Stimme –

Antwort

15

OopMap ist eine Struktur, die angibt, wo sich Objektreferenzen (OOPs) auf dem Java-Stack befinden. Sein Hauptzweck besteht darin, GC-Wurzeln auf Java-Stapeln zu finden und die Referenzen zu aktualisieren, wenn Objekte innerhalb des Heap verschoben werden.

Es gibt drei Arten von OopMaps:

  1. OopMaps für interpretiert Methoden. Sie werden träge berechnet, d. H. Wenn GC auftritt, indem der Bytecode-Ablauf analysiert wird.
  2. OopMaps für JIT-kompilierte Methoden. Sie werden während der JIT-Kompilierung erzeugt und zusammen mit dem kompilierten Code gespeichert, so dass die VM die Stapelspeicherorte und die Register, in denen die Objektreferenzen gespeichert sind, schnell anhand der Befehlsadresse finden kann.
  3. OopMaps für generierte freigegebene Laufzeit Stubs. Diese Maps werden von den Entwicklern - Autoren dieser Runtime-Stubs - manuell erstellt.
+0

Das ist ziemlich coole Antwort, aber ich möchte mehr wissen, wenn nicht unpassend: 1) OopMaps für interpretierte Methoden. Sie werden träge berechnet, d. H. Wenn GC auftritt, indem der Bytecode-Ablauf analysiert wird. >>>>>>>> Wo werden diese Informationen in JVM gespeichert? Gibt es einen detaillierten Hinweis darauf, wie sie berechnet werden? Oder einfach Quellcode-Dateien in OpenJDK? 2) Wenn GC passiert und der Thread zum Safepoint geht, kann JVM einfach alle GC-Root-Sets für den aktuellen Thread finden, indem er Oop Maps im aktuellen sicheren Punkt überprüft. Ist das richtig? Vielen Dank. –

+1

@BillRanderson 1) Die beste Referenz ist der Quellcode (gut dokumentiert BTW): [generateOopMap.cpp] (http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/d638e49facb6/src/share/ vm/oops/generateOopMap.cpp). InterpreterOopMap wird in [OopMapCache] (http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/d638e49facb6/src/share/vm/interpreter/oopMapCache.hpp) gespeichert. – apangin

+2

@BillRanderson 2) Während GC läuft JVM durch alle Thread-Stacks. Jeder Stapel wird als ein Strom von Stapelrahmen geparst. Die Frames werden entweder interpretiert oder kompiliert oder stubs. Interpretierte Frames enthalten Informationen zur Java-Methode und bci (Bytecode-Index). OopMapCache hilft dabei, eine OopMap zu finden, die der angegebenen Methode und bci entspricht. Die Methode eines kompilierten Rahmens wird durch die Suche nach Befehlsadressen ermittelt. Zusammengestellte Methoden enthalten OopMaps zusammen mit dem Code. – apangin