Java運行時數(shù)據(jù)區(qū)域

Java運行時數(shù)據(jù)區(qū)域

分為方法區(qū)、堆、虛擬機棧、本地方法棧、程序計數(shù)器五部分。
其中方法區(qū)和堆是線程共享的,虛擬機棧、本地方法棧、程序計數(shù)器是線程獨占的。
下面分別來解釋一下這幾個區(qū)域:

程序計數(shù)器

程序計數(shù)器記錄線程執(zhí)行到那個位置了,這樣在進行線程切換時就可以接著上次執(zhí)行的位置繼續(xù)執(zhí)行。

虛擬機棧

有時人們常把java內(nèi)存區(qū)域劃分為堆和棧,雖然這種粗略的劃分不精確,但這里的棧就是指的虛擬機棧。
它也是線程獨享的,即每個線程都有自己的虛擬機棧。包括局部變量表、操作數(shù)棧等
當(dāng)java方法執(zhí)行時就會請求一片虛擬機棧用于保存方法的局部變量等。局部變量表保存方法的基本類型數(shù)據(jù)(byte,short,char,int,long,boolean,float,double)和引用(reference)。這些都是在編譯期間就知道大小的。
異常:線程請求的棧深度大于虛擬機運行的深度,StackOverflowError
棧是可以擴展大小的,擴展時無法申請到足夠的空間,OutOfMemoryError

本地方法棧

與虛擬機棧類似,只不過是用于native的方法的棧。

保存對象的地方,內(nèi)存大小最大。
分為新生代和老年代。新生代又分為Eden空間,F(xiàn)rom Survivor空間、To Survivor空間。
堆的大小是可擴展的,通過參數(shù)-Xmx和Xms控制。
以后將要討論的回收算法也是針對這個區(qū)域的。

方法區(qū)

是線程間共享的,用于存儲類信息、常量、靜態(tài)變量等。別名Non-Heap(非堆)
運行時常量池是它的一部分,用于存放編譯期生成的各種字面量和符號引用(?)什么是符號引用?

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

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

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