Java當中的JVM

JAVA一方發表於2020-01-09

01 

在使用控制皮膚時的實質: Java當中的JVM


Hello.java使用javac,然後變成為Hello.class通過執行java這個命令,在類載入器中(含有載入,驗證,準備,解析,初始化,使用,解除安裝),到jvm為Java虛擬機器中執行,在jvm中有方法區,堆記憶體,執行緒棧,本地方法棧,PC計數器。 

類載入器: 

  1. 載入, 
  2. 驗證,
  3. class檔案的版本是否能相容當前的Java虛擬機器版本,然後class檔案要滿足虛擬機器的規範。 準備,需要準備什麼呢?就是要進行類成員的初始化為初始值,其中為final修飾的類變數除外,final變數就直接初始化為變數值,而類成員不一樣。 
  4. 解析,什麼是解析呢?就是把符號引用解析為直接引用,就是我們變數xxx,這種代表變為直接引用,什麼是直接引用呢?就是記憶體地址,如我們常見的xxx0203r0e,這種。 
  5. 初始化,把關於static修飾的變數或者是static靜態程式碼塊按照順序組成構造器進行初始化變數。 使用,
  6.  解除安裝 

JVM 複製程式碼

JVM: 方法區(儲存所有類的資訊,通過常量池來儲存生成所有類資訊的物件),堆記憶體,執行緒棧,本地方法棧,計數器。

 // 在控制皮膚中,反編譯
javap -c xxx 
就是將位元組碼反編譯為位元組碼的指令輸出
public class Hello{
 public Hello();
 Code:
 0: aload_0
 1: invokespecial #1
 4: return
 public static void main(java.lang.String[]);
 ...
} 複製程式碼

把程式放進jvm中執行,到執行緒棧中執行,主方法main(主執行緒),線上程棧中執行如果有遇到new物件關鍵字時,main這個主執行緒就會在自己的記憶體中(執行緒棧)宣告一個的物件(物件的引用指向堆記憶體中開闢的物件),Hello hello;在jvm中有個堆記憶體,就會申請一片空間記憶體地址,即建立一個物件,例項變數,例項方法從方法區中指向堆記憶體。 

public class Hello{
 public static void main(String[] args){
 Hello hello = new Hello();
 // 物件的宣告 和 建立物件
 }
}複製程式碼

 類載入到虛擬機器中:

public class Demo
 static {
 System.out.println("靜態程式碼塊");
 }
 {
 System.out.println("普通程式碼塊");
 }
 public Demo(){
 System.out.println("構造方法");
 }
 public static void main(String[] args){
 new Demo();
 }
}
// 結果
靜態程式碼塊
普通程式碼塊
構造方法
// 載入 驗證 準備 解析 初始化 使用 解除安裝
Demo.java -> Demo.class -> 載入進入虛擬機器中,類載入器 
(驗證類資訊,元素資訊,版本,位元組碼,準備,初始化類變數,解析把符號引用解析為直接引用,
進行初始化就是把static變數和static靜態程式碼塊進行初始化變數) 複製程式碼

步驟: 

 在堆記憶體中執行的順序就是載入例項資訊,然後在進行構造方法。複製程式碼

 02 

瞭解static案例 

 

// 父類
public class F
 static {
 System.out.println("F靜態程式碼塊");
 }
 {
 System.out.println("F普通程式碼塊");
 }
 public F(){
 System.out.println("F構造方法");
 }
}
// 子類
public class S extends F
 static {
 System.out.println("S靜態程式碼塊");
 }
 {
 System.out.println("S普通程式碼塊");
 }
 public S(){
 super(); // 預設的
 System.out.println("S構造方法");
 }
}
// 測試
public class Demo
 public static void main(String[] args){
 // 建立子類物件
 new S();
 }
}
// 結果
F靜態程式碼塊
S靜態程式碼塊
F普通程式碼塊
F構造方法
S普通程式碼塊
S構造方法複製程式碼

程式進入JVM中的方法區,子類繼承父類,父類進行載入例項資訊進入到開闢的記憶體中,然後執行完再執行構造方法,在堆記憶體中new一個物件,new S(); 在子類的構造方法中會有預設的super(),載入父類,如果子類呼叫預設呼叫super(),而父類沒有無參的構造方法,而是有參的構造方法,那麼就要自己新增,在super(xxx)中。

 ————————————————

 版權宣告:本文為CSDN博主「Java架構閒談」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/qiyue683209/article/details/85236114



相關文章