<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>

虛擬機(jī)對(duì)棧幀會(huì)優(yōu)化,有一部分?jǐn)?shù)據(jù)是重疊的。</li>
<li>這圖很清楚
