先上圖:
基于這張圖圆裕,可以這樣回答:
jvm的內(nèi)存模型包含線程共享的方法區(qū)和堆,以及線程私有的虛擬機(jī)棧、本地方法棧和程序計(jì)數(shù)器
方法區(qū):線程共享吨铸,用來(lái)存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息、常量舟奠、靜態(tài)變量房维、JIT(just in time,即時(shí)編譯技術(shù))編譯后的代碼等數(shù)據(jù)。運(yùn)行時(shí)常量池是方法區(qū)的一部分耿戚,用于存放編譯期間生成的各種字面常量和符號(hào)引用。
堆:線程共享坛猪,OOM故障最主要的發(fā)源地皂股,存儲(chǔ)著幾乎所有的實(shí)例對(duì)象,堆由垃圾收集器自動(dòng)回收就斤;通過(guò)參數(shù)-Xms設(shè)定初始值蘑辑、-Xmx設(shè)定最大值。
本地方法棧:線程私有槐秧,為虛擬機(jī)使用到的Native方法服務(wù)忧设。本地方法棧也會(huì)拋出StackOverflowError和OutOfMemoryError異常址晕。
虛擬機(jī)棧:線程私有。它描述的是java方法執(zhí)行的內(nèi)存模型谨垃,每個(gè)方法執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表启搂、操作數(shù)棧、動(dòng)態(tài)鏈接刘陶、方法出口等信息胳赌。
程序計(jì)數(shù)器(Program Counter Register):線程私有,每個(gè)線程獨(dú)立擁有一個(gè)程序計(jì)數(shù)器匙隔,在CPU進(jìn)行上下文切到本線程后疑苫,通過(guò)該計(jì)數(shù)器正確找到要繼續(xù)執(zhí)行的位置,是一塊較小的內(nèi)存空間纷责,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器捍掺。在此內(nèi)存區(qū)域是唯一一個(gè)在JVM規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError情況的區(qū)域。