Heim  >  Artikel  >  Java  >  Java-Code-Analyse zum Programmspeicher

Java-Code-Analyse zum Programmspeicher

Y2J
Y2JOriginal
2017-05-03 15:14:281203Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur Analyse des Programmspeichers in Java vorgestellt. Freunde, die sie benötigen, können darauf zurückgreifen.

In diesem Artikel wird die JVM (Java Virtual Machine) kurz erläutert, wenn wir ein Java-Programm ausführen . Maschine) Speicherzuordnung.

Lassen Sie uns zunächst einige Substantive perzeptiv kennenlernen:

1. Im Allgemeinen sind grundlegende Datentypen direkt vorhanden Der Speicherplatz wird auf dem Stapel zugewiesen, und lokale Variablen (im Methodencodesegment definierte Variablen) werden ebenfalls direkt auf dem Stapel zugewiesen. Wenn die Methode ausgeführt wird, in der sich die lokale Variable befindet, wird der Speicherplatz sofort von der JVM zurückgefordert auch ein Referenzdatentyp, nämlich Was wir normalerweise als Referenz bezeichnen, die dem Objekt entspricht, das mit dem Schlüsselwort new erstellt werden muss, befindet sich ebenfalls im Stapelbereich. Zu diesem Zeitpunkt weist die JVM der Objektreferenz im Stapel einen Adressraum zu Platz (entspricht einer Hausnummer, über diese Hausnummer können Sie Ihr Zuhause anhand der Nummer finden), weisen Sie dem referenzierten Objekt einen Platz im Heap-Raum zu, und die Adressreferenz im Stapelraum zeigt auf den Objektbereich im Heap-Raum (Suchen Sie die Adresse anhand der Hausnummer).

2. Heap wird im Allgemeinen zum Speichern von Daten verwendet, die mit dem Schlüsselwort „new“ abgerufen werden.

Als nächstes verwenden wir ein Programm, um die Speichersituation der JVM intuitiv zu spüren, wenn das Programm ausgeführt wird.

package demo;
public class Student {
  private String name;
  private int age;

  public void study() {
    System.out.println("I love study!");
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}
package demo;

public class StudentDemo {
  public static void main(String[] args) {
    Student student = new Student();

    System.out.println(student.getName() + ":" + student.getAge());
    student.setName("John");
    student.setAge(23);
    System.out.println(student.getName() + ":" + student.getAge());
    
    student.study();
    
    Student student2 = student;
    student2.setName("Jack");
    student2.setAge(25);
    System.out.println(student2.getName() + ":" + student2.getAge());
    System.out.println(student.getName() + ":" + student.getAge());
  }
}
Wenn wir das Programm ausführen, wird die JVM kombiniert die Student-Klasse und StudentDemo Die Klasse wird kompiliert und dann in einen Ort namens Methodenbereich in der JVM geladen. Die Mitgliedsvariablen und Mitgliedsmethoden der Klasse werden ebenfalls in den Methodenbereich geladen. Zu diesem Zeitpunkt sieht das Speichermodell wie folgt aus

Sie können sehen, dass auf der rechten Seite der Lernmethode eine Hexadezimalmarkierung vorhanden ist, die Namens- und Altersvariablen jedoch nicht. Dies liegt daran, dass jedes Objekt seine eigene hat Mitgliedsvariablen, aber die Mitgliedsmethoden in der Klasse können von jedem Objekt gemeinsam genutzt werden. Um Speicherplatz zu sparen, weist die JVM der Methode diese Markierung (auch Speicheradresse genannt) zu, um die Suche und den Aufruf jedes neuen Objekts zu erleichtern. Dann sucht die JVM automatisch nach der Hauptmethode und beantragt einen Platz im Stapel für die Hauptmethode. Dieser Vorgang wird auch als „Auf den Stapel verschieben“ bezeichnet und führt dann die 5. Codezeile in unserer Student-Klasse aus , die JVM weist dem Student-Objekt im Heap-Bereich einen Teil des Speichers zu und weist ihm eine Speicheradresse zu (wenn der Mitgliedsvariablen des Objekts kein Wert zugewiesen wird, weist die JVM der Variablen einen Wert zu. Anfangswert zuweisen) Weisen Sie einen Speicherplatz im Stapel zu, der auf die Speicheradresse des Student-Objektbereichs im Heap-Speicherplatz zeigt. Zu diesem Zeitpunkt lautet das Speichermodell wie folgt:

Dann Schauen Sie sich den Code an. In den Zeilen 8 und 9 weist das Programm den Mitgliedsvariablen des Student-Objekts Werte zu. Die JVM sucht im Heap-Speicher anhand der vom Studenten angegebenen Adresse. und weisen Sie den Variablen neue Werte zu

Zeile 12: Zu diesem Zeitpunkt ruft das Studentenobjekt die Lernmethode auf und die JVM beantragt einen Speicherplatz im Stapelbereich für die Study-Methode

Die Study-Methode wird ausgeführt. Danach wird der Stapelplatz sofort freigegeben. In Zeile 14 des Codes zeigt die Referenz des student2-Objekts auf Adresse, auf die Student zeigt

Die Zeilen 15 und 16 des Codes weisen den Variablen von Student2 Werte zu. Da Student2 und Student auf dieselbe Stelle zeigen, ist der Wert von Zu diesem Zeitpunkt wird auch die Variable im Studentenobjekt geändert

Zu diesem Zeitpunkt wurde der gesamte Code in der Hauptmethode ausgeführt und die Hauptmethode belegt den Stapelplatz wird ebenfalls recycelt und der Heap-Speicherplatz wartet auf das GC-Recycling

Die Ergebnisse der Codeausführung lauten wie folgt:

Das obige ist der detaillierte Inhalt vonJava-Code-Analyse zum Programmspeicher. 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