記憶方式:“兩棧一堆”(虛擬機(jī)棧、本地方法棧、堆)+方法區(qū)+程序計(jì)數(shù)器
程序計(jì)數(shù)器
線程私有
- 當(dāng)前線程所執(zhí)行字節(jié)碼的行號(hào)指示器九府。
- 程序控制流的指示器(分支椎瘟、循環(huán)、跳轉(zhuǎn)侄旬、異常處理肺蔚、線程恢復(fù)等)
- 該區(qū)域沒有規(guī)定任何
OutOfMemoryError
情況。
Java虛擬機(jī)棧
線程私有
StackOverflowError
OutOfMemoryError
虛擬機(jī)棧描述的是Java方法執(zhí)行的線程內(nèi)存模型:
每個(gè)方法執(zhí)行的時(shí)候儡羔,Java虛擬機(jī)都會(huì)同步創(chuàng)建一個(gè)棧幀宣羊,用于存儲(chǔ)局部變量表、操作數(shù)棧汰蜘、動(dòng)態(tài)連接仇冯、方法出口等信息。
每一個(gè)方法被調(diào)用直至執(zhí)行完畢的過程族操,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程苛坚。
局部變量表
存放了編譯期可知的各種Java虛擬機(jī)
- 基本數(shù)據(jù)類型( boolean、byte色难、char泼舱、short、int枷莉、long娇昙、float、double )
- 對(duì)象引用(reference類型笤妙,它并不等同于對(duì)象本身冒掌,可能是一個(gè)指向?qū)ο笃鹗嫉刂返囊弥羔槪部赡苁侵赶蛞粋€(gè)代表對(duì)象的句柄或者其他與此對(duì)象相關(guān)的位置)
- returnAddress類型(指向了一條字節(jié)碼指令的地址)
局部變量表所需的內(nèi)存空間在編譯期間完成分配危喉,當(dāng)進(jìn)入一個(gè)方法時(shí)宋渔,這個(gè)方法需要在棧幀中分配多大的局部變量空間是完全確定的,在方法運(yùn)行期間不會(huì)改變局部變量表的大小辜限。
本地方法棧
線程私有
StackOverflowError
OutOfMemoryError
本地方法棧與虛擬機(jī)棧發(fā)揮的作用時(shí)非常相似的皇拣,其區(qū)別:
- 本地方法棧是為虛擬機(jī)使用到的本地(Native)方法服務(wù)。
- 虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法服務(wù)薄嫡。
Java堆
線程共享
存放對(duì)象實(shí)例
所有的對(duì)象實(shí)例以及數(shù)組都應(yīng)當(dāng)在堆上分配氧急。
垃圾收集器管理的內(nèi)存區(qū)域
OutOfMemoryError
方法區(qū)
線程共享
OutOfMemoryError
存儲(chǔ)已被虛擬機(jī)加載的類型信息、常量毫深、靜態(tài)變量吩坝、即時(shí)編譯器編譯后的代碼緩存等數(shù)據(jù)。
該區(qū)域的內(nèi)存回收目標(biāo)主要是針對(duì)常量池的回收和對(duì)類型的卸載哑蔫。
運(yùn)行時(shí)常量池
運(yùn)行時(shí)常量池是方法區(qū)的一部分钉寝。
Class文件中除了有類的版本弧呐、字段、方法嵌纲、接口等描述信息外俘枫,還有常量池表,用于存放編譯期生成的各種字面量與符號(hào)引用逮走,這部分內(nèi)容將在類加載后存放到方法區(qū)的運(yùn)行時(shí)常量池中鸠蚪。
運(yùn)行時(shí)常量池另一個(gè)重要的特征是具備動(dòng)態(tài)性,并非預(yù)置入Class文件中常量池的內(nèi)容才能進(jìn)入方法區(qū)運(yùn)行時(shí)常量池师溅,運(yùn)行期間也可以將新的常量放入池中茅信。
直接內(nèi)存
OutOfMemoryError
直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是《Java虛擬機(jī)規(guī)范》中定義的內(nèi)存區(qū)域墓臭。
直接內(nèi)存:使用Native函數(shù)庫(kù)直接分配堆外內(nèi)存
在JDK1.4中心加入了NIO(New Input/Output)類蘸鲸,引入了一種基于通道(Channel)與緩沖區(qū)(Buffer)的I/O方式,它可以使用Native函數(shù)庫(kù)直接分配堆外內(nèi)存起便,然后通過一個(gè)存儲(chǔ)在Java堆里面的
DirectByteBuffer
對(duì)象為這塊內(nèi)存區(qū)域的引用進(jìn)行操作棚贾。這樣能在一些場(chǎng)景中顯著提高性能,因?yàn)楸苊饬嗽贘ava堆和Native堆中來回復(fù)制數(shù)據(jù)榆综。