Heim  >  Artikel  >  Java  >  Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

黄舟
黄舟Original
2017-03-18 10:20:521483Durchsuche

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:

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

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(); 
 }
}

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

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:

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

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:

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

Abbildung 1-3 Übertragen Sie die Speicherzuordnung der Objektreferenz

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

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:

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

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:

Detaillierte Erklärung des Java-Speichermechanismus (Bilder und Text)

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!

Stellungnahme:
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