這篇文章主要介紹了詳解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中文網其他相關文章!