運(yùn)行時(shí)數(shù)據(jù)區(qū)
Java虛擬機(jī)定義了執(zhí)行程序時(shí)使用的各種運(yùn)行時(shí)數(shù)據(jù)區(qū)域咳短。其中一些是在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建踩晶,虛擬機(jī)退出時(shí)才銷毀;另外一些是在線程創(chuàng)建時(shí)創(chuàng)建宋下,線程退出時(shí)銷毀嗡善。
1.程序計(jì)數(shù)器
jvm支持多線程同時(shí)執(zhí)行,每個(gè)線程都有自己的程序計(jì)數(shù)器学歧。線程正在執(zhí)行的方法叫做當(dāng)前方法罩引。若是java代碼,則PC Register是當(dāng)前正在執(zhí)行的指令地址。若是NATIVE代碼,則為空枝笨。
2.虛擬機(jī)棧
虛擬機(jī)棧是線程私有的袁铐,生命周期和線程相同。描述的是java方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行時(shí)創(chuàng)建一個(gè)棧幀伺帘,用于存儲(chǔ)局部變量表昭躺、操作數(shù)棧忌锯、動(dòng)態(tài)鏈接伪嫁、方法出口等。每個(gè)方法從調(diào)用到執(zhí)行完成偶垮,對(duì)應(yīng)一個(gè)棧幀入棧到出棧的過(guò)程张咳。
3.本地方法棧
native方法
4.方法區(qū)
方法區(qū)和堆一樣都是線程共享的內(nèi)存區(qū)域帝洪,用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量脚猾、靜態(tài)變量葱峡、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。jdk8稱為metaspace, jdk7以前叫做permgen space
常量池:運(yùn)行時(shí)常量池是方法區(qū)的一部分龙助,用于存放編譯期產(chǎn)生的各種字面量和引用等砰奕。
5.堆
堆是虛擬機(jī)管理的最大一塊內(nèi)存弃鸦,所有線程共享洗鸵,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此區(qū)域的唯一目的就是存放對(duì)象實(shí)例屏箍,幾乎所有對(duì)象的實(shí)例都在這里分配內(nèi)存称勋。java可以在物理上不算連續(xù)的胸哥,只要邏輯上是聯(lián)系的即可。