Inhaltsverzeichnis
Java-Speicherbereich und Speicherüberlaufausnahme
1. Laufzeitdatenbereich
2. Virtuelles Maschinenobjekt
1. Erstellung des Objekts
2. Speicherlayout des Objekts
3. Zugriff auf die Positionierung des Objekts
3. Tatsächlicher Kampf OutofMemoryERROR
1 .java Heap-Überlauf
2. Stapelüberlauf
: -XX:PermSize Methodenbereichsgröße; -XX:MaxPermSize Maximum Größe des Methodenbereichs
Heim Java javaLernprogramm Detaillierte Einführung in den Java-Speicherbereich und die Speicherüberlaufausnahme

Detaillierte Einführung in den Java-Speicherbereich und die Speicherüberlaufausnahme

Jun 25, 2017 am 10:58 AM
java 了解 geh tief 虚拟

Java-Speicherbereich und Speicherüberlaufausnahme

1. Laufzeitdatenbereich

 

 1. Programmzähler: Thread privat, Wird zum Speichern des Speicherorts der aktuell ausgeführten Anweisung verwendet

2. Java Virtual Machine Stack: Thread privat, beschreibt das Ausführungsmodell der Java-Methode. Beim Ausführen einer Methode wird ein Stapelrahmen zum Speichern lokaler Variablen und Basistypvariablen erstellt . Referenz und andere Informationen

3. Java-nativer Methodenstapel: privater Thread, der die von der virtuellen Maschine verwendeten nativen Methoden bereitstellt

4. Java-Heap: gemeinsam genutzter Thread, ist der Hauptarbeitsplatz von der Garbage Collector; Speicherobjektinstanzen usw.

5. Methodenbereich: Thread-Freigabe; Informationen zur Speicherklasse, Konstanten, statische Variablen usw.

  Laufzeitkonstanten: Speichern verschiedener Literale und Symbolreferenzen generiert während der Kompilierung

6. Direkter Speicher: Maschinenspeicher

2. Virtuelles Maschinenobjekt

1. Erstellung des Objekts

  • Überprüfen Sie zuerst, ob der Konstantenpool die Symbolreferenz dieser Klasse finden und prüfen kann, ob die Klasse geladen und initialisiert wurde. Andernfalls muss zuerst der Ladevorgang durchgeführt werden.

  • Speicher für das Objekt zuweisen : Berechnen Sie den Speicherplatz und extrahieren Sie ihn aus dem Heap. Teilen Sie einen kontinuierlichen oder diskontinuierlichen Bereich; verwenden Sie cas+failure retry, um Thread-Sicherheitsprobleme zu vermeiden (da Objekte sehr häufig erstellt werden, weiß ich nicht, ob der aktuelle Speicher zugewiesen wurde)

  • Initialisieren Sie den Speicherplatz: Initialisieren Sie den zugewiesenen Speicherplatz auf den Wert 0

  • Legen Sie grundlegende Informationen des Objekts fest: Metadaten, Hash-Code, GC usw .

  • Init-Initialisierung von Java ausführen:

2. Speicherlayout des Objekts

Objektheader: Speichert den Hash-Code , Sperrstatus usw. und Typzeiger des Objekts (die Klasse, auf die das Objekt zeigt) (Metadaten)

Instanzdaten: die tatsächlich vom Objekt gespeicherten Informationen

Ausrichtungsauffüllung: Auffüllung entspricht zu den Regeln

3. Zugriff auf die Positionierung des Objekts

Zugriff auf das Objekt. Durch die Referenzdaten auf dem Java-Stack wird ein Verweis auf das Objekt aufrechterhalten

Zugriff Methoden: Handle und Direktzugriff

 

Handle: Im Heap wird ein Handle-Pool verwaltet, und die Referenzpunkte auf das Handle enthalten die Adressinformationen der Objektinstanzdaten und Typdaten

Es ist einfach, die Instanzdaten im Handle zu verschieben, der Overhead ist groß und es gibt viele einmalige Zeigerpositionierungen

 

Direkt: Referenzpunkte direkt auf die Objektadresse

