2021-11-13 10:53:18|已瀏覽:279次
JVM的中文名稱叫Java虛擬機,它是由軟件技術模擬出計算機運行的一個虛擬的計算機。JVM也充當著一個翻譯官的角色,我們編寫出的Java程序,是不能夠被操作系統所直接識別的,這時候JVM的作用就體現出來了,它負責把我們的程序翻譯給系統“聽”,告訴它我們的程序需要做什么操作。我們都知道Java的程序需要經過編譯后,產生.Class文件,JVM才能識別并運行它,JVM針對每個操作系統開發其對應的解釋器,所以只要其操作系統有對應版本的JVM,那么這份Java編譯后的代碼就能夠運行起來,這就是Java能一次編譯,到處運行的原因。
一、JVM的生命周期
JVM在Java程序開始執行的時候,它才運行,程序結束的時它就停止。一個Java程序會開啟一個JVM進程,如果一臺機器上運行三個程序,那么就會有三個運行中的JVM進程。JVM中的線程分為兩種:守護線程和普通線程守護線程是JVM自己使用的線程,比如垃圾回收(GC)就是一個守護線程。普通線程一般是Java程序的線程,只要JVM中有普通線程在執行,那么JVM就不會停止。權限足夠的話,可以調用exit()方法終止程序。
二、JVM的啟動過程
1、JVM的裝入環境和配置
在學習這個之前,我們需要了解一件事情,就是JDK和JRE的區別。JDK是面向開發人員使用的SDK,它提供了Java的開發環境和運行環境,JDK中包含了JRE。JRE是Java的運行環境,是面向所有Java程序的使用者,包括開發者。JRE = 運行環境 = JVM。如果安裝了JDK,會發現電腦中有兩套JRE,一套位于/Java/jre.../下,一套位于/Java/jdk.../jre下。那么問題來了,一臺機器上有兩套以上JRE,誰來決定運行那一套呢?這個任務就落到java.exe身上,java.exe的任務就是找到合適的JRE來運行java程序。
java.exe按照以下的順序來選擇JRE:
自己目錄下有沒有JRE
父目錄下有沒有JRE
查詢注冊表: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\"當前JRE版本號"\JavaHome
這幾步的主要核心是為了找到JVM的絕對路徑。
jvm.cfg的路徑為:JRE路徑\lib\"CPU架構"\jvm.fig
jvm.cfg的內容大致如下:
-client KNOWN
通過第一步找到JVM的路徑后,Java.exe通過LoadJavaVM來裝入JVM文件。
LoadLibrary裝載JVM動態連接庫,然后把JVM中的到處函數JNI_CreateJavaVM和JNI_GetDefaultJavaVMIntArgs 掛接到InvocationFunction 變量的CreateJavaVM和GetDafaultJavaVMInitArgs 函數指針變量上。JVM的裝載工作完成。
3、初始化JVM,獲得本地調用接口
調用InvocationFunction -> CreateJavaVM也就是JVM中JNI_CreateJavaVM方法獲得JNIEnv結構的實例。
4、運行Java程序
JVM運行Java程序的方式有兩種:jar包 與 Class
運行jar 的時候,Java.exe調用GetMainClassName函數,該函數先獲得JNIEnv實例然后調用JarFileJNIEnv類中getManifest(),從其返回的Manifest對象中取getAttrebutes("Main-Class")的值,即jar 包中文件:META-INF/MANIFEST.MF指定的的Main-Class的主類名作為運行的主類。之后main函數會調用Java.c中LoadClass方法裝載該主類(使用JNIEnv實例的FindClass)。
運行Class的時候,main函數直接調用Java.c中的LoadClass方法裝載該類。
5、Class文件
Class文件由Java編譯器生成,我們創建的.Java文件在經過編譯器后,會變成.Class的文件,這樣才能被JVM所識別并運行。
6、類加載子系統
類加載子系統也可以稱之為類加載器,JVM默認提供三個類加載器:
BootStrap ClassLoader :稱之為啟動類加載器,是最頂層的類加載器,負責加載JDK中的核心類庫,如 rt.jar、resources.jar、charsets.jar等。
Extension ClassLoader:稱之為擴展類加載器,負責加載Java的擴展類庫,默認加載$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目錄下的jar包。
App ClassLoader:稱之為系統類加載器,負責加載應用程序classpath目錄下所有jar和class文件。
除了Java默認提供的三個ClassLoader(加載器)之外,我們還可以根據自身需要自定義ClassLoader,自定義ClassLoader必須繼承java.lang.ClassLoader 類。除了BootStrap ClassLoader 之外的另外兩個默認加載器都是繼承自java.lang.ClassLoader 。BootStrap ClassLoader 不是一個普通的Java類,它底層由C++編寫,已嵌入到了JVM的內核當中,當JVM啟動后,BootStrap ClassLoader 也隨之啟動,負責加載完核心類庫后,并構造Extension ClassLoader 和App ClassLoader 類加載器。
本文由培訓無憂網長沙牛耳教育專屬課程顧問整理發布,希望能夠對想參加長沙Java培訓班的學生有所幫助。更多Java培訓課程資訊歡迎關注培訓無憂網Java培訓頻道或添加老師微信:1503333605010.
注:尊重原創文章,轉載請注明出處和鏈接 http://m.hebeijilong.cn/news-id-3778.html 違者必究!部分文章來源于網絡由培訓無憂網編輯部人員整理發布,內容真實性請自行核實或聯系我們,了解更多相關資訊請關注java培訓頻道查看更多,了解相關專業課程信息您可在線咨詢也可免費申請試課。關注官方微信了解更多:150 3333 6050