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)存大小