next up previous contents
Next: Thin Locks Up: Variable Monitordarstellungen Previous: Variable Monitordarstellungen   Inhalt


Stack-Allokation von Monitoren

Die HotSpot-VM [Sun Microsystems, 1999] nutzt die Blockstruktur der Java-Synchronisationskonstrukte in folgender Hinsicht aus: alle Monitore, die in einer Aktivierung erworben werden, müssen auch in dieser Aktivierung freigegeben werden5.2. Besteht kein Konflikt, so können die Monitore also sehr leichtgewichtig auf dem Stack alloziert werden.

Hotspot repräsentiert solche leichtgewichtigen Sperren durch zwei Worte (object id, displaced header)5.3. Jeder rekursive Erwerb eines Monitors wird durch eine neue Sperrstruktur auf dem Laufzeitstack repräsentiert. In diesem Fall enthält das zweite Wort eine 0, die anzeigt, daß das Objekt rekursiv gesperrt wurde und auf einer niedrigeren Stackposition weitere Sperrstrukturen liegen.

Abbildung 5.8 zeigt einen in mehreren Aktivierungen rekursiv erworbenen Monitor: Es wurde gerade die Methode get von der Stelle (*) aufgerufen. Sowohl lookup als auch get synchronisieren auf die Hashtabelle. Daher existieren in beiden Aktivierungen Sperrstrukturen, wobei die erste den Hashwert des Objektes gesichert hat. Dieses trägt statt dessen nun einen Verweis auf die Sperrstruktur im Laufzeitstack.

Abbildung 5.8: Hotspot: Aufrufstack mit rekursivem Lock
\scalebox{0.7}{\includegraphics{nebenlaeufigkeit/util/hotspot-recursive-lock}}

Der Test auf rekursiven Monitorerwerb ist sehr einfach: verweist das entsprechende Headerfeld des Objekts in den eigenen Stack (lock < sp && sp - lock < 64k), so hat dieser Thread die Sperre bereits erworben. Die Monitorfreigabe erfolgt durch lineare Suche im aktuellen Ausführungsrahmen nach der obersten Sperrstruktur für dieses Objekt. Aufgrund der typischerweise sehr kleinen Anzahl von Monitoroperationen pro Aktivierung stellt dieses Vorgehen kein Laufzeitproblem dar.

Im Falle eines Konflikts muß der Monitor in eine Heap-Struktur mit Betriebssytem-Sperre und -Ereignisvariable umgewandelt werden -- dieser Vorgang wird als Expansion oder inflation bezeichnet. Er wird durch einen nachfolgenden Bewerber ausgeführt, der sich mit weiteren Bewerbern über eine globale Sperre koordiniert. Die Expansion eines Monitor tritt jedoch relativ selten auf, so daß diese globale Sperre kein Effizienzproblem verursacht. Die Rückführung in den leichtgewichtigen Monitorzustand erfolgt während der Garbage Collection. Dies hat den Vorteil, daß alle Threads angehalten sind und keine aufwendige Synchronisation stattfinden muß.

Die Monitorimplementierung der HotSpot-VM zeichnet sich durch hohe Laufzeitperformance aus, da die Monitorallokation auf dem Stack erfolgt. Durch Einsatz von header word displacement kann der Objektkopf auf zwei Worte beschränkt werden.


next up previous contents
Next: Thin Locks Up: Variable Monitordarstellungen Previous: Variable Monitordarstellungen   Inhalt

2001-02-28