首頁  >  文章  >  Java  >  關於程式記憶體的java程式碼分析

關於程式記憶體的java程式碼分析

Y2J
Y2J原創
2017-05-03 15:14:281203瀏覽

這篇文章主要介紹了詳解Java 中程式記憶體的分析的相關資料,需要的朋友可以參考下

這篇文章將簡單的說明下當我們執行Java程式時JVM(Java虛擬機)的記憶體分配情況。

首先我們先來感觀的認識下幾個名詞:

1、堆疊,一般來說,基本資料型別直接在在堆疊中分配空間,局部變數(在方法代碼段中定義的變數)也在堆疊中直接分配空間,當局部變數所在方法執行完成之後該空間便立刻被JVM回收,還有一種是引用資料類型,即我們通常所說的需要用關鍵字new建立出來的物件所對應的參考也是在堆疊空間中,此時,JVM在堆疊空間中給物件參考分配了一個位址空間(相當於一個門牌號,透過這個門牌號就可以找到你家),在堆空間中給該引用的物件一個空間,堆疊空間中的位址引用指向了堆空間中的物件區(透過門牌號碼找住址);

2、堆,一般用來存放用關鍵字new出來的資料。

接下來我們再透過一段程式來直覺地感受下程式執行時間JVM的記憶體狀況,

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

當我們執行程式時,JVM會把Student類別與StudentDemo類別編譯完然後載入到JVM中一個叫做方法區的地方,類別的成員變數與成員方法也被載入到方法區中,此時記憶體模型如下

##可以看到study方法右邊各有一個16進制的標記,而name與age變數沒有,這是因為每個物件都有各自的成員變量,而類別中的成員方法卻可以被每個物件所共用,為了節省記憶體空間, JVM為方法分配了該標記(也叫內存位址)便於每個new出來的物件查找調用,接著JVM會自動尋找main方法,在棧中為main方法申請一個空間,這個過程也叫入棧,然後執行我們Student類別中第5行程式碼,這時候,JVM在堆空間中分配一塊記憶體給Student對象,並為其分配一個記憶體位址(如果對象的成員變數沒有賦值,則JVM會為變數賦初始值),在堆疊中分配一塊記憶體空間用來指向堆疊空間中的Student物件區的記憶體位址,此時記憶體模型如下

接著看程式碼第8行與第9行,程式為student物件的成員變數賦值,JVM會根據student所指向的位址在堆記憶體中尋找Student類別的變量,並為變數賦新的值

第12行,這時student物件呼叫study方法,JVM在堆疊空間中為study方法申請了一塊記憶體空間

study方法執行完後,立即釋放堆疊空間,程式碼第14行,student2物件的參考指向了student所指向的位址

程式碼15與16行,為student2的變數賦值,由於student2與student指向了同一個地方,所以這時student物件中變數的值也被改變

#到這,main方法中所有程式碼執行完畢,main方法所佔用的堆疊空間也被回收,而堆空間等待GC回收

程式碼執行結果如下:

null:0
John:23
I love study!
Jack:25
Jack:25

以上是關於程式記憶體的java程式碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn