java程序執行過程:
對象頭 這個頭包括兩個部分,第一部分用於存儲自身運行時的數據例如GC標誌位、哈希碼、鎖狀態等信息。第二部分存放指向方法區類靜態數據的指針。併發
實例變量 存放類的屬性數據信息,包括父類的屬性信息。若是是數組的實例部分還包括數組的長度。這部份內存按4字節對齊。線程
填充數據 這是由於虛擬機要求對象起始地址必須是8字節的整數倍。填充數據不是必須存在的,僅僅是爲了字節對齊。HotSpot VM的自動內存管理要求對象起始地址必須是8字節的整數倍。對象頭自己是8的倍數,當對象的實例變量數據不是8的倍數,便須要填充數據來保證8字節的對齊。另外,堆上對象內存的分配是併發進行的.3d
- 當虛擬機執行到new指令時,它先在常量池中查找「Dog」,看可否定位到Dog類的符號引用;若是能,說明這個類已經被加載到方法區了,則繼續執行。若是沒有,就讓Class Loader先執行類的加載
-
會根據dog這個變量是實例變量、局部變量或靜態變量的不一樣將引用放在不一樣的地方:指針
若是dog局部變量,dog變量在棧幀的局部變量表,這個對象的引用就放在棧幀。orm
若是dog是實例變量,dog變量在堆中,對象的引用就放在堆。對象
若是dog是靜態變量,dog變量在方法區,對象的引用就放在方法區。blog
關於在java中建立對象時內存的分配過程,須要理解下面幾點:
- 局部變量存在棧內存中;
- new 出來的對象存在也堆內存中(類是對象的模板);
- 常量存在於方法區中,方法區也在堆內存中;
- 從main方法開始執行。
下面是執行到每一句代碼的時候對應的內存的分配過程
- Computer computer = new Computer();
首先在方法區找是否完成對類信息的加載,若是是的話直接用,否的話先由類加載器加載類信息。進程
局部變量computer放棧中,指向堆中的對象,對象的值爲初始值,以下圖:
二、computer.brand = "聯想";
computer.cpuSpeed = 100;
賦值以下圖(操做對象就是操做對象的地址):