一 內(nèi)存區(qū)域劃分概述
Java運(yùn)行時(shí)的內(nèi)存主要包括:方法區(qū)干跛,堆,棧(虛擬機(jī)棧酝润,本地方法棧)燎竖,程序計(jì)數(shù)器。
其中棧(虛擬機(jī)棧要销,本地方法棧)和程序計(jì)數(shù)器是線程私有的构回,方法區(qū)和堆是線程共享的。
二 程序計(jì)數(shù)器
2.1 含義
一塊較小的內(nèi)存空間疏咐,當(dāng)前線程所執(zhí)行的字節(jié)碼行號(hào)的指示器纤掸;字節(jié)碼解釋器工作時(shí),通過改變計(jì)數(shù)器的值 選取下一條執(zhí)行的字節(jié)碼指令浑塞;(一些基本功能都需要依賴計(jì)數(shù)器來完成如:分支借跪、循環(huán)、跳轉(zhuǎn)酌壕、異常處理掏愁、線程恢復(fù)等)
當(dāng)線程正執(zhí)行 Java 程序時(shí):程序計(jì)數(shù)器 記錄正在執(zhí)行的虛擬機(jī)字節(jié)指令地址。
執(zhí)行 native 方法卵牍,計(jì)數(shù)器值為空 undefined果港;】
2.2 內(nèi)存異常情況
沒有規(guī)定任何 OutOfMemoryError 情況的內(nèi)存區(qū)域;
2.3 線程私有情況
是線程私有的辽慕。
三 棧(虛擬機(jī)棧京腥,本地方法棧)
3.1 含義
由一個(gè)一個(gè)的棧幀組成,棧幀是在每一個(gè)方法調(diào)用時(shí)產(chǎn)生的溅蛉,是方法的工作空間公浪。每一個(gè)棧幀由局部變量區(qū)、操作數(shù)棧等組成船侧。每創(chuàng)建一個(gè)棧幀壓棧欠气,當(dāng)一個(gè)方法執(zhí)行完畢之后則出棧。
3.2 內(nèi)存異常情況
棧幀過多镜撩,會(huì)拋出 StackOverflowError预柒。
初始化新的虛擬機(jī)棧時(shí)申請(qǐng)不到足夠的內(nèi)存,則會(huì)拋出 OutOfMemoryError袁梗。
3.3 線程私有情況
是線程私有的宜鸯。
四 堆
4.1 含義
Java 堆是整個(gè)虛擬機(jī)所管理的最大內(nèi)存區(qū)域,所有的對(duì)象創(chuàng)建都是在這個(gè)區(qū)域進(jìn)行內(nèi)存分配遮怜,GC回收也是主要針對(duì)這塊內(nèi)存區(qū)域淋袖。
4.2 內(nèi)存異常情況
創(chuàng)建新對(duì)象申請(qǐng)不到足夠的內(nèi)存,則會(huì)拋出 OutOfMemoryError锯梁。
4.3 線程私有情況
這塊內(nèi)存區(qū)域是線程共享的即碗。
五 方法區(qū)
5.1 含義
方法區(qū)主要用于存放已經(jīng)被虛擬機(jī)加載的類信息焰情,如常量,靜態(tài)變量剥懒。
5.2 內(nèi)存異常情況
超出內(nèi)存大小會(huì)拋出 OutOfMemoryError内舟。
5.3 線程私有情況
這塊內(nèi)存區(qū)域是線程共享的。