Dieser Artikel stellt hauptsächlich das relevante Wissen über den Speichermechanismus von Java vor, der einen sehr guten Referenzwert hat. Schauen wir ihn uns mit dem folgenden Editor an
Java unterteilt den Speicher in zwei Typen: einen Es handelt sich um Stapelspeicher und das andere um Heapspeicher. Einige in der Funktion definierte Grundtypen von Variablen und Objektreferenzvariablen werden im Stapelspeicher der Funktion zugewiesen. Wenn eine Variable in einem Codeblock definiert wird, weist Java der Variablen Speicherplatz zu Der Gültigkeitsbereich der Variablen wird überschritten (wenn beispielsweise Funktion B in Funktion A aufgerufen wird und Variable a in Funktion B definiert ist, gilt der Gültigkeitsbereich von Variable a nur für Funktion B. Nach der Ausführung von Funktion B wird Variable a automatisch zerstört. Zugewiesen zu Sein Speicher wird recycelt), Java gibt den für die Variable zugewiesenen Speicherplatz automatisch frei und der Speicherplatz kann sofort für andere Zwecke verwendet werden.
Heap-Speicher wird zum Speichern des von new erstellten Speicherarrays verwendet. Der im Heap zugewiesene Speicher wird vom automatischen Garbage Collector der Java Virtual Machine verwaltet. Nach dem Generieren eines Arrays oder Objekts im Heap können Sie auch eine spezielle Variable im Stapel definieren, sodass der Wert der Variablen im Stapel der ersten Adresse des Arrays oder Objekts im Heap-Speicher entspricht Nach dem Abrufen der Referenzvariablen des Arrays oder Objekts können Sie die Variable im Stapel verwenden, um auf das Array oder Objekt im Heap im Programm zuzugreifen. Die Referenzvariable entspricht der Angabe eines Namens für das Array oder Objekt. Referenzvariablen sind gewöhnliche Variablen, die bei der Definition auf dem Stapel zugewiesen werden. Die Referenzvariablen werden freigegeben, nachdem das Programm außerhalb anderer Bereiche ausgeführt wurde. Arrays und Objekte werden im Heap zugewiesen. Auch wenn das Programm außerhalb des Codeblocks ausgeführt wird, in dem sich die von new generierte Array- oder Objektanweisung befindet, wird der vom Array und Objekt belegte Speicher nicht freigegeben. Arrays und Objekte werden zu Müll, wenn keine Referenzvariablen auf sie verweisen und nicht mehr verwendet werden können. Sie werden zu einem unbestimmten Zeitpunkt später vom Garbage Collector gesammelt (freigegeben). Dies ist auch der Grund, warum Java mehr Speicher beansprucht. Tatsächlich verweisen Variablen im Stapel auf Variablen im Heap-Speicher, die in Java Zeiger sind.
Codebeispiel Demo1: Erstellung eines einzelnen Objekts
class Person { String name ; int age ; public void tell() { System.out.println("姓名:"+name+",年龄:"+age); } } public class Demo1 { public static void main(String[] args) { Person per = new Person() ; } }
Im obigen Programm wird ein Objekt pro instanziiert und muss währenddessen im Speicher zugewiesen werden Instanziierungsprozess. Der Speicherplatz, der Stapelspeicher und Heapspeicher umfasst, ist in der folgenden Abbildung dargestellt:
Abbildung 1-1 Objektinstanziierungsprozess
Aus der obigen Abbildung können wir ersehen, dass der Objektname pro im Stapelspeicher gespeichert wird (genauer gesagt, die Zugriffsadresse des Heap-Speicherplatzes wird im Stapelspeicher gespeichert) und das Objekt spezifisch ist Inhalte wie AttributeName und Alter werden im Heap-Speicher gespeichert. Da das Per-Objekt nur instanziiert wurde und ihm kein bestimmter Wert zugewiesen wurde, verfügt es über Standardwerte. Der Standardwert von string ist null und der Standardwert von int type ist 0. Wie bereits erwähnt, muss der Heap-Speicherplatz mit dem Schlüsselwort new geöffnet werden.
Codebeispiel Demo2: Erstellung mehrerer Objekte
class Person { String name ; int age ; public void tell() { System.out.println("姓名:"+name+",年龄:"+age); } } public class Demo2 { public static void main(String[] args) { Person per1 = new Person() ; Person per2 = new Person() ; per1.name="张三" ; per1.age=30 ; per2.age=33 ; per1.tell(); per2.tell(); } }
Abbildung 1-2 Instanziieren Sie zwei Objekte
Schlüsselkonzepte: Klassen sind wie Arrays Referenztypen, die bedeuten, dass mehrere Stapelspeicher auf denselben Heapspeicher verweisen können.
Codebeispiel Demo3: Objektreferenzübertragung 1
class Person { String name ; int age ; public void tell() { System.out.println("姓名:"+name+",年龄:"+age); } } public class Demo3 { public static void main(String[] args) { Person per1 = new Person() ; Person per2 = per1 ;//-------注意-------- per1.name="张三" ; per1.age=30 ; per2.age=33 ; per1.tell(); per2.tell(); } }
Das Ergebnis der Programmausführung ist:
Aus dem laufenden Ergebnis des Programms geht hervor, dass der Ausgabeinhalt der beiden Objekte derselbe ist. Tatsächlich besteht die sogenannte Referenzübertragung darin, die Nutzungsrechte eines Heap-Speicherplatzes auf mehrere Stapelspeicherplätze zu übertragen Der Inhalt dieses Programms lautet wie folgt:
Abbildung 1-3 Übertragen Sie die Speicherzuordnung der Objektreferenz
Abbildung 1-3 Transferspeicherzuordnung der Objektreferenz (Fortsetzung)
Hinweis: Im obigen Beispiel hat das Objekt per2 Kein Heap-Speicherplatz. Dies liegt daran, dass das Objekt per2 nur Deklarationsoperationen und keine Instanziierungsoperationen ausführt. Verwenden Sie einfach das neue Schlüsselwort, und nach der Instanziierung ist Heap-Speicherplatz vorhanden
Codebeispiel Demo4: Objektreferenzübertragung 2
class Person { String name ; int age ; public void tell() { System.out.println("姓名:"+name+",年龄:"+age); } } public class Demo4 { public static void main(String[] args) { Person per1 = new Person() ; Person per2 = new Person() ; per1.name="张三" ; per1.age=30 ; per2.name="李四" ; per2.age=33 ; per2=per1 ;//-----注意---- per1.tell(); per2.tell(); } }
Das Ergebnis der obigen Ausführung Programm ist:
Anhand der Ausgabe des Programms können wir erkennen, dass es Demo3 ähnelt. Es sind jedoch einige Änderungen bei der Speicherzuweisung aufgetreten, wie unten gezeigt:
Abbildung 1-4 (Garbage Object) Generation
Hinweise:
1. Java selbst bietet einen Garbage-Collection-Mechanismus (Garbage Collection, GC), der von Zeit zu Zeit ungenutzten Speicherplatz freigibt, solange das Objekt nicht mehr verwendet wird , wird darauf gewartet, dass der GC den Speicherplatz freigibt, z. B. name="李思";age=33 im Heap-Speicher oben.
2. Ein Stapelspeicher kann nur auf einen Heap-Speicherplatz verweisen. Wenn Sie auf andere Heap-Speicherplätze verweisen möchten, müssen Sie zuerst den vorhandenen Zeiger trennen, bevor Sie einen neuen Zeiger zuweisen.
Gemeinsame Speicherbereiche in Java
In Java gibt es hauptsächlich 4 Speicherbereiche. Die Namen und Funktionen dieser Speicher sind wie folgt:
1 . Stapelspeicherplatz: Speichert die Namen aller Objekte.
2. Heap-Speicherplatz: Speichert den spezifischen Attributinhalt jedes Objekts.
3. Globaler Datenbereich: Statische Typattributwerte speichern.
4. Globaler Codebereich: Speichert alle Methodendefinitionen.
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Java-Speichermechanismus (Bilder und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!