對象在內存中初始化的過程?

java程序執行過程:

  • Java程序執行時,第一步系統建立虛擬機進程,而後虛擬器用類加載器Class Loader加載java程序類文件到方法區。
  • 類加載完成後,主線程運行static main()時在虛擬機棧中建棧幀,壓棧。java

    執行到new Object()時,在堆heap裏建立對象數組

 
 

對象頭 這個頭包括兩個部分,第一部分用於存儲自身運行時的數據例如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方法開始執行。

下面是執行到每一句代碼的時候對應的內存的分配過程

  1. Computer computer = new Computer();

首先在方法區找是否完成對類信息的加載,若是是的話直接用,否的話先由類加載器加載類信息。進程

局部變量computer放棧中,指向堆中的對象,對象的值爲初始值,以下圖:

二、computer.brand = "聯想";

computer.cpuSpeed = 100;

賦值以下圖(操做對象就是操做對象的地址):

相關文章
相關標籤/搜索