1. 程式人生 > >Java:JVM 和類

Java:JVM 和類

執行 Java:java 帶有 main 方法的類名 —–>
啟動 JVM 並載入位元組碼
當呼叫 java 命令來執行某個 Java 程式時,該命令將會啟動一個 JVM 程序,同一個 JVM 中的所有執行緒,變數都處於同一程序中,共享該JVM的記憶體區域。
當出現以下情況時,JVM 會退出

    1.當程式正常執行結束
    2.使用 System.exit(0) 方法
    3.出現異常時,沒有捕獲異常
    4.平臺強制結束了JVM程序

JVM程序一旦結束,該程序中記憶體中的資料將會丟失

  當程式主動使用某個類時,如果該類還未被載入進記憶體中,則系統會通過載入 -> 連線 -> 初始化,三個步驟來對該類進行初始化操作。

1.類的載入

類載入時指將類的 class 檔案(位元組碼檔案)載入記憶體中,併為之建立一個 java.lang.Class 物件,稱之為位元組碼物件。
  類的載入過程由類載入器(ClassLoader)完成,類載入器通常由 JVM 提供,稱之為系統類載入器,也可以繼承 ClassLoader 來提供自定義類載入器。不同的類載入器可以實現載入本地位元組碼檔案、jar包中的位元組碼、通過網路載入位元組碼等。

2.類的連線

當類被載入金記憶體之後,系統為之生產一個對應的 Class 物件,接著把類的二進位制數組合併到 JRE 中

    1.驗證:檢測被載入的類是否有正確的內部結構
    2.
準備:負責為類的 static 變數分配記憶體,並設定預設值 3.解析:把類的二進位制資料中的符號引用替換為直接引用

3.類的初始化:

在此階段,JVM 負責對類進行初始化,主要就是對 static 變數進行初始化,
類的初始化包含以下幾個步驟

1.如果該類還未被載入和連線,則程式先載入並連線該類
2.如果該類的直接父類還未被初始化,則先初始化其父類
3.如果類中有初始化語句(靜態程式碼塊),則系統依次執行這些初始化語句

附:符號引用:
符號引用是一個字串,它給出了被引用的內容的名字,並且可能會包含一些其他大於這個被引用項的資訊 –> 這些資訊必須是足以唯一的識別一個類、欄位、方法。這樣,對於其他類的符號引用必須給出此類的全名。