<p>Java內存分五個區域,其中兩個區域是線程公有的,分別是堆區和方法區(常量池在方法區,jdk1.7之后獨立出來),剩下三個區域是每個進程都有的:程序計數器,虛擬機棧(線程棧),本地方法棧。(很多虛擬機會將虛擬機棧和本地方法棧合并為一個,本地方法棧是java用來調用非java所寫的程序用的)。</p>
<p>一個java程序執行時,首先JVM進程(包含類加載器class loader和執行引擎)被創建,主線程執行static main,創建棧幀并壓入虛擬機棧(虛擬機棧一個線程一個棧),執行到new object時,class loader將用到的類文件(class file)加載到方法區,在堆區創建一個對象,并將對象的引用賦給變量。</p>
ps:<ol>
<li>靜態變量和靜態代碼塊放在方法區內.</li>
<li>靜態代碼塊執行是在類加載時,先于構造函數,但不一定是在程序最開始時加載,一般在第一次調用時且執行一次(第一次調用時才會加載該類,如果該類包含main方法,會在程序開始時直接加載,java是動態加載),所以如A a;這樣的語句并不會執行靜態代碼,代碼執行順序:父類靜態-子類靜態-父類非靜態-子類非靜態。</li>
Paste_Image.png
虛擬機對棧幀會優化,有一部分數據是重疊的。</li>
<li>這圖很清楚
Paste_Image.png