java虛擬機的主要組成部分;
java的虛擬機的內(nèi)存結(jié)構(gòu)主要有四個部分,分別是:
1、java堆
2、方法區(qū)
3、棧
4、程序計數(shù)器
各個組成部分說明;
一、java堆
對于大多數(shù)應(yīng)用來說,Java堆是java虛擬機所管理的內(nèi)存中最大的一塊,線程共享,是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建,主要是存放對象實例,幾乎所有對象實例都在這里分配內(nèi)存;java堆又可以分為新生代和老年代,新生代和老年代的內(nèi)存比例默認(rèn)為1:2,新生代中又分三個部分,1個Eden區(qū)和2個Survivor區(qū)(分別叫from和to),內(nèi)存比例默認(rèn)為8:1:1。一般情況下,新創(chuàng)建的對象都會被分配到Eden區(qū),這些對象經(jīng)過第一次垃圾回收后,如果仍然存活,將會被移到Survivor區(qū)。對象在Survivor區(qū)中每熬過一次垃圾回收,年齡就會增加1歲,當(dāng)它的年齡增加到一定程度時,就會被移動到年老代中。
二、方法區(qū)
用于存儲虛擬機加載的類信息、常量、靜態(tài)變量, 屬于共享內(nèi)存區(qū)域,又稱為永久區(qū)。
三、棧
1、虛擬機棧
線程私有,生命周期和線程一致。描述的是 Java 方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行時都會床創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每一個方法從調(diào)用直至執(zhí)行結(jié)束,就對應(yīng)著一個棧幀從虛擬機棧中入棧到出棧的過程。
2、本地方法棧
區(qū)別于 Java 虛擬機棧的是,Java 虛擬機棧為虛擬機執(zhí)行 Java 方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機使用到的 Native 方法服務(wù)。
四、程序計數(shù)器
用于標(biāo)識當(dāng)前線程執(zhí)行胡字節(jié)碼文件的行號指示器,多線程情況下,每個線程都具有各自獨立胡程序計數(shù)器,該區(qū)域是非線程共享的內(nèi)存區(qū)域。字節(jié)碼解釋器工作是就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行指令的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴計數(shù)器完成。如果線程正在執(zhí)行一個 Java 方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;如果正在執(zhí)行的是 Native 方法,這個計數(shù)器的值則為 (Undefined)。