JAVA創建類時的內存變化

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

<li>
Paste_Image.png

虛擬機對棧幀會優化,有一部分數據是重疊的。</li>
<li>這圖很清楚
Paste_Image.png
</li>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容