Escape-Analyse in Java
Soweit ich weiß die JVM verwendet die escape-Analyse für einige performance - Optimierungen wie lock coarsening und lock elision.
Ich bin interessiert, ob es eine Möglichkeit gibt für die JVM zu entscheiden, dass ein bestimmtes Objekt zugewiesen werden können-stack mit escape-Analyse.
Einige Ressourcen machen mich denken, dass ich Recht habe. Ist es JVMs, dass es wirklich tun?
Kommentar zu dem Problem
Oracle-Dokumentation: Nach der escape-Analyse, die server-compiler eliminiert scalar austauschbaren Objekt-Zuordnungen und damit verbundenen sperren aus den generierten code. Die server-compiler entfällt auch sperren für alle nicht-Global Flucht-Objekte. ES ERSETZT NICHT EIN HEAP MIT EINEM STACK-ALLOKATION.
@anstarovoyt Es ersetzt nicht ein heap mit einem stack Allokation FÜR NICHT-GLOBAL FLUCHT-OBJEKTE.
@Aliaxander die Frage wurde in 2009 und meine Antwort war in 2013 🙂
@anstarovoyt lass den Kommentar sein, nur für den Fall um zu verhindern, dass Verwirrung in Anbetracht der neueren JDK-Versionen.
InformationsquelleAutor der Frage Denis Bazhenov | 2009-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht entkommen Analyse für stack-Allokation. Beispiel:
mit
-server -verbose:gc -XX+DoEscapeAnalysis
:Angeblich JDK 7 unterstützt Stapel-Allokation.
InformationsquelleAutor der Antwort benmmurphy
Mit dieser version von java -XX:+DoEscapeAnalysis Ergebnisse in weit weniger gc-Aktivität und 14x schnellere Ausführung.
Ohne escape-Analyse,
Escape-Analyse,
Sich die Ausführungszeit verringert deutlich die escape-Analyse. Für diesen loop wurde geändert, um 10e9 Iterationen,
Ohne escape-Analyse,
Escape-Analyse,
Also mit escape-Analyse am Beispiel lief rund 14x schneller als die non-escape-Analyse ausführen.
InformationsquelleAutor der Antwort Janek Bogucki
Escape-Analyse ist wirklich schön, aber es ist nicht eine vollständige erhalten von Gefängnis-frei-Karte. wenn Sie eine dynamisch große Sammlung innerhalb des Objekts, die escape-Analyse wird NICHT wechseln, von Haufen zu stapeln. Zum Beispiel:
Selbst wenn das Objekt erstellt wird, in eine Methode und absolut NICHT Flucht aus der syntaktischen Sicht, die der compiler nicht zu, markieren Sie diese für die Flucht. Ich vermute da, dass die longList ist nicht wirklich begrenzt in der Größe von einer rein syntaktischen Perspektive und es könnte blow your stack potenziell. Also ich glaube, es dauert ein pass auf diesen Fall. Ich experimentierte mit diesem, wo der longList war leer und noch immer verursacht, die Sammlungen in einem einfachen micro-benchmark.
InformationsquelleAutor der Antwort Mike Ceruti