国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

詳解Java 中程序內(nèi)存的分析

2019-11-26 12:30:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章將簡(jiǎn)單的說(shuō)明下當(dāng)我們運(yùn)行Java程序時(shí)JVM(Java虛擬機(jī))的內(nèi)存分配情況。

首先我們先來(lái)感觀的認(rèn)識(shí)下幾個(gè)名詞:

1、棧,一般來(lái)說(shuō),基本數(shù)據(jù)類(lèi)型直接在棧中分配空間,局部變量(在方法代碼段中定義的變量)也在棧中直接分配空間,當(dāng)局部變量所在方法執(zhí)行完成之后該空間便立刻被JVM回收,還有一種是引用數(shù)據(jù)類(lèi)型,即我們通常所說(shuō)的需要用關(guān)鍵字new創(chuàng)建出來(lái)的對(duì)象所對(duì)應(yīng)的引用也是在棧空間中,此時(shí),JVM在棧空間中給對(duì)象引用分配了一個(gè)地址空間(相當(dāng)于一個(gè)門(mén)牌號(hào),通過(guò)這個(gè)門(mén)牌號(hào)就可以找到你家),在堆空間中給該引用的對(duì)象分配一個(gè)空間,棧空間中的地址引用指向了堆空間中的對(duì)象區(qū)(通過(guò)門(mén)牌號(hào)找住址);

2、堆,一般用來(lái)存放用關(guān)鍵字new出來(lái)的數(shù)據(jù)。

接下來(lái)我們?cè)偻ㄟ^(guò)一段程序來(lái)直觀感受下程序運(yùn)行時(shí)JVM的內(nèi)存情況,

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

當(dāng)我們運(yùn)行程序時(shí),JVM會(huì)把Student類(lèi)與StudentDemo類(lèi)編譯完然后加載到JVM中一個(gè)叫方法區(qū)的地方,類(lèi)的成員變量與成員方法也被加載到方法區(qū)中,此時(shí)內(nèi)存模型如下

可以看到study方法右邊各有一個(gè)16進(jìn)制的標(biāo)記,而name與age變量沒(méi)有,這是因?yàn)槊總€(gè)對(duì)象都有各自的成員變量,而類(lèi)中的成員方法卻可以被每個(gè)對(duì)象所共用,為了節(jié)省內(nèi)存空間,JVM為方法分配了該標(biāo)記(也叫內(nèi)存地址)便于每個(gè)new出來(lái)的對(duì)象查找調(diào)用,接著JVM會(huì)自動(dòng)尋找main方法,在棧中為main方法申請(qǐng)一個(gè)空間,這個(gè)過(guò)程也叫入棧,然后執(zhí)行我們Student類(lèi)中第5行代碼,這時(shí)候,JVM在堆空間中分配一塊內(nèi)存給Student對(duì)象,并為其分配一個(gè)內(nèi)存地址(如果對(duì)象的成員變量沒(méi)有賦值,則JVM會(huì)為變量賦初始值),在棧中分配一塊內(nèi)存空間用于指向堆空間中的Student對(duì)象區(qū)的內(nèi)存地址,此時(shí)內(nèi)存模型如下

接著看代碼第8行與第9行,程序?yàn)閟tudent對(duì)象的成員變量賦值,JVM會(huì)根據(jù)student所指向的地址在堆內(nèi)存中尋找Student類(lèi)的變量,并為變量賦新的值

第12行,這時(shí)student對(duì)象調(diào)用study方法,JVM在棧空間中為study方法申請(qǐng)了一塊內(nèi)存空間

study方法執(zhí)行完后,立即釋放棧空間,代碼第14行,student2對(duì)象的引用指向了student所指向的地址

代碼15與16行,為student2的變量賦值,由于student2與student指向了同一個(gè)地方,所以這時(shí)student對(duì)象中變量的值也被改變

到這,main方法中所有代碼執(zhí)行完畢,main方法所占用的棧空間也被回收,而堆空間等待GC回收

代碼執(zhí)行結(jié)果如下:

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

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 重庆市| 鱼台县| 祁连县| 张家口市| 余江县| 普陀区| 西宁市| 兴海县| 顺平县| 蒙城县| 荥阳市| 礼泉县| 华池县| 安乡县| 安远县| 门源| 柯坪县| 礼泉县| 方正县| 阿瓦提县| 青铜峡市| 都江堰市| 南澳县| 黑山县| 马山县| 嘉定区| 平邑县| 祥云县| 静海县| 分宜县| 中江县| 昌都县| 宁远县| 筠连县| 洛阳市| 镇坪县| 大新县| 屏边| 青岛市| 南木林县| 淄博市|