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(非堆)
運行時常量池是它的一部分,用于存放編譯期生成的各種字面量和符號引用(?)什么是符號引用?