JRE/JDK/JVM的關(guān)系
JRE(Java Runtime Environment):中文名為java運行是環(huán)境,也就是java平臺。所有的java程序都要在有jre的環(huán)境下才能運行。
JDK(Java Development Kit):中文名為java開發(fā)工具,jdk的工具也是java程序,也需要jre環(huán)境才能運行。
JVM(Java Virtual Machine):中文名為java虛擬機,這個是jre的一部分。
JVM環(huán)境的加載
以windows操作系統(tǒng)為例,裝入JVM是通過jdk中的Java.exe可執(zhí)行程序來完成的,具體可以分為四步:
創(chuàng)建JVM裝載環(huán)境和配置
裝載JVM.dll
初始化JVM.dll并掛到JNIENV(JNI調(diào)用接口)實例
調(diào)用JNIENV實例裝載并處理class類
JVM的生命周期
當一個Java程序啟動時,一個JVM實例就產(chǎn)生了,任何存在public static void main(String [] args)方法的類都可以作為JVM實例運行的起點,所以在平時定義一個Class時就要顯示告訴JVM類名,這樣JVM才能知道是該運行哪個類里面的main方法。
main()方法是初始線程的起點,任何其它線程均由該線程啟動。JVM內(nèi)部存在兩種線程,分別為守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,Java程序也可以標明自己創(chuàng)建的線程是守護線程。
當程序中的所有非守護線程都終止時,JVM才退出,程序中也可以使用setDaemon(boolean on)方法來設(shè)定為守護線程。(Linux中說守護進程,這里為什么說守護線程呢?因為,java是跑在JVM虛擬機上的)。
JVM體系結(jié)構(gòu)
JVM內(nèi)部分成三部分,分別為:類裝載器(ClassLoader)子系統(tǒng)、執(zhí)行引擎和運行時數(shù)據(jù)區(qū)。
類裝載器子系統(tǒng):就是用來裝載.class文件的系統(tǒng)。JVM的兩種裝載器包括:啟動類裝載器和用戶自定義類裝載器。啟動類裝載器是JVM實現(xiàn)的一部分,用戶自定義類裝載器則是java程序的一部分,必須是ClassLoader類的子類。
執(zhí)行引擎:執(zhí)行引擎是Java虛擬機核心組成部分之一,輸入的是字節(jié)碼文件,處理過程就是字節(jié)碼解析的等效過程,輸出的是執(zhí)行結(jié)果,對于執(zhí)行引擎來講,活動線程中,只有棧頂?shù)臈怯行У?,稱為當前棧幀,這個棧幀所關(guān)聯(lián)的方法稱為當前方法。執(zhí)行引擎所運行的所有字節(jié)碼指令都是針對當前棧幀進行操作。
運行時數(shù)據(jù)區(qū):主要有方法區(qū)、堆、Java棧、PC寄存器、本地方法棧。