Inhaltsverzeichnis
Zuweisung auf dem Stapel" >Zuweisung auf dem Stapel
Skalare Ersetzung" >Skalare Ersetzung
Heim Java javaLernprogramm Verstehen Sie die JVM-Escape-Analyse in 3 Minuten

Verstehen Sie die JVM-Escape-Analyse in 3 Minuten

Aug 15, 2023 pm 04:39 PM
jvm

Als qualifizierter Java-Entwickler wissen wir alle, dass grundsätzlich alle Objekte auf dem Heap erstellt werden. Allerdings gibt es hier noch kein absolutes Wort, es bezieht sich auf im Grunde alles.

Gestern sagte ein Freund während eines Interviews, dass alle Objekte im Heap erstellt werden, und lachte dann den Interviewer aus.

Beginnen Sie mit unserem Haupttext. Lassen Sie uns heute über die Fluchtanalyse sprechen.

Escape Analysis (Escape Analysis) ist derzeit eine relativ hochmoderne Optimierungstechnologie in der Java Virtual Machine. Dies ist ein funktionsübergreifender globaler Datenflussanalysealgorithmus, der die Synchronisierungslast und den Speicher-Heap-Zuweisungsdruck in Java-Programmen effektiv reduzieren kann. Durch die Escape-Analyse kann der Java-Hotspot-Compiler den Nutzungsbereich der Referenz eines neuen Objekts analysieren und entscheiden, ob dieses Objekt dem Heap zugewiesen werden soll.

Das Grundprinzip der Escape-Analyse ist : Analysieren Sie den dynamischen Bereich von Objekten. Wenn ein Objekt in einer Methode definiert wird, kann es von externen Methoden referenziert werden, z. B. durch die Übergabe an andere Methoden als Aufrufparameter Ein Methoden-Escape; es kann sogar von externen Threads aufgerufen werden, z. B. durch Zuweisen zu Instanzvariablen, auf die in anderen Threads zugegriffen werden kann; zu hoch. Unterschiedliche Fluchtgrade.

Wenn die Escape-Analyse aktiviert ist, kann der Compiler den Code wie folgt optimieren:

  1. Synchronisierte Eliminierung: Wenn durch die Escape-Analyse festgestellt wird, dass auf ein Objekt nur von einem Thread zugegriffen werden kann, können die Operationen für dieses Objekt ausgeführt werden asynchron.
  2. Zuweisung auf dem Stapel: Wenn Sie sicher sind, dass ein Objekt nicht aus dem Thread entweicht, wäre es eine sehr gute Idee, diesem Objekt Speicher auf dem Stapel zuzuweisen. Der vom Objekt belegte Speicherplatz kann freigegeben werden mit dem Stapelrahmen zerlegt und zerstört.
  3. Skalare Ersetzung: Wenn bei der Escape-Analyse festgestellt wird, dass auf ein Objekt nicht mit externen Methoden zugegriffen werden kann, und dieses Objekt zerlegt werden kann, erstellt das Programm dieses Objekt möglicherweise nicht, wenn es tatsächlich ausgeführt wird, sondern erstellt direkt mehrere davon . Dann verwendet diese Methode stattdessen Mitgliedsvariablen. Nach der Aufteilung des Objekts können die Mitgliedsvariablen des Objekts auf dem Stapel zugewiesen, gelesen und geschrieben werden.

In JVM können Sie über die folgenden Parameter angeben, ob die Escape-Analyse aktiviert werden soll:

-XX:+DoEscapeAnalysis: Zeigt das Aktivieren der Escape-Analyse an (sie ist nach JDK 1.7 standardmäßig aktiviert). -XX:+DoEscapeAnalysis :表示开启逃逸分析(JDK 1.7之后默认开启)。

-XX:-DoEscapeAnalysis

-XX:-DoEscapeAnalysis: Stellt dar Schalten Sie die Escape-Analyse aus. 🎜

Synchronisierungseliminierung

Die Thread-Synchronisierung selbst ist ein relativ zeitaufwändiger Prozess. Wenn durch die Escape-Analyse festgestellt werden kann, dass eine Variable dem Thread nicht entkommt und von anderen Threads nicht darauf zugegriffen werden kann, erfolgt definitiv kein Lesen und Schreiben Aufgrund der Konkurrenz dieser Variablen können auf diese Variable implementierte Synchronisierungsmaßnahmen sicher eliminiert werden.

Zum Beispiel der folgende Code:

public void method() {
    Object o = new Object();
    synchronized (o) {
        System.out.println(o);
    }
}
Nach dem Login kopieren

