? ? jvm五大內(nèi)存區(qū)域(即jvm運行時數(shù)據(jù)區(qū)),描述的是類被加載時蟆肆,經(jīng)過解析后矾睦,存儲到特定的數(shù)據(jù)區(qū)。
方法區(qū):又被稱為永久代炎功,用來存儲類的信息枚冗,例如:方法,方法名蛇损,返回值赁温,常量。
堆:存放new出來的對象信息, 成員變量淤齐,及成員變量股囊。
程序計數(shù)器:指向當(dāng)前線程正在執(zhí)行的行號,用來保證線程切換時回到程序調(diào)用的位置更啄。(例如:在a方法里面掉用了b方法稚疹,代碼從上往下執(zhí)行,執(zhí)行到掉用b方法的那行時祭务,指針會記錄下這個位置内狗,然后執(zhí)行b方法里面的邏輯怪嫌,b方法正常執(zhí)行完或異常退出,指針都會回到a方法里面柳沙。)
本地方法棧:和虛擬機棧類似岩灭,只是它描述的是為虛擬機是用到的Native方法出棧和入棧的過程(通常我們不需要了解這塊,它底層是C語言實現(xiàn)的赂鲤,有興趣的同學(xué)可以了解一下)噪径。
虛擬機棧:描述的是線程進棧出棧的過程,線程結(jié)束內(nèi)存自動釋放蛤袒。它用來存儲當(dāng)前線程運行方法所需要的數(shù)據(jù)熄云、指令、返回地址妙真。(即局部變量和正在調(diào)用的方法)? ? ?方法被調(diào)用時會在棧中開辟一塊叫棧幀的空間,方法運行在棧幀空間中荚守。
如下圖:棧幀的邏輯內(nèi)存圖里面包含局部變量表珍德,操作數(shù)棧,動態(tài)鏈接矗漾,出口...(注意:棧幀里面包含但不僅僅只有這些,?程序員開發(fā)主要是關(guān)注這些 )锈候。??
(局部變量表):?存放該方法的參數(shù)變量,和方法內(nèi)部定義的局部變量敞贡,若該變量為引用類型泵琳,則存的該變量的引用地址。在java文件編譯成.class文件的時候誊役,這個表的容量最大值就確定下來了获列。
(操作數(shù)棧):也稱為表達式棧,通過字節(jié)碼指定把值壓入棧定蛔垢,稍后另一個指令就可以彈出這個值使用击孩。
(動態(tài)鏈接):也稱為常量池。用來保存常量值和符號引用鹏漆。符號引用:A方法在運行時調(diào)用B方法巩梢,就是通過B方法的符號引用去找到B的內(nèi)存地址。)
(出口):描述的就是出棧的過程艺玲。方法的返回有兩種情況括蝠。(正常退出時:根據(jù)方法的定義來決定是否要傳返回值給上層調(diào)用者。異常退出時:則是需要通過異常處理來確定饭聚。無論通過哪種方式退出忌警,都會跳到當(dāng)前方法被調(diào)用的位子。)
總結(jié):方法區(qū)和堆是所有線程共享的若治,而棧和計數(shù)器是線程私有的慨蓝。棧處理程序運行的問題感混,堆處理數(shù)據(jù)的存儲問題。所以才有堆棧分離礼烈。