W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
JVM 運行時會有幾個運行時數(shù)據(jù)區(qū)域,如下圖所示。
線程私有內(nèi)存,保存當前線程所執(zhí)行的字節(jié)碼的行號指示器,這里和計算機組成原理中的計數(shù)器不太一樣,計組中的 PC 指的是下一條要執(zhí)行的指令的地址。JVM 中常有多個線程執(zhí)行,故每條線程都需要有一個獨立的程序計數(shù)器。
如果線程執(zhí)行的是 Java 方法,哪兒計數(shù)器記錄的就是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;如果執(zhí)行的是 Native 方法,這個計數(shù)器則為空。
P.S. 這塊內(nèi)存無OutOfMemoryError
線程私有,虛擬機棧描述的是 Java 方法執(zhí)行的內(nèi)存模型,每個方法在執(zhí)行時會創(chuàng)建一個棧幀,棧幀中保存有局部變量表、操作數(shù)棧、動態(tài)鏈接和方法出口等。粗略來講 Java 內(nèi)存區(qū)分為堆和棧,實際上『棧』指的往往是虛擬機棧中的局部變量表部分。
局部變量表中存放了編譯期可知的各種基本數(shù)據(jù)類型、對象引用類型和 returnAddress 類型。方法運行期間局部變量表大小不變。
和虛擬機棧類似,不過區(qū)別在于虛擬機棧為 Java 方法(字節(jié)碼)服務(wù),而本地方法棧為 Native 方法服務(wù)(類似 C 語言中的棧)。具體實現(xiàn)可將這兩者合二為一。
堆是被所有線程共享的一塊內(nèi)存區(qū)域。一般來說所有的對象實例和數(shù)組都要在堆上分配,但一些優(yōu)化技術(shù)導(dǎo)致不一定所有對象實例都在堆上分配。
各線程共享的一塊內(nèi)存區(qū)域,和操作系統(tǒng)中進程中的『文本段』有些類似,用于存儲虛擬機加載的類信息、常量、靜態(tài)常量和即時編譯器編譯后的代碼數(shù)據(jù)等。
這一部分是方法區(qū)的一部分,用于保存 Class 文件中編譯期生成的字面值和符號引用。
這一部分并不是虛擬機運行時的數(shù)據(jù)區(qū)域,用于 Native 函數(shù)分配堆外內(nèi)存,提高性能用(不必在操作系統(tǒng)堆和 Java 堆復(fù)制數(shù)據(jù))。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: