1、運(yùn)行時數(shù)據(jù)區(qū)組成
(1)堆區(qū)
(2)虛擬機(jī)棧區(qū)
(3)本地方法棧區(qū)
(4)方法區(qū)
(5)程序計(jì)數(shù)器
2、程序計(jì)數(shù)器的作用
(1)執(zhí)行Java方法時:記錄正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址。
(2)執(zhí)行Native(本地)方法時:計(jì)數(shù)器值為空(Undefined)
3、Java常量池
Java中的常量池,實(shí)際上分為兩種形態(tài):靜態(tài)常量池和運(yùn)行時常量池。
(1)靜態(tài)常量池,即*.class文件中的常量池,class文件中的常量池不僅僅包含字符串(數(shù)字)字面量,還包含類、方法的信息,占用class文件絕大部分空間。
(2)運(yùn)行時常量池:運(yùn)行時常量池是方法區(qū)的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項(xiàng)信息是常量池,用于存放編譯期間生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時常量池中存放。通俗的講就是jvm虛擬機(jī)在完成類裝載操作后,將class文件中的常量池載入到內(nèi)存中,并保存在方法區(qū)中,我們常說的常量池,就是指方法區(qū)中的運(yùn)行時常量池。
常量池包含的信息如圖所示:
4、堆中分配對象空間的方式
(1)在Serial和ParNew等帶Compact過程的收集器所管理的規(guī)則內(nèi)存空間中采用指針碰撞的分配方式,因?yàn)槭S嗫臻g為規(guī)則的,所以做法為將指針向空閑空間挪動一段與該對象大小相等的空間。
(2)在CMS等這種采用Mark-Sweep算法的收集器管理的零散內(nèi)存空間中使用空閑列表的分配方式。這是由于虛擬機(jī)中維護(hù)著一個空閑內(nèi)存地址的列表。
避免因并發(fā)引起的空間分配問題:
(1)使用CAS保證更新操作的原子性。
(2)為每條分配內(nèi)存的線程在堆中預(yù)先分配一小塊內(nèi)存空間(本地線程分配緩存TLAB),只有TLAB用完了并要分配新空間時才需要同步鎖定。
5、對象的存儲布局
6、堆中對象的訪問方式
(1)直接指針訪問方式。(HotSpot使用的方式)
優(yōu)點(diǎn):速度快。
缺點(diǎn):對象移動時棧中的reference地址經(jīng)常需要變動。
(2)使用句柄訪問方式。
優(yōu)點(diǎn):對象移動時只需修改句柄指針。
缺點(diǎn):指針定位開銷大。