Java JVM -Details:
Verwandte Wissen über JVM
1. Haufen und Stapelspeicher
1. Der Stack -Speicher in JVM speichert hauptsächlich Verweise auf grundlegende Arten von Variablen und Objekten.
2. Der Heap-Speicher in JVM speichert hauptsächlich Objekte und Arrays, die mit neuen und variablen Länge (StringBuilder und StringBuffen) erstellt wurden, im Heap-Speicher.
Der Vorteil der Verwendung des Heaps besteht darin, dass er dynamisch Speicherplatz zugewiesen ist, was flexibler ist. Der Nachteil ist jedoch, dass es langsamer ist, den Speicher dynamisch zuzuweisen. Die Verwendung des Stapels ist schneller und die Datenaustausch kann erreicht werden, aber der Nachteil besteht darin
3. Die statische Speicherzuweisung wird verwendet, um statische Variablen und statische Codeblöcke zu speichern.
2. Verständnis von JVM
JVM ist eine virtuelle Java -Maschine. Es blockiert Informationen, die sich auf die spezifische Betriebssystemplattform beziehen, so dass das Java-Programm nur Objektcode (Byte-Code) generiert, das auf der java virtuellen Maschine ausgeführt wird, sodass der plattformübergreifende Betrieb erreicht werden kann.
Sein Prinzip ist: Die Java -Quelldatei wird über den Java -Compiler in Bytecode -Programme zusammengestellt, und jeder Befehl wird über JVM in den Maschinencode verschiedener Plattformen übersetzt und über eine bestimmte Plattform ausgeführt.
Der Speicherbereich von JVM ist hauptsächlich unterteilt in: Methodenbereich, JVM -Stack, Heap, lokaler Methodenstapel, Programmschalter
Programmzähler: Wird verwendet, um die derzeit ausgeführte Anweisung aufzuzeichnen, die der einzige Bereich ohne OOM ist.
JVM Stack: Thread ist privat. Jeder Thread erstellt gleichzeitig einen JVM -Stapel. Es speichert lokale grundlegende Variablen im aktuellen Thread, partiellen Rückgabergebnissen, Stapelrahmen und Objektreferenzadresse.
Heap: Thread Sharing, verwendet, um einige Objekte und Arrays zu speichern; Da es gemeinsam genutzt wird, sind Schlösser erforderlich, was zu hohen Overheads führt.
Methodenbereich: Dieser Methodenbereich entspricht einer persistenten Generation, die die Informationen der Klasse (Name, Modifikator usw.), statische Variablen in der Klasse, in der Klasse definierte Konstanten mit endgültigem usw.
Lokaler Methodenstapel: Wird zur Unterstützung der Ausführung nativer Methoden und zur Speicherung des Anrufstatus jeder nativen Methode verwendet.
Die Java -Müllsammlung konzentriert sich hauptsächlich auf den Haufen und die Methodenbereiche: Der Haufen ist in die neue Generation und die alte Generation unterteilt, und im Allgemeinen werden die Objekte, die gerade neu waren, in die neue Generation eingereicht. und die neue Generation ist in das Eden -Gebiet und in zwei Überlebenden Gebiete unterteilt;
Der Mechanismus der Müllsammlung lautet: Bestimmen Sie zuerst, welche Objekte Müll sind, das heißt, sie werden nicht mehr verwendet, und verwenden Sie dann die entsprechenden Algorithmen (Markierungsalgorithmus, Kopieren von Algorithmus, Mark-Tidying-Algorithmus, Generationssammlungsalgorithmus), um den Müll zu sammeln.
1. Markierung von Algorithmus:
Es ist in zwei Phasen unterteilt, die Markierungsphase und die Clearing -Stufe. Markieren Sie zuerst das Objekt, das recycelt werden muss, und dann den Raum recyceln, der durch das Markierungsobjekt besetzt ist.
Seine Implementierung ist relativ einfach, aber der Nachteil ist, dass es einfach ist, Speicherfragmente zu erzeugen, was dazu führt, dass es nicht in der Lage ist, genügend Speicher zu finden, wenn es in Zukunft Raum für große Objekte zuteilt und eine neue Müllsammlungspflicht im Voraus auslöst.
2. Algorithmus kopieren:
Um die Mängel des Markierungsalgorithmus zu lösen, unterteilt der Kopieralgorithmus den Speicher in zwei Bereiche gleicher Größe entsprechend der Kapazität, und einer von ihnen wird gleichzeitig verwendet. Nachdem ein Stück aufgebraucht ist, wird das noch überflutete Objekt in einen anderen Bereich kopiert, und dann wird der gebrauchte Bereich gereinigt, sodass die Fragmentierung nicht leicht auftreten kann.
Das Problem der Gedächtnisfragmentierung ist gelöst, aber der Nachteil ist, dass das verwendete Gedächtnis auf die Hälfte des Originals reduziert wird und die Kopiereffizienz mit der Anzahl der überlebenden Objekte zusammenhängt. Wenn die Zahl groß ist, wird die Effizienz stark reduziert.
3. Markierungsorganisationsalgorithmus
Um die Defekte des Kopieralgorithmus zu lösen, wurde der Mark-Tidy-Algorithmus geboren, und die Markierungsphase war auch wie der Markierungsalgorithmus. Zuerst werden die Objekte, die recycelt werden müssen, ausgezeichnet, aber sie recycelt sie nicht direkt, sondern bewegt alle überlebenden Objekte auf die andere Seite und räumt dann das Gedächtnis außerhalb der Grenze auf.
4. Generationensammlungsalgorithmus
Dies ist derzeit der am häufigsten verwendete Algorithmus. Seine Kernidee besteht darin, das Gedächtnis gemäß dem Überlebenszyklus des Objekts in verschiedene Bereiche zu unterteilen. Im Allgemeinen ist der Haufenbereich in die neue Generation und die alte Generation unterteilt. Das Merkmal der alten Generation ist, dass es weniger Objekte gibt, die jedes Mal recycelt werden müssen, wenn der Müll gesammelt wird, während mehr von der neuen Generation, so dass verschiedene Algorithmen übernommen werden.
Derzeit verwenden die meisten neuen Generationen Kopieralgorithmen, aber in der Tat ist die neue Generation nicht in ein Verhältnis von 1: 1 unterteilt. Im Allgemeinen ist die neue Generation in einen größeren Edenraum und zwei kleinere Überlebenderäume unterteilt. Jedes Mal, wenn der Eden-Raum und einer der Überlebenden Räume verwendet werden, werden bei Recycling die immer noch überfluteten Objekte in Eden und Survivor in einen anderen Überlebendenraum kopiert, und dann werden Eden und die gerade verwendeten Überlebendenräume gereinigt.
Da das Alter lautet, dass jedes Mal nur eine kleine Anzahl von Objekten recycelt wird, wird der Mark-Kompaktalgorithmus im Allgemeinen verwendet.
Beachten Sie, dass es außerhalb des Haufensbereichs eine weitere Generation gibt, die permanente Generation ist, mit der Klassenklassen, Konstanten, Methodenbeschreibungen usw. das Recycling der dauerhaften Generation hauptsächlich zwei Teile recycelt: verworfene Konstanten und nutzlose Klassen.
Wie bestimmen wir also, welches Objekt "Müll" ist?
Methode 1. Referenzzählmethode:
In Java ist es Objekten durch Referenzen zugeordnet, dh wenn Sie Objekte bedienen möchten, muss es durch Referenzen durchgeführt werden. Dann ist es offensichtlich, dass ein einfacher Weg zu beurteilen ist, ob ein Objekt durch Referenzzählung recycelt werden kann. Wenn ein Objekt keine Referenzen zugeordnet ist, bedeutet dies, dass das Objekt im Grunde genommen wahrscheinlich nicht an anderer Stelle verwendet wird, und dann wird das Objekt zu einem recycelbaren Objekt. Diese Methode wird zur Referenzzählmethode.
Vorteile: Einfache Implementierung und hohe Effizienz
Nachteile: Das Problem der kreisförmigen Referenzen kann nicht gelöst werden
Methode 2. Methode für Zugänglichkeitsanalyse:
Die Grundidee dieser Methode besteht darin, eine Reihe von "GC -Roots" -Objekten als Ausgangspunkt zu durchsuchen. Wenn es keinen zugänglichen Pfad zwischen "GC -Wurzeln" und einem Objekt gibt, soll das Objekt nicht erreichbar sein. Es ist jedoch zu beachten, dass das als nicht erreichbare Objekt nicht unbedingt zu einem recycelbaren Objekt wird. Ein Objekt, das als unerreichbar beurteilt wird, muss mindestens zwei Markierungsprozesse durchlaufen, um ein recycelbares Objekt zu werden. Wenn es während dieser beiden Markierungsprozesse immer noch keine Möglichkeit gibt, ein recycelbares Objekt zu werden, wird es im Grunde genommen zu einem recycelbaren Objekt.
Welche Objekte können GC -Wurzeln sein?
1. In JVM Stack (lokale variable Tabelle im Stapelrahmen).
2. Objekt, das durch statische Attribute der Klasse im Methodenbereich verwiesen wird.
3.. Objekte, auf die Konstanten im Methodenbereich verwiesen werden
4. Objekt, auf das JNI (dh die allgemeine native Methode) im lokalen Methodenstapel verwiesen wird.
Für Programmierer können wir GC -Overhead auch durch einige Methoden reduzieren:
1. Zeigen Sie die Methode von System.gc () nicht an
2. Minimieren Sie die Verwendung von temporären Objekten
3. Wenn das Objekt nicht verwendet wird, wird die Anzeigeeinstellung auf null gesetzt
4.. Versuchen Sie, StringBuilder anstelle von Strings für Zeichenfolge zu verwenden
5. Wenn Sie grundlegende Arten von Variablen verwenden können (int lang), verwenden Sie keine Objekte (Ganzzahl, lang).
6. Verwenden Sie so wenig wie möglich statische Objektvariablen
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!