程序計(jì)數(shù)器
是一塊較小的內(nèi)存空間。用來(lái)記錄當(dāng)前線程所執(zhí)行到的字節(jié)碼的行號(hào)槐瑞。因此每個(gè)線程都有一個(gè)獨(dú)立的程序計(jì)數(shù)器撇簿。
如果當(dāng)前執(zhí)行的是java代碼柔袁,程序計(jì)數(shù)器記錄的就是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址。如果正在執(zhí)行的是native方法,則程序計(jì)數(shù)器記錄的值為空(Undefined)耕肩。
程序計(jì)數(shù)器是唯一一個(gè)在java虛擬機(jī)規(guī)范中沒(méi)有規(guī)定oom的區(qū)域。
java虛擬機(jī)棧
虛擬機(jī)棧與程序計(jì)數(shù)器一樣董朝,也是線程私有的。生命周期與線程相同干跛。
棧楨
棧楨是每個(gè)java方法運(yùn)行時(shí)會(huì)創(chuàng)建的一塊內(nèi)存區(qū)域子姜,用于存儲(chǔ)局部變量表、操作數(shù)棧驯鳖、動(dòng)態(tài)鏈接闲询、方法出口等信息。一個(gè)方法從調(diào)用到執(zhí)行結(jié)束對(duì)應(yīng)一個(gè)棧楨在虛擬機(jī)棧中的入棧和出棧浅辙。
局部變量表
- 我們通常意義上所說(shuō)的“椗せ。”,指的就是局部變量表记舆,它用于存儲(chǔ)編譯期可知的各種基本類型(boolean鸽捻、byte、char泽腮、short御蒲、int、float诊赊、long厚满、double)、對(duì)象引用和returnAddress類型(值指向一條虛擬機(jī)指令的操作碼)碧磅。
- 局部變量表所需要的內(nèi)存在編譯期間完成分配碘箍,在進(jìn)入一個(gè)方法時(shí),這個(gè)方法所需分配的內(nèi)存是完全確定且在方法運(yùn)行期間不會(huì)改變的鲸郊。
在這塊內(nèi)存區(qū)域中丰榴,如果線程申請(qǐng)的棧深度大于虛擬機(jī)所允許的棧深度,就會(huì)拋出StackOverflowError秆撮、而如果虛擬機(jī)可以動(dòng)態(tài)擴(kuò)展(大部分虛擬機(jī)都可以)但動(dòng)態(tài)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存四濒,就會(huì)拋出OutOfMemoryError。
本地方法棧
與java虛擬機(jī)椫氨妫基本一致盗蟆,只不過(guò)java虛擬機(jī)棧執(zhí)行的是java方法而本地方法棧執(zhí)行的是native方法。
有的虛擬機(jī)直接就把java虛擬機(jī)棧和本地方法棧合二為一
java堆
對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō)拨匆,java堆是java虛擬機(jī)所管理的內(nèi)存中的最大的一塊姆涩。
java堆是所有線程共享的區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建
對(duì)象實(shí)例和數(shù)組都在堆上存儲(chǔ)(棧上分配惭每、標(biāo)量替換優(yōu)化技術(shù)會(huì)導(dǎo)致該條并不是那么絕對(duì))
根據(jù)java虛擬機(jī)規(guī)范骨饿,java堆只要邏輯上連續(xù)即可(物理上可以不連續(xù))。
當(dāng)前主流的虛擬機(jī)的堆都是可擴(kuò)展的(也可以固定大刑ㄐ取)宏赘,當(dāng)堆中沒(méi)有足夠的空間來(lái)分配實(shí)例且無(wú)法擴(kuò)展時(shí),會(huì)拋出OutOfMemoryError黎侈。
方法區(qū)
方法區(qū)同樣是各個(gè)線程共享的內(nèi)存區(qū)域察署。它用于存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息、常量峻汉、靜態(tài)變量贴汪、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)脐往。
方法區(qū)與堆一樣,邏輯上連續(xù)即可扳埂,同樣也可以選擇固定大小或可擴(kuò)展业簿。除此之外方法區(qū)還可以選擇不實(shí)現(xiàn)垃圾回收,因?yàn)榉椒▍^(qū)上的垃圾回收回報(bào)比較低(垃圾回收會(huì)消耗資源但方法區(qū)中的值很少被回收)
當(dāng)方法區(qū)無(wú)法滿足內(nèi)存分配需求時(shí)阳懂,會(huì)拋出OutOfMemoryError梅尤。
運(yùn)行時(shí)常量池
運(yùn)行時(shí)常量池是方法區(qū)的一部分。用于存放編譯期生成的各種字面量和符號(hào)引用岩调,這部分內(nèi)容存在在Class文件中巷燥,在類加載后存放到方法區(qū)的運(yùn)行時(shí)常量池中。
除此之外号枕,翻譯出來(lái)的直接引用也會(huì)被存儲(chǔ)在運(yùn)行時(shí)常量池中缰揪。
當(dāng)常量池?zé)o法申請(qǐng)到內(nèi)存時(shí)會(huì)拋出OutOfMemoryError。
直接內(nèi)存
即運(yùn)行虛擬機(jī)的計(jì)算機(jī)上的內(nèi)存