sperrt 对象o, aber der Lebenszyklus des Objekts o ist der gleiche wie der der Methode method(), sodass andere Threads nicht darauf zugreifen und keine Thread-Sicherheitsprobleme auftreten wird während der JIT-Kompilierungsphase blockiert. Optimiert, um so auszusehen:

public void method() {
    Object o = new Object();
    System.out.println(o);
}
Nach dem Login kopieren

Dies wird auch als Lock Elimination bezeichnet.

Zuweisung auf dem Stapel

In der Java Virtual Machine ist die Zuweisung von Speicherplatz für erstellte Objekte auf dem Java-Heap für Java-Programmierer fast selbstverständlich. Objekte im Java-Heap werden gemeinsam genutzt und sind für jeden Thread sichtbar. Solange Sie über einen Verweis auf dieses Objekt verfügen, können Sie auf die im Heap gespeicherten Objektdaten zugreifen. Das Garbage-Collection-Subsystem der virtuellen Maschine recycelt Objekte, die nicht mehr im Heap verwendet werden. Der Recyclingvorgang erfordert jedoch viele Ressourcen, unabhängig davon, ob wiederverwendbare Objekte markiert und herausgefiltert oder Speicher recycelt und organisiert werden. Es gibt jedoch einen Sonderfall. Wenn die Escape-Analyse bestätigt, dass das Objekt nicht aus dem Thread entkommt, kann es für die Zuordnung auf dem Stapel optimiert werden. Dadurch entfällt die Notwendigkeit, Speicher auf dem Heap zuzuweisen, und es ist keine Speicherbereinigung erforderlich.

Zum Beispiel der folgende Code:

public static void main(String[] args) throws InterruptedException {

    for (int i = 0; i < 1000000; i++) {
        alloc();
    }

    Thread.sleep(100000);
}

private static void alloc() {
    User user = new User();
}
Nach dem Login kopieren

Der Code ist sehr einfach. Er besteht darin, 1 Million Mal eine Schleife zu erstellen und mit der alloc()-Methode 1 Million Benutzerobjekte zu erstellen. Das hier in der alloc()-Methode definierte Benutzerobjekt wird von anderen Methoden nicht referenziert und erfüllt daher die Anforderungen für die Zuordnung auf dem Stapel.

Die JVM-Parameter lauten wie folgt:

-Xmx2G -Xms2G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
Nach dem Login kopieren

Starten Sie das Programm und überprüfen Sie die Anzahl der Instanzen mit dem Jmap-Tool:

jmap -histo pid

