JVM原理—Java內(nèi)存結(jié)構(gòu)


Java文件經(jīng)過(guò)編譯后會(huì)生成class字節(jié)碼文件,運(yùn)行程序時(shí),字節(jié)碼文件經(jīng)過(guò)類加載器加載進(jìn)內(nèi)存。Java的內(nèi)存空間主要?jiǎng)澐譃?個(gè)部分:方法區(qū)、堆、棧和本地方法棧。

棧(Stack):

用于存放方法中的局部變量,局部變量包括編譯期基本數(shù)據(jù)類型(8個(gè)基本數(shù)據(jù)類型)、對(duì)象引用(地址指針)。每個(gè)方法的運(yùn)行一定在棧中,因?yàn)榉椒ㄔ趫?zhí)行的同時(shí)會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息,因此,可以理解為每個(gè)棧是獨(dú)立的,線程私有的,即線程安全。

堆(Heap):

凡是new出來(lái)的對(duì)象都是在堆中的,堆內(nèi)存里的對(duì)象都有一個(gè)16進(jìn)制的地址值,多線程共享。

因?yàn)槭抢占鞴芾淼闹饕獏^(qū)域,也被成為“GC堆”,垃圾回收機(jī)制算法和JVM參數(shù)調(diào)優(yōu)也是在這個(gè)區(qū)域中進(jìn)行的。從內(nèi)存回收角度來(lái)看堆可分為:新生代和老生代。從內(nèi)存分配的角度看,線程共享的Java堆中可能劃分出多個(gè)線程私有的分配緩沖區(qū)(Thread Local Allocation Buffer,TLAB)。無(wú)論怎么劃分,都與存放內(nèi)容無(wú)關(guān),無(wú)論哪個(gè)區(qū)域,存儲(chǔ)的都是對(duì)象實(shí)例,進(jìn)一步的劃分都是為了更好的回收內(nèi)存,或者更快的分配內(nèi)存。

方法區(qū)(Method Area):

與堆一樣,是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、方法信息、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù),也被稱為永久區(qū)。

本地方法棧(Native Method Stack):

本地方法棧與棧作用類似,就是Java語(yǔ)言調(diào)用外部語(yǔ)言(C語(yǔ)言),使用native方法服務(wù),與操作系統(tǒng)有關(guān)。例如在安卓開(kāi)發(fā)中,安卓的應(yīng)用層是JAVA API,而底層是C語(yǔ)言,JNI技術(shù)中可以使用Java語(yǔ)言去調(diào)用C語(yǔ)言實(shí)現(xiàn)結(jié)構(gòu)調(diào)用執(zhí)行,從而提高程序執(zhí)行的效率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容