java虛擬機(jī)的主要組成部分;
java的虛擬機(jī)的內(nèi)存結(jié)構(gòu)主要有四個部分俺附,分別是:
1肥卡、java堆
2、方法區(qū)
3事镣、棧
4步鉴、程序計數(shù)器
各個組成部分說明;
一璃哟、java堆
對于大多數(shù)應(yīng)用來說氛琢,Java堆是java虛擬機(jī)所管理的內(nèi)存中最大的一塊,線程共享随闪,是被所有線程共享的一塊內(nèi)存區(qū)域阳似,在虛擬機(jī)啟動時創(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ū)
用于存儲虛擬機(jī)加載的類信息荠藤、常量、靜態(tài)變量获高, 屬于共享內(nèi)存區(qū)域哈肖,又稱為永久區(qū)。
三念秧、棧
1淤井、虛擬機(jī)棧
線程私有,生命周期和線程一致摊趾。描述的是 Java 方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行時都會床創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表币狠、操作數(shù)棧、動態(tài)鏈接砾层、方法出口等信息漩绵。每一個方法從調(diào)用直至執(zhí)行結(jié)束,就對應(yīng)著一個棧幀從虛擬機(jī)棧中入棧到出棧的過程肛炮。
2止吐、本地方法棧
區(qū)別于 Java 虛擬機(jī)棧的是,Java 虛擬機(jī)棧為虛擬機(jī)執(zhí)行 Java 方法(也就是字節(jié)碼)服務(wù)侨糟,而本地方法棧則為虛擬機(jī)使用到的 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í)行的虛擬機(jī)字節(jié)碼指令的地址澜倦;如果正在執(zhí)行的是 Native 方法,這個計數(shù)器的值則為 (Undefined)杰妓。