溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中內(nèi)存區(qū)域與對象的概念和作用

發(fā)布時間:2021-06-25 10:34:44 來源:億速云 閱讀:124 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“Java中內(nèi)存區(qū)域與對象的概念和作用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java中內(nèi)存區(qū)域與對象的概念和作用”吧!

1、Java虛擬機包含以下幾個運行時數(shù)據(jù)區(qū)域:程序計數(shù)器、Java虛擬機棧、本地方法棧、Java堆、方法區(qū)。

2、程序計數(shù)器

1)在虛擬機的概念模型里,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等都需要依賴計數(shù)器來完成;

2)為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個獨立的程序計數(shù)器,各條線程之間計數(shù)器互不影響,獨立存儲,因此是線程獨立的;

3)如果正在執(zhí)行一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;如果正在執(zhí)行的是Native方法,,這個計數(shù)器的值則為空;

4)此內(nèi)存區(qū)域是唯一一個在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

3、Java虛擬機棧

1)線程私有,生命周期與線程相同;

2)描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法執(zhí)行時都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息,每個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機棧中入棧到出棧的過程;

3)兩種異常:StackOverflowError和OutOfMemoryError。

4、本地方法棧

1)與虛擬機棧作用相似,區(qū)別是虛擬機棧為虛擬機執(zhí)行Java方法服務(wù),而本地方法棧為虛擬機使用到的Native方法服務(wù);

2)兩種異常:StackOverflowError和OutOfMemoryError。

5、Java堆

1)所有線程共享,存放對象實例和數(shù)組;

2)Java堆是垃圾收集器管理的主要區(qū)域;

3)Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上連續(xù)即可;

4)如果沒有內(nèi)存完成實例分配,并且堆也無法擴展時,將拋出OutOfMemoryError異常。

6、方法區(qū)

1)所有線程共享,存放被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù);

2)JDK1.8仍然保留方法區(qū)的概念,只不過實現(xiàn)方式不同,取消永久代,方法存放于元空間(Metaspace),元空間仍然與堆不相連,但與堆共享物理內(nèi)存,邏輯上可認(rèn)為在堆中;

3)無法滿足內(nèi)存分配需求時,將拋出OutOfMemoryError異常。

7、使用new創(chuàng)建對象的過程

1)類加載檢查。首先檢查這個指令的參數(shù)是否能在常量池中定位到一個符號引用,并檢查這個符號引用代表的類是否已經(jīng)被加載、解析和初始化,如果沒有,則必須執(zhí)行類加載過程;

2)分配內(nèi)存。兩種分配方式:指針碰撞和空閑列表。指針碰撞要求Java堆內(nèi)存是絕對規(guī)整的,空閑列表允許Java堆不規(guī)整。采用那種方法取決于采用的垃圾收集器。

3)考慮并發(fā)問題。兩種方案:一種是CAS+失敗重試保證原子性,另一種是本地線程分配緩沖(TLAB),事先給每個線程分配一小塊內(nèi)存,分配完了才需要同步鎖定。

4)初始化零值。保證對象的實例字段在Java代碼中不賦初值就可以直接使用。

5)設(shè)置對象信息。例如對象是哪個類的實例、如何才能找到類的元數(shù)據(jù)信息、對象的哈希碼、對象的GC分代年齡等信息。這些信息存放在對象頭中。

6)執(zhí)行<init>方法。

8、對象的內(nèi)存布局

1)3塊區(qū)域:對象頭、實例數(shù)據(jù)、對齊填充;

2)對象頭:包含兩部分信息,一部分用于存儲自身的運行時數(shù)據(jù),如哈希碼、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向鎖線程ID、偏向時間戳等,另一部分是類型指針,指向它的類元數(shù)據(jù)的指針。

3)實例數(shù)據(jù):是一個對象真正存儲的有效信息。

4)對齊填充:并不是必然存在的,由于HotpotVM的自動內(nèi)存管理系統(tǒng)要求對象起始地址必須是8字節(jié)的整數(shù)倍,因此沒有對齊的部分需要通過填充來補全。

9、對象的訪問定位:主流的訪問方式有使用句柄和直接指針兩種,HotSpt采用的第二種方式訪問對象。

感謝各位的閱讀,以上就是“Java中內(nèi)存區(qū)域與對象的概念和作用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java中內(nèi)存區(qū)域與對象的概念和作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)
AI