Schnelle Geschwindigkeit

3. Tatsächlicher Kampf OutofMemoryERROR

1 .java Heap-Überlauf

 Parameter: -Xms Heap-Mindestwert; -XX:+HeapDumpOnOutOfMemoryError Speicher-Snapshot-Analyse, wenn ein Überlauf auftritt

  Heap-Speicherobjekte: A Es kann eine große Anzahl von Objekten erstellt werden, um einen Heap-Überlauf zu erreichen: Heap-Speicherplatz

2. Stapelüberlauf

Die Stapeltiefe kann erreicht werden, indem die Stapeltiefe durch unendliche Rekursion erhöht oder eine große Anzahl von Threads erstellt wird

 3. Methodenbereich und konstanter Poolüberlauf
//递归来StackOverFlowerpublic class JavaVMStackSOF {private int stackLength = 1;public void stackLeak(){
        stackLength++;
        stackLeak();
    }public static void main(String[] args)throws Throwable{
        JavaVMStackSOF oom = new JavaVMStackSOF();try {
            oom.stackLeak();
        } catch(Throwable e){
            System.out.println("stack length:" + oom.stackLength);throw e;
        }
    }
}
Nach dem Login kopieren
 
Parameter

: -XX:PermSize Methodenbereichsgröße; -XX:MaxPermSize Maximum Größe des Methodenbereichs

  Vor JDK1.6 konnten Sie eine große Anzahl von Strings erstellen und die virtuelle Maschine kopierte die Objekte in den konstanten Pool

 

In 1.7 und höher ist dies nicht möglich, da die virtuelle Maschine den Verweis auf das Objekt nur dann speichert, wenn dieses Objekt zum ersten Mal im Konstantenpool erscheint

Überlauf des Methodenbereichs: Der Methodenbereich speichert Klasseninformationen und Überläufe, indem er eine große Anzahl dynamischer Klassen generiert. Beispielsweise generiert Spring tatsächlich Klassen über dynamische Proxys

public class JavaMethodAreaOOM{public static void main(String[]args){while(true){//创建大量的动态类,动态代理OOMObjectEnhancer enhancer=new Enhancer();
            enhancer.setSuperclass(OOMObject.class);
            enhancer.setUseCache(false);
            enhancer.setCallback(new MethodInterceptor(){public Object intercept(Object obj,Method method,Object[]args,MethodProxy proxy)throws Throwable{return proxy.invokeSuper(obj,args);
                }}
            );
            enhancer.create();
        }}static class OOMObject{
    }
}
Nach dem Login kopieren
String.intern() ist eine native Methode. Ihre Funktion ist: Wenn der String-Konstantenpool bereits einen String enthält, der diesem String-Objekt entspricht, geben Sie den String zurück, der diesen String im Pool darstellt Der in diesem String-Objekt enthaltene Konstantenpool gibt einen Verweis auf dieses String-Objekt zurück

JDK6 und früher: Der Methodenbereich (permanente Generation) ist separat und der Konstantenpool befindet sich im Methodenbereich

JDK7: Zur permanenten Generation gehen

Wenn dieser Code in JDK 1.6 ausgeführt wird, erhält er zwei falsche Werte, aber wenn er in JDK 1.7 ausgeführt wird, erhält er einen wahren und einen falschen Wert.

Der Grund für den Unterschied ist: In JDK 1.6 kopiert die Methode intern () die erste gefundene Zeichenfolgeninstanz in die permanente Generation und gibt einen Verweis auf die Zeichenfolgeninstanz in der permanenten Generation und die Zeichenfolge zurück Die von StringBuilder erstellte Instanz befindet sich auf dem Java-Heap, daher darf es sich nicht um dieselbe Referenz handeln, und es wird „false“ zurückgegeben.

Und JDK 1.7: Die Implementierung von intern() kopiert die Instanz nicht mehr, sondern zeichnet nur die Instanzreferenz des ersten Vorkommens von im Konstantenpool auf, sodass die von intern() zurückgegebene Referenz die ist identisch mit der von StringBuilder erstellten Zeichenfolgeninstanz.