num     #instances         #bytes  class name
----------------------------------------------
1:          3771        2198552  [B
2:         10617        1722664  [C
3:        104057        1664912  com.miracle.current.lock.StackAllocationTest$User
Nach dem Login kopieren

Wir können sehen, dass das Programm insgesamt 104057 Benutzerobjekte erstellt hat, was weit weniger als 1 ist Million. Wir können die Escape-Analyse deaktivieren und noch einmal einen Blick darauf werfen:

-Xmx2G -Xms2G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
Nach dem Login kopieren

Starten Sie das Programm und überprüfen Sie die Anzahl der Instanzen mit dem Jmap-Tool:

jmap -histo 42928

 num     #instances         #bytes  class name
----------------------------------------------
   1:           628       22299176  [I
   2:       1000000       16000000  com.miracle.current.lock.StackAllocationTest$User
Nach dem Login kopieren

Sie können sehen, dass nach dem Deaktivieren der Escape-Analyse insgesamt 1 Million Benutzerobjekte erstellt wurden . Im Vergleich dazu spielt die Zuordnung auf dem Stapel eine wichtige Rolle für den Heap-Speicherverbrauch und die GC.

Skalare Ersetzung

Wenn Daten zur Darstellung nicht mehr in kleinere Daten zerlegt werden können, können die ursprünglichen Datentypen in der Java Virtual Machine (int, long und andere numerische Typen und Referenztypen usw.) nicht verwendet werden Wenn man sie weiter zerlegt, können diese Daten als Skalare bezeichnet werden. Wenn dagegen ein Datenelement weiter zerlegt werden kann, spricht man von einem Aggregat. Objekte in Java sind typische Aggregate.

Wenn die Escape-Analyse beweisen kann, dass auf ein Objekt außerhalb der Methode nicht zugegriffen wird und dieses Objekt zerlegt werden kann, erstellt das Programm dieses Objekt möglicherweise nicht, wenn es tatsächlich ausgeführt wird, sondern erstellt stattdessen direkt mehrere davon zur Verwendung durch stattdessen diese Methode verwenden.

hat den folgenden Code:

public static void main(String[] args) {

    method();
}

private static void method() {
    User user = new User(25);

    System.out.println(user.age);
}

private static class User {

    private int age;

    public User(int age) {
        this.age = age;
    }
}
Nach dem Login kopieren

method()方法中创建User对象,指定age为25,这里User不会被其他方法引用,也就是说它不会逃逸出方法,并且User是可以拆解为标量的。所以alloc()代码会优化为如下:

private static void alloc() {
    int age = 25;

    System.out.println(age);
}
Nach dem Login kopieren

总结

尽管目前逃逸分析技术仍在发展之中,未完全成熟,但它是即时编译器优化技术的一个重要前进方向,在日后的Java虚拟机中,逃逸分析技术肯定会支撑起一系列更实用、有效的优化技术。

Das obige ist der detaillierte Inhalt vonVerstehen Sie die JVM-Escape-Analyse in 3 Minuten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Ein verteiltes JVM-Überwachungstool, sehr praktisch! Ein verteiltes JVM-Überwachungstool, sehr praktisch! Aug 15, 2023 pm 05:15 PM

Dieses Projekt soll es Entwicklern erleichtern, mehrere Remote-Host-JVMs zu überwachen. Wenn es sich bei Ihrem Projekt um Spring Boot handelt, ist die Integration einfach. Lassen Sie sich nicht entmutigen Es reicht aus, schnell ein Spring-Boot-Programm zu initialisieren und es selbst einzuführen

Detaillierte Erläuterung der JVM-Befehlszeilenparameter: die Geheimwaffe zur Steuerung des JVM-Betriebs Detaillierte Erläuterung der JVM-Befehlszeilenparameter: die Geheimwaffe zur Steuerung des JVM-Betriebs May 09, 2024 pm 01:33 PM

Mit JVM-Befehlszeilenparametern können Sie das JVM-Verhalten auf einer feinkörnigen Ebene anpassen. Zu den allgemeinen Parametern gehören: Festlegen der Java-Heap-Größe (-Xms, -Xmx), Festlegen der Größe der neuen Generation (-Xmn), Aktivieren des parallelen Garbage Collectors (-XX:+UseParallelGC), Reduzieren der Speichernutzung des Survivor-Bereichs (-XX: -ReduceSurvivorSetInMemory) Redundanz eliminieren Garbage Collection eliminieren (-XX:-EliminateRedundantGCs) Informationen zur Garbage Collection drucken (-XX:+PrintGC) Den G1 Garbage Collector verwenden (-XX:-UseG1GC) Die maximale Pausenzeit für die Garbage Collection festlegen (-XX:MaxGCPau

Wichtige Punkte und Vorsichtsmaßnahmen für die JVM-Speicherverwaltung Wichtige Punkte und Vorsichtsmaßnahmen für die JVM-Speicherverwaltung Feb 20, 2024 am 10:26 AM

Wichtige Punkte und Vorsichtsmaßnahmen für die Beherrschung der JVM-Speichernutzung JVM (JavaVirtualMachine) ist die Umgebung, in der Java-Anwendungen ausgeführt werden, und die wichtigste davon ist die Speicherverwaltung der JVM. Durch die ordnungsgemäße Verwaltung des JVM-Speichers kann nicht nur die Anwendungsleistung verbessert, sondern auch Probleme wie Speicherlecks und Speicherüberläufe vermieden werden. In diesem Artikel werden die wichtigsten Punkte und Überlegungen zur JVM-Speichernutzung vorgestellt und einige spezifische Codebeispiele bereitgestellt. JVM-Speicherpartitionen Der JVM-Speicher ist hauptsächlich in die folgenden Bereiche unterteilt: Heap (He

Java-Fehler: JVM-Speicherüberlauffehler, wie man damit umgeht und ihn vermeidet Java-Fehler: JVM-Speicherüberlauffehler, wie man damit umgeht und ihn vermeidet Jun 24, 2023 pm 02:19 PM

Java ist eine beliebte Programmiersprache. Bei der Entwicklung von Java-Anwendungen können JVM-Speicherüberlauffehler auftreten. Dieser Fehler führt normalerweise zum Absturz der Anwendung und beeinträchtigt das Benutzererlebnis. In diesem Artikel werden die Ursachen von JVM-Speicherüberlauffehlern und der Umgang mit solchen Fehlern sowie deren Vermeidung untersucht. Was ist ein JVM-Speicherüberlauffehler? Die Java Virtual Machine (JVM) ist die Ausführungsumgebung für Java-Anwendungen. In der JVM ist der Speicher in mehrere Bereiche unterteilt, einschließlich Heap, Methodenbereich, Stapel usw. Der Heap wird zum Speichern erstellter Objekte verwendet

Analyse der Funktionen und Prinzipien der virtuellen JVM-Maschine Analyse der Funktionen und Prinzipien der virtuellen JVM-Maschine Feb 22, 2024 pm 01:54 PM

Eine Einführung in die Analyse der Funktionen und Prinzipien der virtuellen JVM-Maschine: Die virtuelle JVM-Maschine (JavaVirtualMachine) ist eine der Kernkomponenten der Programmiersprache Java und eines der größten Verkaufsargumente von Java. Die Rolle der JVM besteht darin, Java-Quellcode in Bytecodes zu kompilieren und für die Ausführung dieser Bytecodes verantwortlich zu sein. In diesem Artikel werden die Rolle von JVM und ihre Funktionsweise vorgestellt und einige Codebeispiele bereitgestellt, um den Lesern das Verständnis zu erleichtern. Funktion: Die Hauptfunktion von JVM besteht darin, das Problem der Portabilität von Java-Programmen auf verschiedenen Plattformen zu lösen.

Wie kann die Größe des JVM-Heapspeichers effizient angepasst werden? Wie kann die Größe des JVM-Heapspeichers effizient angepasst werden? Feb 18, 2024 pm 01:39 PM

JVM-Speicherparametereinstellungen: Wie kann die Heap-Speichergröße angemessen angepasst werden? In Java-Anwendungen ist die JVM die Schlüsselkomponente, die für die Speicherverwaltung verantwortlich ist. Unter anderem wird der Heap-Speicher zum Speichern von Objektinstanzen verwendet. Die Größeneinstellung des Heap-Speichers hat einen wichtigen Einfluss auf die Leistung und Stabilität der Anwendung. In diesem Artikel wird anhand spezifischer Codebeispiele erläutert, wie die Größe des Heap-Speichers sinnvoll angepasst werden kann. Zunächst müssen wir uns einige Grundkenntnisse über JVM-Speicher aneignen. Der Speicher der JVM ist in mehrere Bereiche unterteilt, darunter Heap-Speicher, Stapelspeicher, Methodenbereich usw. In

Java-Programm zum Überprüfen, ob JVM 32-Bit oder 64-Bit ist Java-Programm zum Überprüfen, ob JVM 32-Bit oder 64-Bit ist Sep 05, 2023 pm 06:37 PM

Bevor wir ein Java-Programm schreiben, um zu überprüfen, ob die JVM 32-Bit oder 64-Bit ist, wollen wir zunächst die JVM besprechen. JVM ist eine virtuelle Java-Maschine, die für die Ausführung von Bytecode verantwortlich ist. Es ist Teil der Java Runtime Environment (JRE). Wir alle wissen, dass Java plattformunabhängig ist, JVM jedoch plattformabhängig. Wir benötigen für jedes Betriebssystem eine separate JVM. Wenn wir den Bytecode eines beliebigen Java-Quellcodes haben, können wir ihn dank JVM problemlos auf jeder Plattform ausführen. Der gesamte Prozess der Java-Dateiausführung läuft wie folgt ab: Zuerst speichern wir den Java-Quellcode mit der Erweiterung .java und der Compiler konvertiert ihn in Bytecode mit der Erweiterung .class. Dies geschieht zur Kompilierungszeit. Jetzt, zur Laufzeit, J

Entmystifizierung des Funktionsprinzips von JVM: Eingehende Untersuchung der Prinzipien der Java Virtual Machine Entmystifizierung des Funktionsprinzips von JVM: Eingehende Untersuchung der Prinzipien der Java Virtual Machine Feb 18, 2024 pm 12:28 PM

Ausführliche Erläuterung der JVM-Prinzipien: Für eine eingehende Untersuchung des Funktionsprinzips der Java Virtual Machine sind spezifische Codebeispiele erforderlich ) ist auch in der Softwareentwicklung nicht mehr wegzudenken. Als Ausführungsumgebung für Java-Programme kann JVM plattformübergreifende Funktionen bereitstellen, sodass Java-Programme auf verschiedenen Betriebssystemen ausgeführt werden können. In diesem Artikel werden wir uns mit der Funktionsweise der JVM befassen

See all articles