java運行時數(shù)據(jù)區(qū)域:
1.程序計數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器;
2.java虛擬機棧:每個方法執(zhí)行時都會創(chuàng)建一個棧幀诫欠,存儲局部變量表强霎,操作數(shù)棧,動態(tài)鏈接陡鹃,方法出口等信息磷蛹。另外在線程請求棧深度大于jvm允許時會拋出stackoverflow異常(無限遞歸);
3.本地方法棧:和虛擬機棧功能類似吮旅,只是本地方法棧為natve方法服務(wù);
4.java堆:java虛擬機管理的內(nèi)存中的最大的一塊,被所有線程共享味咳,存放對象實例庇勃。是gc的主要區(qū)域;
5.方法區(qū):各線程共享,存儲已被虛擬機加載的類信息&常量&靜態(tài)變量&即時編輯器編譯后的代碼槽驶。Hotspot虛擬機上责嚷,使用永久代來實現(xiàn)方法區(qū)(java8之前);
6.運行時常量池:方法區(qū)的一部分,存放編譯期生成的各種字面量和符號引用掂铐,具有動態(tài)性(除了編譯期的常量外罕拂,運行期間也會有新常量鍵入);
7.直接內(nèi)存揍异,不是jvm運行的數(shù)據(jù)區(qū)域和內(nèi)存區(qū)域,但是也被頻繁使用并會出現(xiàn)OOM聂受。堆外內(nèi)存可以直接分配使用內(nèi)存蒿秦,提高效率烤镐,比如NIO蛋济。
總結(jié):java運行時數(shù)據(jù)區(qū)域包括程序計數(shù)器,java棧(包括虛擬機棧和本地方法棧)炮叶,java堆碗旅,方法區(qū)(包括運行時常量池)。程序計數(shù)器保存當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器.java棧是線程私有的镜悉,保存局部變量表&操作數(shù)棧&動態(tài)鏈接&方法出口等信息祟辟。java堆是線程共享的,保存對象實例侣肄,對應(yīng)新生代和老年代旧困。方法區(qū)也是線程共享的,保存加載類信息&常量&靜態(tài)變量&即時編輯器編譯后的代碼稼锅,對應(yīng)永久代(Hotspot中)吼具。另外NIO等方法可以直接分配堆外內(nèi)存,提高效率矩距。