EINLEITUNG: Escape Analysis ist ein technischer Punkt, der in vielen JVM -Technologien nicht verwendet wird. In diesem Artikel wird seine Nutzungsszenarien analysiert.
Die Escape-Analyse ist ein funktionsübergreifender Algorithmus zur globalen Datenflussanalyse, mit dem die Synchronlast- und Speicherhaufen-Allokationsdruck in Java-Programmen effektiv reduziert werden kann. Durch die Escape -Analyse kann der Java -Hotspot -Compiler den Umfang der Verwendung der Referenz eines neuen Objekts analysieren und feststellen, ob das Objekt dem Haufen zuordnen soll.
Im Optimierungsprinzip des Computersprache Compiler bezieht sich die Escape -Analyse auf die Methode zur Analyse des Dynamikbereichs von Zeigern, die mit der Zeigeranalyse und der Analyse des Compiler -Optimierung des Prinzips des Compiler -Optimierung verbunden ist. Wenn eine Variable (oder ein Objekt) in einer Methode zugewiesen wird, kann sein Zeiger global zurückgegeben oder referenziert werden, auf die durch andere Prozesse oder Threads verwiesen werden. Dieses Phänomen wird als Flucht des Zeigers (oder Referenz) bezeichnet.
Java unterstützt und ermöglicht Fluchtanalyseoptionen in Java SE 6U23 und späteren Versionen. Der Hotspot JIT -Compiler von Java kann die Fluchtanalyse auf dem Code durchführen, wenn die Methode überladen oder dynamisch geladen wird. Gleichzeitig machen die Eigenschaften von Java-Objekten, die auf dem Haufen und integrierten Fäden zuweisen, eine Fluchtanalyse zu einer wichtigen Funktion von Java.
Der obige Absatz ist eine Passage, die ich von jemand anderem zitiert habe. Der Artikel verwendet viele professionelle Begriffe. Lassen Sie mich seine Bedeutung zusammenfassen:
Die Fluchtanalyse wird verwendet, um festzustellen, ob bestimmte Fälle oder Variablen im Haufen zugeordnet sind. Wenn die Fluchtanalyse aktiviert ist, können diese Variablen eher direkt auf dem Stapel als auf dem Haufen zugewiesen werden. Zeiger auf diese Variablen können weltweit oder durch andere Threads referenziert werden.
Einstellungen einschalten
Die Standardeinstellung ist auf JDK 6U23 oder höher aktiviert. Hier definieren wir die Einstellungen neu:
Gezwungen zu öffnen
-Server -xx:+docapeanalysis -xx:+printgcDetail -xmx10m -xms10m
Analyse der Flucht schließen
-Server -xx: -doescapeanalysis -xx:+printgcDetail -xmx10m -xms10m
Instanzüberprüfung
Code:
public class onStackTest {public static void alloc () {byte [] b = new Byte [2]; B [0] = 1; } public static void main (String [] args) {long b = system.currentTimemillis (); für (int i = 0; i <100000000; i ++) {alloc (); } long e = system.currentTimemillis (); System.out.println (e - b); }}Schalten Sie den Fluchtbetriebsergebnissen ein:
Schreiben Sie hier eine Bildbeschreibung
Ausführliche Ergebnisse der Escape -Analyse nicht aktiviert:
Schreiben Sie hier eine Bildbeschreibung
Um zu analysieren, wird hier 2 Bytes von Datenzyklen von 10 Millionen Mal zuzuordnen. Die Laufzeit für die Aktivierung von Flucht beträgt 8 Milisekunde, während die Unaktivierten 956 beträgt, was fast 1/120 von Unaktiviert ist.
Der Unterschiedseffekt ist immer noch sehr offensichtlich ...
Der Raum auf dem Stapel ist im Allgemeinen sehr klein und kann nur mehrere Änderungen und kleine Datenstrukturen speichern, und Speicherstrukturen mit großer Kapazität können nicht erreicht werden. Das Beispiel hier ist extrem zig Millionen Mal, wodurch die Fluchtanalyse hervorgehoben wird, sodass sie direkt aus dem Stapel zugewiesen werden kann, was die Anzahl der GCs erheblich reduziert und die Gesamtausführungseffizienz des Programms verbessert.
Daher kann der Effekt der Escape -Analyse nur in bestimmten Szenarien wirksam werden, was der variablen Zuordnungsstruktur mit relativ geringer Kapazität mit hoher Frequenz und hoher Anzahl entspricht.