當new一個物件時在JVM中會有哪些操作
阿新 • • 發佈:2018-12-13
目錄
首先我們瞭解一下虛擬機器(JVM)的記憶體分佈
程式計數器(program count register):當前執行緒所執行的位元組碼的行號指示器(每個執行緒一個計數器,互不影響)
本地方法棧是jvm呼叫作業系統方法所使用的棧。
虛擬機器棧是儲存區域性變量表、操作棧、動態連結、方法出口等資訊
方法區存放了一些常量、靜態變數、類資訊等,可以理解成class檔案在記憶體中的存放位置。
虛擬機器堆是儲存物件和陣列,所有執行緒共享的一塊記憶體區域
類載入機制
JVM把class檔案載入到記憶體,並對資料進行校驗、解析和初始化,最終形成JVM可以直接使用的java型別的全過程。
1、載入
將class檔案位元組碼內容載入到記憶體中,並將這些靜態資料轉換成方法區中的執行時資料結構,在堆中生成一個代表這個類的java.lang.Class物件,作為方法區類資料的訪問入口,這個過程需要類載入器參與
存在繼承時: 原則:先靜後非,先父後子,先塊後器 執行順序如下: 第一步:父類靜態成員變數(方法區) 第二步:父類靜態程式碼塊(多個按照順序執行)注意:根據靜態程式碼塊和變數位置順序初始化變數 第三步:子類靜態成員變數(方法區) 第四步:子類靜態程式碼塊
2、連線
- 驗證:確保Class檔案中位元組流包含的資訊是否符合虛擬機器的要求,保證不會危害虛擬機器自身的安全
- 準備:正式為類變數(static變數)分配記憶體並設定類變數初始值的階段,這些記憶體都將在方法區中進行分配
- 解析:虛擬機器將常量池中的符號引用替換為直接引用的過程
方法區:
-
常量池(Constant Pool):常量池資料編譯期被確定,是Class檔案中的一部分。儲存了類、方法、介面等中的常量,當然也包括字串常量。
-
字串池/字串常量池(String Pool/String Constant Pool):是常量池中的一部分,儲存編譯期類中產生的字串型別資料。
- 執行時常量池(Runtime Constant Pool):方法區的一部分,所有執行緒共享。虛擬機器載入Class後把常量池中的資料放入到執行時常量池。
3、初始化
- 當使用new建立一個物件時,jvm會在堆中分配一個記憶體存放該物件
- 父類成員變數和子類成員變數堆記憶體建立一片記憶體,指向值為null,先父類成員變數顯式初始化(如果有的話)
- 父類程式碼塊(父類成員變數初始化)
- 父類構造器
- 子類成員變數顯式初始化(如果有的話)
- 子類程式碼塊(子類成員變數初始化)
- 子類構造器