久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java程序內(nèi)存的簡(jiǎn)單分析

 孤獨(dú)一兵 2016-10-05

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

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

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

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

接下來我們?cè)偻ㄟ^一段程序來直觀感受下程序運(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類與StudentDemo類編譯完然后加載到JVM中一個(gè)叫方法區(qū)的地方,類的成員變量與成員方法也被加載到方法區(qū)中,,此時(shí)內(nèi)存模型如下

Java程序內(nèi)存的簡(jiǎn)單分析

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

Java程序內(nèi)存的簡(jiǎn)單分析

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

Java程序內(nèi)存的簡(jiǎn)單分析

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

Java程序內(nèi)存的簡(jiǎn)單分析

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

Java程序內(nèi)存的簡(jiǎn)單分析

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

Java程序內(nèi)存的簡(jiǎn)單分析

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

Java程序內(nèi)存的簡(jiǎn)單分析

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

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

寫的較為簡(jiǎn)單,,僅作為知識(shí)記錄,,歡迎指正!

學(xué)習(xí)Java的同學(xué)注意了?。,。?/strong>

學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,,歡迎加入Java學(xué)習(xí)交流群,,群號(hào)碼:184625948【長(zhǎng)按復(fù)制】 我們一起學(xué)Java!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多