Java虛擬機(jī)結(jié)構(gòu)、內(nèi)存管理相關(guān)基礎(chǔ)知識(shí)(1)

JVM結(jié)構(gòu)體系

jvm由`類加載器子系統(tǒng)`、`運(yùn)行時(shí)數(shù)據(jù)區(qū)`(內(nèi)存空間)、`執(zhí)行引擎`及`本地方法接口`等組成
`運(yùn)行時(shí)數(shù)據(jù)區(qū):`由方法區(qū)、堆、java 棧、PC寄存器、本地方法棧組成

在內(nèi)存空間中方法區(qū)是所有java線程共享的,而java棧本地方法棧、PC寄存器則有每個(gè)線程私有

程序計(jì)數(shù)器(program counter register)

它是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器
字節(jié)碼解釋器通過改變程序計(jì)數(shù)器的值來選擇下一條需要執(zhí)行的字節(jié)碼指令,分支、跳轉(zhuǎn)、循環(huán)等基礎(chǔ)功能都需要依賴它來實(shí)現(xiàn),所以程序計(jì)數(shù)器是線程私有的,各線程間的計(jì)數(shù)器互不影響
當(dāng)線程在執(zhí)行一個(gè)java方法時(shí)(非本地方法),該計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址,當(dāng)線程在執(zhí)行的是native方法時(shí),該計(jì)數(shù)器的值為空。唯一在java虛擬機(jī)規(guī)范中沒有OOM的區(qū)域

Java虛擬機(jī)棧(java stacks)

線程私有,保證線程安全,生命周期與線程相同
java棧由棧幀組成,每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀,調(diào)用方法時(shí)壓入棧幀,方法返回時(shí)彈出棧幀并拋棄
先進(jìn)后出
對于執(zhí)行引擎來說,活動(dòng)線程中只有棧頂?shù)臈怯行У模瑘?zhí)行引擎所運(yùn)行的所有字節(jié)碼指令都只針對當(dāng)前棧幀進(jìn)行操作
java棧的主要任務(wù)是儲(chǔ)存方法參數(shù)、局部變量、中間運(yùn)算結(jié)果,并且提供部分其他模塊工作需要的數(shù)據(jù)

在編譯程序代碼時(shí),棧幀中需要多大的局部變量表、多深的操作數(shù)棧都已經(jīng)完全確定來,并且寫入了方法表的code屬性之中所以程序運(yùn)行期變量數(shù)據(jù)不會(huì)影響棧幀內(nèi)存大小,僅僅取決于具體的虛擬機(jī)實(shí)現(xiàn)。
在java虛擬機(jī)規(guī)范中,棧會(huì)拋出2種異常情況

  • 1、如果線程請求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverFlowerError異常
  • 2、如果虛擬機(jī)在動(dòng)態(tài)擴(kuò)展棧時(shí)無法申請到足夠的內(nèi)存空間,則拋出OutOfMemoryError異常

本地方法棧(native method stacks)

與java棧作用類似,java棧為虛擬機(jī)執(zhí)行java方法服務(wù),本地方法棧則為使用到的本地操作系統(tǒng)(native)方法服務(wù)

Java堆(Heap)

所有線程共享的一塊內(nèi)存區(qū)域。幾乎所有的對象實(shí)例數(shù)組都在這類分配內(nèi)存
java堆可以處理在物理上不連續(xù)的內(nèi)存空間 中 ,只要是邏輯上是連續(xù)就可以
如果在堆中沒有內(nèi)存可分配時(shí),并且堆也無法擴(kuò)展時(shí),將會(huì)拋出OutOfMemoryError異常

方法區(qū)(method area)

各個(gè)線程共享的內(nèi)存區(qū)域
用于存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)常量 ,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。和java heap一樣不需要連續(xù)的內(nèi)存,可以選擇固定大小或可擴(kuò)展
虛擬機(jī)規(guī)范允許該區(qū)域可以選擇不實(shí)現(xiàn)垃圾回收
根據(jù)java虛擬機(jī)規(guī)范,當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常

類加載機(jī)制

類的整個(gè)生命周期包括:加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用和卸載七個(gè)階段
類加載的過程包括了:加載->驗(yàn)證->準(zhǔn)備 ->解析-> 初始化
順序開始,而不是按順序進(jìn)行完成,通常都是互相交叉地混合進(jìn)行,在一個(gè)階段執(zhí)行的過程中調(diào)用激活另一個(gè)階段

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 此文為我在學(xué)習(xí)《深入理解Java虛擬機(jī):JVM高級特性與最佳實(shí)踐》時(shí)所做的筆記,把我認(rèn)為是重點(diǎn)、面試時(shí)可能會(huì)被問到...
    CyanStone閱讀 1,254評論 0 3
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,282評論 0 2
  • 第6章類文件結(jié)構(gòu) 6.1 概述 6.2 無關(guān)性基石 6.3 Class類文件的結(jié)構(gòu) java虛擬機(jī)不和包括java...
    kennethan閱讀 1,070評論 0 2
  • 1. 安裝MySQL 執(zhí)行命令: 另外可選mysql-client和libmysqlclient-dev然后通過 ...
    ZzzsWszzZ閱讀 503評論 0 0
  • 2017/11/28/北風(fēng) 今天十月初十,我生日。 許是愈加奔波忙碌,對生日一直無可無不可的我,突發(fā)奇想跑到朋友圈...
    呆呆淺藍(lán)閱讀 1,114評論 1 2

友情鏈接更多精彩內(nèi)容