《Java 虛擬機(jī)原理》7.1 精選 —— 總覽

1.一個(gè)程序在 JVM 中運(yùn)行的完整流程

java程序執(zhí)行流程.JPG

說明
① 類加載器把字節(jié)碼加載到方法區(qū)
② 方法區(qū)的字節(jié)碼被 JVM new,在堆內(nèi)存中生成字節(jié)碼對(duì)象
③ 字節(jié)碼對(duì)象被 GC 的要求有:該類沒有在其他任何地方被引用;該類的所有的實(shí)例對(duì)象都已被 GC;該類的類加載器的實(shí)例已被 GC

2.Java 虛擬機(jī)的生命周期

JVM 的生命周期可以分為啟動(dòng)、運(yùn)行、退出。

(1) 啟動(dòng)

JVM 的啟動(dòng)過程是類加載,通過類加載器把二進(jìn)制字節(jié)碼加載到 JVM。

類加載器采用雙親委派模型, 其類型有 3 種:
Bootstrap ClassLoader 啟動(dòng)類加載器:負(fù)責(zé)加載系統(tǒng)類和 /lib 目錄的 jar 和類,例如 String
ExtClassLoader 擴(kuò)展類加載器:負(fù)責(zé)加載 /lib/ext 目錄下的 jar 和類
AppClassLoader 應(yīng)用程序類加載器:負(fù)責(zé)加載當(dāng)前應(yīng)用 ClassPath 的 jar 和類
UserDefinedClassLoader 用戶自定義加載器:負(fù)責(zé)加載用戶自定義的 jar 和類

示例如下,執(zhí)行 main 方法,需要加載 Test01。根據(jù)雙親委派模型即向上檢查、向下加載,JVM 從 AppClassLoader、ExtClassLoader 到 Bootstrap ClassLoader 檢查和加載 Test01。Test01 是用戶自定義類,Test01 沒有指定父類即默認(rèn)父類是 Object 類,被
AppClassLoader 加載。

public class Test01 {
    public static void main(String[] args) {
        System.out.println("123");
    }
}

類的生命周期
加載:通過全類名獲取該類的二進(jìn)制字節(jié)流、將字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)、在內(nèi)存中生成一個(gè)代表該類的 Class 對(duì)象(方法區(qū)數(shù)據(jù)的訪問入口);
驗(yàn)證:驗(yàn)證文件格式、字節(jié)碼驗(yàn)證、魔數(shù)驗(yàn)證
準(zhǔn)備:分配內(nèi)存給類變量,并設(shè)置類變量初始值。如果是基本數(shù)據(jù)類型,就會(huì)給他們?cè)O(shè)置默認(rèn)值;
解析:將常量池內(nèi)的符號(hào)引用替換為直接引用
初始化:new 指令、getstatic 指令、putstatic 指令、invokestatic 指令、 java.lang.reflect 的反射等
使用:用戶程序使用
卸載:該類的所有的實(shí)例對(duì)象都已被GC、該類沒有在其他任何地方被引用、該類的類加載器的實(shí)例已被GC

(2) 運(yùn)行

一個(gè)JVM 進(jìn)程的運(yùn)行,實(shí)際上是 Java 程序的運(yùn)行。當(dāng)程序運(yùn)行結(jié)束后,JVM 進(jìn)程也就結(jié)束。

JVM 的守護(hù)線程
Java 有 2 種進(jìn)程,User Thread 用戶線程、Daemon Thread 守護(hù)線程。例如,用戶線程是指用戶自定義的 main 函數(shù),而守護(hù)線程是服務(wù)于用戶線程的,例如 GC 垃圾回收線程。兩種線程的生命周期是一致的,前者優(yōu)先級(jí)高于后者的。

(3)退出

JVM 的退出有多種場(chǎng)景,如下所示。
① 程序正常結(jié)束運(yùn)行
② 程序中調(diào)用 System.exit() 等方法
③ 程序運(yùn)行過程中,遇到異常錯(cuò)誤終止
④ 操作系統(tǒng)、硬件原因?qū)е?JVM 進(jìn)程被結(jié)束

3.Java 程序運(yùn)行的案例

image.png

jdk1.7 及以下是方法區(qū),jdk1.8 是元空間 Metaspace

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容