java虚拟机1.7_《Java虚拟机原理》7.1 精选 —— 总览
1.一個程序在 JVM 中運行的完整流程
java程序執行流程.JPG
說明:
① 類加載器把字節碼加載到方法區
② 方法區的字節碼被 JVM new,在堆內存中生成字節碼對象
③ 字節碼對象被 GC 的要求有:該類沒有在其他任何地方被引用;該類的所有的實例對象都已被 GC;該類的類加載器的實例已被 GC
2.Java 虛擬機的生命周期
JVM 的生命周期可以分為啟動、運行、退出。
(1) 啟動
JVM 的啟動過程是類加載,通過類加載器把二進制字節碼加載到 JVM。
類加載器采用雙親委派模型, 其類型有 3 種:
① Bootstrap ClassLoader 啟動類加載器:負責加載系統類和 /lib 目錄的 jar 和類,例如 String
② ExtClassLoader 擴展類加載器:負責加載 /lib/ext 目錄下的 jar 和類
③ AppClassLoader 應用程序類加載器:負責加載當前應用 ClassPath 的 jar 和類
④ UserDefinedClassLoader 用戶自定義加載器:負責加載用戶自定義的 jar 和類
示例如下,執行 main 方法,需要加載 Test01。根據雙親委派模型即向上檢查、向下加載,JVM 從 AppClassLoader、ExtClassLoader 到 Bootstrap ClassLoader 檢查和加載 Test01。Test01 是用戶自定義類,Test01 沒有指定父類即默認父類是 Object 類,被
AppClassLoader 加載。
public class Test01 {
public static void main(String[] args) {
System.out.println("123");
}
}
類的生命周期:
① 加載:通過全類名獲取該類的二進制字節流、將字節流所代表的靜態存儲結構轉換為方法區的運行時數據結構、在內存中生成一個代表該類的 Class 對象(方法區數據的訪問入口);
② 驗證:驗證文件格式、字節碼驗證、魔數驗證
③ 準備:分配內存給類變量,并設置類變量初始值。如果是基本數據類型,就會給他們設置默認值;
④ 解析:將常量池內的符號引用替換為直接引用
⑤ 初始化:new 指令、getstatic 指令、putstatic 指令、invokestatic 指令、 java.lang.reflect 的反射等
⑥ 使用:用戶程序使用
⑦ 卸載:該類的所有的實例對象都已被GC、該類沒有在其他任何地方被引用、該類的類加載器的實例已被GC
(2) 運行
一個JVM 進程的運行,實際上是 Java 程序的運行。當程序運行結束后,JVM 進程也就結束。
JVM 的守護線程:
Java 有 2 種進程,User Thread 用戶線程、Daemon Thread 守護線程。例如,用戶線程是指用戶自定義的 main 函數,而守護線程是服務于用戶線程的,例如 GC 垃圾回收線程。兩種線程的生命周期是一致的,前者優先級高于后者的。
(3)退出
JVM 的退出有多種場景,如下所示。
① 程序正常結束運行
② 程序中調用 System.exit() 等方法
③ 程序運行過程中,遇到異常錯誤終止
④ 操作系統、硬件原因導致 JVM 進程被結束
總結
以上是生活随笔為你收集整理的java虚拟机1.7_《Java虚拟机原理》7.1 精选 —— 总览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQLite学习手册(表达式)
- 下一篇: 有没有检查c语言编译错误的软件,求大佬解