JAVA創(chuàng)建類時(shí)的內(nèi)存變化

<p>Java內(nèi)存分五個(gè)區(qū)域,其中兩個(gè)區(qū)域是線程公有的,分別是堆區(qū)和方法區(qū)(常量池在方法區(qū),jdk1.7之后獨(dú)立出來(lái)),剩下三個(gè)區(qū)域是每個(gè)進(jìn)程都有的:程序計(jì)數(shù)器,虛擬機(jī)棧(線程棧),本地方法棧。(很多虛擬機(jī)會(huì)將虛擬機(jī)棧和本地方法棧合并為一個(gè),本地方法棧是java用來(lái)調(diào)用非java所寫(xiě)的程序用的)。</p>
<p>一個(gè)java程序執(zhí)行時(shí),首先JVM進(jìn)程(包含類加載器class loader和執(zhí)行引擎)被創(chuàng)建,主線程執(zhí)行static main,創(chuàng)建棧幀并壓入虛擬機(jī)棧(虛擬機(jī)棧一個(gè)線程一個(gè)棧),執(zhí)行到new object時(shí),class loader將用到的類文件(class file)加載到方法區(qū),在堆區(qū)創(chuàng)建一個(gè)對(duì)象,并將對(duì)象的引用賦給變量。</p>
ps:<ol>
<li>靜態(tài)變量和靜態(tài)代碼塊放在方法區(qū)內(nèi).</li>
<li>靜態(tài)代碼塊執(zhí)行是在類加載時(shí),先于構(gòu)造函數(shù),但不一定是在程序最開(kāi)始時(shí)加載,一般在第一次調(diào)用時(shí)且執(zhí)行一次(第一次調(diào)用時(shí)才會(huì)加載該類,如果該類包含main方法,會(huì)在程序開(kāi)始時(shí)直接加載,java是動(dòng)態(tài)加載),所以如A a;這樣的語(yǔ)句并不會(huì)執(zhí)行靜態(tài)代碼,代碼執(zhí)行順序:父類靜態(tài)-子類靜態(tài)-父類非靜態(tài)-子類非靜態(tài)。</li>

<li>
Paste_Image.png

虛擬機(jī)對(duì)棧幀會(huì)優(yōu)化,有一部分?jǐn)?shù)據(jù)是重疊的。</li>
<li>這圖很清楚
Paste_Image.png
</li>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容