運行時數(shù)據(jù)區(qū)
線程共享的數(shù)據(jù)區(qū):堆碑幅、方法區(qū)
線程隔離的數(shù)據(jù)區(qū):虛擬機棧檐盟、本地方法棧都许、程序計數(shù)器
1.堆
堆是虛擬機管理的內(nèi)存中最大的一塊稻薇,在虛擬機啟動時創(chuàng)建。用于存放對象實例胶征。如果在堆中沒有內(nèi)存完成實例分配颖低,并且堆也無法再擴展時,將會拋出 OutOfMemoryError 異常弧烤。
2.方法區(qū)
用于存儲虛擬機加載的類信息、常量蹬敲、靜態(tài)變量暇昂、即時編譯器編譯后的代碼等數(shù)據(jù)。其中有常量池伴嗡。這個區(qū)域的內(nèi)存回收目標主要是針對常量池的回收和對類型的卸載急波。
3.程序計數(shù)器
它的作用可以看做是當前線程所執(zhí)行的字節(jié)碼的行號指示器。分支瘪校、循環(huán)澄暮、跳轉(zhuǎn)、異常處理阱扬、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個計數(shù)器來完成泣懊。該區(qū)域線程私有,所以CPU在線程之間切換時麻惶,能夠記住執(zhí)行到哪一步了馍刮。
4.java虛擬機棧
線程私有的,它的生命周期與線程相同窃蹋。每個方法執(zhí)行的時候創(chuàng)建一個棧幀卡啰,其中包含了局部變量表静稻、操作 棧、動態(tài)鏈接匈辱、方法出口等信息振湾。每一個方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機棧中從入棧到出棧的過程亡脸。
如果線程請求的棧深度大于虛擬機所允許的深度押搪,將拋出 StackOverflowError 異常
如果虛擬機棧擴展時無法申請到足夠的內(nèi)存時會拋出 OutOfMemoryError 異常。
5.本地方法棧
本地方法棧則是為虛擬機使用到的 Native方法服務(wù)梗掰。native方法稱為本地方法魁袜。在java源程序中以關(guān)鍵字“native”聲明,不提供函數(shù)體涎显。其實現(xiàn)使用C/C++語言在另外的文件中編寫哄褒,編寫的規(guī)則遵循Java本地接口的規(guī)范(簡稱JNI)。簡而言就是Java中聲明的可調(diào)用的使用C/C++實現(xiàn)的方法埂陆。
兩種訪問方式如下:
Java 堆中將會劃分出一塊內(nèi)存來作為句柄池苛白,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實例數(shù)據(jù)和類型數(shù)據(jù)各自的具體地址信息焚虱。
Java 堆對象的布局中就必須考慮如何放置訪問類型數(shù)據(jù)的相關(guān)信息购裙,reference 中直接存儲的就是對象地址。