JRE/JDK/JVM的關(guān)系
JRE(Java Runtime Environment):中文名為java運(yùn)行是環(huán)境,也就是java平臺(tái)。所有的java程序都要在有jre的環(huán)境下才能運(yùn)行。
JDK(Java Development Kit):中文名為java開(kāi)發(fā)工具,jdk的工具也是java程序砾淌,也需要jre環(huán)境才能運(yùn)行。
JVM(Java Virtual Machine):中文名為java虛擬機(jī)谭网,這個(gè)是jre的一部分汪厨。
JVM環(huán)境的加載
以windows操作系統(tǒng)為例,裝入JVM是通過(guò)jdk中的Java.exe可執(zhí)行程序來(lái)完成的愉择,具體可以分為四步:
創(chuàng)建JVM裝載環(huán)境和配置
裝載JVM.dll
初始化JVM.dll并掛到JNIENV(JNI調(diào)用接口)實(shí)例
調(diào)用JNIENV實(shí)例裝載并處理class類
JVM的生命周期
當(dāng)一個(gè)Java程序啟動(dòng)時(shí)劫乱,一個(gè)JVM實(shí)例就產(chǎn)生了,任何存在public static void main(String [] args)方法的類都可以作為JVM實(shí)例運(yùn)行的起點(diǎn)锥涕,所以在平時(shí)定義一個(gè)Class時(shí)就要顯示告訴JVM類名要拂,這樣JVM才能知道是該運(yùn)行哪個(gè)類里面的main方法。
main()方法是初始線程的起點(diǎn)站楚,任何其它線程均由該線程啟動(dòng)脱惰。JVM內(nèi)部存在兩種線程,分別為守護(hù)線程和非守護(hù)線程窿春,main()屬于非守護(hù)線程拉一,守護(hù)線程通常由JVM自己使用采盒,Java程序也可以標(biāo)明自己創(chuàng)建的線程是守護(hù)線程。
當(dāng)程序中的所有非守護(hù)線程都終止時(shí)蔚润,JVM才退出磅氨,程序中也可以使用setDaemon(boolean on)方法來(lái)設(shè)定為守護(hù)線程。(Linux中說(shuō)守護(hù)進(jìn)程嫡纠,這里為什么說(shuō)守護(hù)線程呢烦租?因?yàn)椋琷ava是跑在JVM虛擬機(jī)上的)除盏。
JVM體系結(jié)構(gòu)
JVM內(nèi)部分成三部分叉橱,分別為:類裝載器(ClassLoader)子系統(tǒng)、執(zhí)行引擎和運(yùn)行時(shí)數(shù)據(jù)區(qū)者蠕。
類裝載器子系統(tǒng):就是用來(lái)裝載.class文件的系統(tǒng)窃祝。JVM的兩種裝載器包括:?jiǎn)?dòng)類裝載器和用戶自定義類裝載器。啟動(dòng)類裝載器是JVM實(shí)現(xiàn)的一部分踱侣,用戶自定義類裝載器則是java程序的一部分粪小,必須是ClassLoader類的子類。
執(zhí)行引擎:執(zhí)行引擎是Java虛擬機(jī)核心組成部分之一抡句,輸入的是字節(jié)碼文件探膊,處理過(guò)程就是字節(jié)碼解析的等效過(guò)程,輸出的是執(zhí)行結(jié)果待榔,對(duì)于執(zhí)行引擎來(lái)講突想,活動(dòng)線程中,只有棧頂?shù)臈怯行У木孔ィQ為當(dāng)前棧幀猾担,這個(gè)棧幀所關(guān)聯(lián)的方法稱為當(dāng)前方法。執(zhí)行引擎所運(yùn)行的所有字節(jié)碼指令都是針對(duì)當(dāng)前棧幀進(jìn)行操作刺下。
運(yùn)行時(shí)數(shù)據(jù)區(qū):主要有方法區(qū)绑嘹、堆、Java棧橘茉、PC寄存器工腋、本地方法棧。