本篇文章給大家分享的是有關一文讀懂Java 中的程序內存,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
首先我們先來感觀的認識下幾個名詞:
1、棧,一般來說,基本數據類型直接在棧中分配空間,局部變量(在方法代碼段中定義的變量)也在棧中直接分配空間,當局部變量所在方法執行完成之后該空間便立刻被JVM回收,還有一種是引用數據類型,即我們通常所說的需要用關鍵字new創建出來的對象所對應的引用也是在??臻g中,此時,JVM在??臻g中給對象引用分配了一個地址空間(相當于一個門牌號,通過這個門牌號就可以找到你家),在堆空間中給該引用的對象分配一個空間,??臻g中的地址引用指向了堆空間中的對象區(通過門牌號找住址);
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在??臻g中為study方法申請了一塊內存空間
study方法執行完后,立即釋放??臻g,代碼第14行,student2對象的引用指向了student所指向的地址
代碼15與16行,為student2的變量賦值,由于student2與student指向了同一個地方,所以這時student對象中變量的值也被改變
到這,main方法中所有代碼執行完畢,main方法所占用的??臻g也被回收,而堆空間等待GC回收
代碼執行結果如下:
null:0 John:23 I love study! Jack:25 Jack:25
以上就是一文讀懂Java 中的程序內存,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。