JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)域分區(qū)
借用百度百科圖片一張

程序計(jì)數(shù)器(PC寄存器)
- 是一塊較小的內(nèi)存空間,可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。(虛擬機(jī)的概念模型中,字節(jié)碼解釋器依靠程序計(jì)數(shù)器的值來選擇下一條需要執(zhí)行的字節(jié)碼指令)
- 為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各線程之間計(jì)數(shù)器互不影響?yīng)毩?chǔ)存。由上圖也可知程序計(jì)數(shù)器為線程隔離的數(shù)據(jù)區(qū)。
- 程序計(jì)數(shù)器也是JVM運(yùn)行時(shí)數(shù)據(jù)分區(qū)唯一一個(gè)不會(huì)拋出OutOfMemoryError異常的區(qū)域
虛擬機(jī)棧
Java虛擬機(jī)棧(Java Virtual Machine Stacks)也是線程私有的,它的生命周期與線程相同。Java虛擬機(jī)棧為Java方法(也就是字節(jié)碼)服務(wù)。
- Java虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:(使用了數(shù)據(jù)結(jié)構(gòu)中棧結(jié)構(gòu))
- 每個(gè)方法在執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)。
- 每個(gè)方法從調(diào)用直至執(zhí)行完成的過程中,就對(duì)應(yīng)一個(gè)棧幀從Java虛擬機(jī)棧中入棧到出棧的過程。
1.作用
存放java方法執(zhí)行時(shí)的所有的數(shù)據(jù)
2.組成
由棧幀組成,一個(gè)棧幀代表一個(gè)方法的執(zhí)行
-
棧幀(Stack Frame):用于儲(chǔ)存局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。
- 局部變量表:局部變量表中存放了編譯器可知的各種基本數(shù)據(jù)類型、對(duì)象引用和 returnAddress 類型。局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),局部變量空間是固定的,不會(huì)改變。
-
在Java虛擬機(jī)規(guī)范中對(duì)Java虛擬機(jī)棧區(qū)域規(guī)定了二種異常:
- 若線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常。
- 如果當(dāng)前Java虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展,如果擴(kuò)展時(shí)無法申請(qǐng)到足夠的內(nèi)存,就會(huì)拋出OutOfMemoryError異常。
本地方法棧
本地方法棧(Native Method Stack) 本地方法棧為虛擬機(jī)使用到的Native方法服務(wù)。
在虛擬機(jī)規(guī)范中對(duì)本地方法棧中方法使用的語言、使用方式、數(shù)據(jù)結(jié)構(gòu)并沒有強(qiáng)制規(guī)定,因此具體的虛擬機(jī)可以自由實(shí)現(xiàn)它。例如:Sun HotSpot虛擬機(jī)直接就把虛擬機(jī)棧與本地方法棧合二為一。
拋出的異常同Java虛擬機(jī)棧一樣。
方法區(qū)
方法區(qū)(Method Area)是各個(gè)線程共享的內(nèi)存區(qū)域,用于儲(chǔ)存已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
- Java虛擬機(jī)規(guī)范對(duì)堆的描述為:
- 方法區(qū)是堆的一個(gè)邏輯部分,有一個(gè)別名Non-Heap(非堆),目的應(yīng)該是與Java堆區(qū)分開來。
- 方法區(qū)和堆一樣不需要連續(xù)的內(nèi)存和可擴(kuò)展外,還可以不實(shí)現(xiàn)垃圾收集。
- 當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常。
java堆
一般來說Java堆是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java堆(Java Heap)是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。堆內(nèi)存也是GC內(nèi)存回收的主要區(qū)域
1.作用
- 所有通過new所創(chuàng)建的對(duì)象的內(nèi)存,都在堆中分配
2.特點(diǎn)
- Java堆可以處在物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可。
- 是虛擬機(jī)中最大的一塊內(nèi)存,是GC要回收的部分,如果在堆中沒有內(nèi)存可供實(shí)例完成分配,并且堆也無法在擴(kuò)展時(shí),將會(huì)拋出OutOfMemoryError異常。
3.分類

- 新生代區(qū) 剛創(chuàng)建的對(duì)象會(huì)被加入到新生代區(qū),當(dāng)新生代區(qū)內(nèi)存不足的時(shí)候,Jvm會(huì)通過一定的算法將新生代區(qū)的對(duì)象移到老生代區(qū)
- 老生代區(qū)
- 當(dāng)新生代區(qū)和老生代區(qū)都沒有足夠的內(nèi)存時(shí),Jvm會(huì)拋出OOM異常
- 開發(fā)人員可以動(dòng)態(tài)的調(diào)整新生代區(qū)和老生代區(qū)的內(nèi)存大小