


Detaillierte Einführung in den Java-Speicherbereich und die Speicherüberlaufausnahme
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; } } }
: -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{ } }
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ückgegebenHinweis: 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 HeapspeicherDas 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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



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 Währungsplattformen in der Kryptowährung von 2025: OKX, eine hohe Liquidität, eine geringe Gebühren und eine reichliche Binance; .

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

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.

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 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;

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

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
