Java生命周期即是Java程序的生存期,由編譯、裝載、鏈接、初始化、使用和卸載六個階段組成。在Java程序的生命周期中,它會經歷六大狀態,包括:
public class LifeCycleDemo { // 程序的全局變量 public static String GLOBAL_VARIABLE = "Hello World!"; // 構造函數 public LifeCycleDemo() { System.out.println("構造函數"); } // 靜態代碼塊 static { System.out.println("靜態代碼塊"); } // 實例代碼塊 { System.out.println("實例代碼塊"); } // 程序的入口函數 public static void main(String[] args) { System.out.println("程序的入口函數"); LifeCycleDemo demo = new LifeCycleDemo(); demo.sayHello(); } // 具體業務邏輯1 public void sayHello() { System.out.println("具體業務邏輯1:" + GLOBAL_VARIABLE); } // 具體業務邏輯2 public void sayHello(String str) { System.out.println("具體業務邏輯2:" + str); } }
下面依次介紹Java生命周期的六個階段和狀態:
1. 編譯
Java源代碼 → Java字節碼
在Java程序中,首先需要將編寫的Java源代碼通過編譯器轉換成字節碼文件。
2. 裝載
Java字節碼 → JVM內存區(方法區、堆區、虛擬機棧、本地方法棧)
在Java程序運行時,會將編譯后的字節碼文件通過類裝載器(ClassLoader)裝載到JVM的內存區域中。其中方法區存儲程序中常量池和類級別的變量(靜態變量),堆區存儲對象實例和數組等動態開辟的內存,而虛擬機棧和本地方法棧分別存儲方法的局部變量和操作數棧等信息。
3. 鏈接
驗證字節碼文件 + 準備全局變量 + 解析符號引用
JVM在將字節碼文件加載到內存區之后還需要進行鏈接階段的處理,主要包括三個部分,即驗證字節碼文件格式的正確性、準備全局變量的空間和解析符號引用。
4. 初始化
按照程序初始化順序統一賦初值
在初始化階段,JVM會按照程序中各個類依賴的順序,統一給程序的全局變量和靜態變量賦初值。如果在程序中有靜態代碼塊或實例代碼塊,也會在這個階段執行。
5. 使用
調用具體業務邏輯
經歷完初始化階段后,Java程序便處于可以使用的狀態,即完成用戶要求的具體業務邏輯。在本例中,調用了說Hello的具體業務邏輯方法。
6. 卸載
回收已使用內存空間
當Java程序運行結束或程序崩潰時,會進行卸載階段的處理,即釋放已使用的內存空間,并回收不再使用的資源。