學過C語言的朋友都知道C編譯器在劃分內(nèi)存區(qū)域的時候經(jīng)常將管理的區(qū)域劃分為數(shù)據(jù)段和代碼段,數(shù)據(jù)段包括堆、棧以及靜態(tài)數(shù)據(jù)區(qū)。那么在Java語言當中,內(nèi)存又是如何劃分的呢?
由于Java程序是交由JVM執(zhí)行的,所以我們在談Java內(nèi)存區(qū)域劃分的時候事實上是指JVM內(nèi)存區(qū)域劃分。在討論JVM內(nèi)存區(qū)域劃分之前,先來看一下Java程序具體執(zhí)行的過程:
如上圖所示,首先Java源代碼文件(.java后綴)會被Java編譯器編譯為字節(jié)碼文件(.class后綴),然后由JVM中的類加載器加載各個類的字節(jié)碼文件,加載完畢之后,交由JVM執(zhí)行引擎執(zhí)行。在整個程序執(zhí)行過程中,JVM會用一段空間來存儲程序執(zhí)行期間需要用到的數(shù)據(jù)和相關(guān)信息,這段空間一般被稱作為Runtime Data Area(運行時數(shù)據(jù)區(qū)),也就是我們常說的JVM內(nèi)存。因此,在Java中我們常常說到的內(nèi)存管理就是針對這段空間進行管理(如何分配和回收內(nèi)存空間)。
在知道了JVM內(nèi)存是什么東西之后,下面我們就來討論一下這段空間具體是如何劃分區(qū)域的,是不是也像C語言中一樣也存在棧和堆呢?
一.運行時數(shù)據(jù)區(qū)包括哪幾部分?
根據(jù)《Java虛擬機規(guī)范》的規(guī)定,運行時數(shù)據(jù)區(qū)通常包括這幾個部分:程序計數(shù)器(Program Counter Register)、Java棧(VM Stack)、本地方法棧(Native Method Stack)、方法區(qū)(Method Area)、堆(Heap)。
如上圖所示,JVM中的運行時數(shù)據(jù)區(qū)應(yīng)該包括這些部分。在JVM規(guī)范中雖然規(guī)定了程序在執(zhí)行期間運行