1. 程式人生 > >當new一個物件時在JVM中會有哪些操作

當new一個物件時在JVM中會有哪些操作

目錄

類載入機制

1、載入

2、連線 

3、初始化

首先我們瞭解一下虛擬機器(JVM)的記憶體分佈

     程式計數器(program count register):當前執行緒所執行的位元組碼的行號指示器(每個執行緒一個計數器,互不影響)

     本地方法棧是jvm呼叫作業系統方法所使用的棧。

     虛擬機器棧是儲存區域性變量表、操作棧、動態連結、方法出口等資訊

     方法區存放了一些常量、靜態變數、類資訊等,可以理解成class檔案在記憶體中的存放位置。

     虛擬機器堆是儲存物件和陣列,所有執行緒共享的一塊記憶體區域

類載入機制

JVM把class檔案載入到記憶體,並對資料進行校驗、解析和初始化,最終形成JVM可以直接使用的java型別的全過程。

1、載入

class檔案位元組碼內容載入到記憶體中,並將這些靜態資料轉換成方法區中的執行時資料結構,在中生成一個代表這個類的java.lang.Class物件,作為方法區類資料的訪問入口,這個過程需要類載入器參與

存在繼承時: 原則:先靜後非,先父後子,先塊後器 執行順序如下: 第一步:父類靜態成員變數(方法區) 第二步:父類靜態程式碼塊(多個按照順序執行)注意:根據靜態程式碼塊和變數位置順序初始化變數 第三步:子類靜態成員變數(方法區) 第四步:子類靜態程式碼塊

2、連線 

  • 驗證:確保Class檔案中位元組流包含的資訊是否符合虛擬機器的要求,保證不會危害虛擬機器自身的安全
  • 準備:正式為類變數(static變數)分配記憶體並設定類變數初始值的階段,這些記憶體都將在方法區中進行分配
  • 解析:虛擬機器將常量池中的符號引用替換為直接引用的過程

 方法區:

  1. 常量池(Constant Pool):常量池資料編譯期被確定,是Class檔案中的一部分。儲存了類、方法、介面等中的常量,當然也包括字串常量。

  2. 字串池/字串常量池(String Pool/String Constant Pool):是常量池中的一部分,儲存編譯期類中產生的字串型別資料。

  3. 執行時常量池(Runtime Constant Pool):方法區的一部分,所有執行緒共享。虛擬機器載入Class後把常量池中的資料放入到執行時常量池。

3、初始化

  1. 當使用new建立一個物件時,jvm會在堆中分配一個記憶體存放該物件
  2. 父類成員變數和子類成員變數堆記憶體建立一片記憶體,指向值為null,先父類成員變數顯式初始化(如果有的話)
  3. 父類程式碼塊(父類成員變數初始化
  4. 父類構造器
  5. 子類成員變數顯式初始化(如果有的話)
  6. 子類程式碼塊(子類成員變數初始化
  7. 子類構造器