Der Vergleich von str2 gibt false zurück, da die Zeichenfolge „java“ bereits vor der Ausführung von StringBuilder.toString() angezeigt wurde und im Zeichenfolgenkonstantenpool bereits ein Verweis darauf vorhanden ist, der die Anforderungen von nicht erfüllt Prinzip „erstes Vorkommen“ und die Zeichenfolge „Computersoftware“ erscheint zum ersten Mal, daher wird „true“ zurückgegeben

 

Hinweis: 1.7 und höher speichern den Verweis, der zum ersten Mal angezeigt wird Analyse

4. Nativer Direktspeicher

Parameter: -XX: MaxDirectMemorySize Direktspeichergröße; Standard == maximaler Heapspeicher

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Java-Speicherbereich und die Speicherüberlaufausnahme. 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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

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)

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Top 10 Tradingplattformen der virtuellen Währung im Cryptocurrency Circle 2025 Top 10 Tradingplattformen der virtuellen Währung im Cryptocurrency Circle 2025 Mar 12, 2025 pm 05:27 PM

Top 10 Währungsplattformen in der Kryptowährung von 2025: OKX, eine hohe Liquidität, eine geringe Gebühren und eine reichliche Binance; .

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Feb 07, 2025 pm 12:11 PM

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo

Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Oct 11, 2024 pm 06:30 PM

Java leicht gemacht: Ein Leitfaden für Anfänger zur leistungsstarken Programmierung Java ist eine leistungsstarke Programmiersprache, die in allen Bereichen von mobilen Anwendungen bis hin zu Systemen auf Unternehmensebene verwendet wird. Für Anfänger ist die Syntax von Java einfach und leicht zu verstehen, was es zu einer idealen Wahl zum Erlernen des Programmierens macht. Grundlegende Syntax Java verwendet ein klassenbasiertes objektorientiertes Programmierparadigma. Klassen sind Vorlagen, die zusammengehörige Daten und Verhaltensweisen organisieren. Hier ist ein einfaches Java-Klassenbeispiel: publicclassPerson{privateStringname;privateintage;

Können Sie Geld verdienen, indem Sie virtuelle Münzen abbilden? Ist es wahr? Können Sie Geld verdienen, indem Sie virtuelle Münzen abbilden? Ist es wahr? Mar 04, 2025 am 07:09 AM

Virtual Currency Mining: Chancen und Herausforderungen koexistieren im virtuellen Währungsabbau, dh Computeralgorithmen, um komplexe mathematische Probleme zu lösen, um virtuelle Währung zu erhalten. Mit zunehmender Bergbaukosten ist die Rentabilität jedoch stark in Frage gestellt. In diesem Artikel wird das Gewinnpotential des Mining Virtual Currency Mining und die Schlüsselfaktoren, die sich auf die Renditen auswirken, eingehend untersucht. Mining -Gewinnanalyse Mining erhält virtuelle Währungsbelohnungen, indem sie an der Computing und Überprüfung von Blockchain -Netzwerken teilnehmen. Mit dem Aufstieg von Technologien wie dem Cloud -Mining wurde der Schwellenwert für die Teilnahme gesenkt. Der Bergbau kann eine relativ stabile Einkommensquelle liefern, jedoch nur, wenn die Bergbaumaschine normal arbeitet und die Stromversorgung ausreicht. Darüber hinaus schwankt der Preis für virtuelle Währung dramatisch, was möglicherweise hohe Renditen erzielen und auch erzeugen kann

Java -Programm zum Einfügen eines Elements am unteren Rand eines Stapels Java -Programm zum Einfügen eines Elements am unteren Rand eines Stapels Feb 07, 2025 am 11:59 AM

Ein Stapel ist eine Datenstruktur, die dem LIFO -Prinzip (zuletzt, zuerst heraus) folgt. Mit anderen Worten, das letzte Element, das wir einem Stapel hinzufügen, ist das erste, das entfernt wird. Wenn wir einem Stapel Elemente hinzufügen (oder drücken), werden sie oben platziert. vor allem der

See all articles