寶塔網(wǎng)站301重定向怎么做網(wǎng)站關(guān)鍵詞如何快速上首頁
啟航·JVM概論
😄生命不息,寫作不止
🔥 繼續(xù)踏上學習之路,學之分享筆記
👊 總有一天我也能像各位大佬一樣
🏆 博客首頁 ??@怒放吧德德??To記錄領地
🌝分享學習心得,歡迎指正,大家一起學習成長!
文章目錄
- 啟航·JVM概論
- 前言
- 虛擬機和Java虛擬機
- 1 虛擬機
- 2 Java虛擬機
- 3 JVM的位置
- 4 *JVM的整體結(jié)構(gòu)
- 1) 簡單介紹HotSpot VM
- 2) 整體結(jié)構(gòu)介紹
- 5 Java代碼執(zhí)行流程
- 6 JVM的生命周期
- 虛擬機啟動
- 虛擬機執(zhí)行
- 虛擬機退出
- 7 常見虛擬機
- 總結(jié)
前言
為什么要學習JVM?相信好多開發(fā)者開頭也處于迷惑之中,對于Java虛擬機也是很頭疼,大多開發(fā)者都會認為,學習JVM無非就是面試。然而,學習JVM并不是為了面試,更是為了深入去理解Java這門語言,筆者大學畢業(yè)入坑Java以來也有一年多了,說長也不長,但是在開發(fā)的過程中卻也是遇到一些性能問題,最后也是由領導解決。個人認為,學習Java虛擬機更是一種基礎知識,在開發(fā)中才能夠深入理解一些細節(jié)。
虛擬機和Java虛擬機
1 虛擬機
虛擬機(Virtual Machine)是一種軟件或硬件實體,它模擬了物理計算機的功能,允許在其上運行操作系統(tǒng)和應用程序。虛擬機通常用于隔離不同的計算環(huán)境,提供了一種獨立于物理硬件的計算平臺。
2 Java虛擬機
Java虛擬機(Java Virtual Machine,JVM)是一種軟件虛擬機,特別為執(zhí)行Java程序而設計。JVM是Java平臺的核心組件之一,它負責將Java字節(jié)碼翻譯成可以在特定計算機上運行的本地機器代碼。Java程序員編寫的Java代碼首先被編譯成字節(jié)碼,然后由JVM執(zhí)行。這種方式使Java程序具有跨平臺的特性,因為只需要在不同平臺上實現(xiàn)JVM,就可以在各種操作系統(tǒng)上運行相同的Java程序。
JVM的主要任務包括字節(jié)碼加載、解釋執(zhí)行或即時編譯、垃圾回收、內(nèi)存管理等。它還提供了各種標準庫和API,用于支持Java程序的運行和互動。不同的Java虛擬機實現(xiàn)可以適應不同的硬件和操作系統(tǒng),但它們都遵循Java虛擬機規(guī)范(Java Virtual Machine Specification),以確保Java程序的跨平臺性。
3 JVM的位置
Java虛擬機試運行在操作系統(tǒng)之上的,和硬件是沒有直接交互的。
在Java 生態(tài)系統(tǒng)中的三個關(guān)鍵組件:JDK(Java Development Kit)、JRE(Java Runtime Environment)和 JVM(Java Virtual Machine)
① JDK(Java Development Kit)
JDK是用于Java應用程序的開發(fā)工具包。它包括Java編譯器(javac)、Java虛擬機(JVM),以及各種開發(fā)工具和庫,如調(diào)試器、性能分析工具、API文檔生成工具等。JDK是開發(fā)人員用于創(chuàng)建、編譯和調(diào)試Java應用程序的關(guān)鍵工具,它使開發(fā)者能夠編寫Java源代碼并將其編譯成Java字節(jié)碼。JDK的結(jié)構(gòu)包括bin目錄,其中包含編譯器和其他命令行工具,以及l(fā)ib目錄,其中包含Java類庫和運行時支持。
② JRE(Java Runtime Environment)
JRE是用于運行Java應用程序的運行時環(huán)境。它包括Java虛擬機(JVM)和Java類庫(Java API),允許用戶執(zhí)行已編譯的Java應用程序,而不需要進行開發(fā)。JRE沒有開發(fā)工具,因此不包含編譯器或其他開發(fā)相關(guān)的工具。JRE的結(jié)構(gòu)包括bin目錄,其中包含用于運行Java應用程序的JVM可執(zhí)行文件,以及l(fā)ib目錄,其中包含Java類庫
三者中,JDK 包含 JRE,而 JRE 包含 JVM。JDK 提供了完整的 Java 開發(fā)和運行時環(huán)境,適用于開發(fā)人員,而 JRE 提供了用于運行 Java 應用程序的環(huán)境,適用于普通用戶或生產(chǎn)環(huán)境。 JVM 是在 JDK 和 JRE 中共享的核心組件,負責執(zhí)行 Java 應用程序。
4 *JVM的整體結(jié)構(gòu)
1) 簡單介紹HotSpot VM
HotSpot VM(HotSpot Virtual Machine)是Oracle(以前是Sun Microsystems)開發(fā)的 Java 虛擬機的一種實現(xiàn),它是Java平臺上最廣泛使用的虛擬機之一。HotSpot VM在性能和可移植性方面表現(xiàn)出色,它是Java應用程序的運行時引擎,負責將Java字節(jié)碼翻譯成本地機器代碼并執(zhí)行程序。
HotSpot VM是Oracle JDK(Java Development Kit)的一部分,也是許多其他Java發(fā)行版的基礎,包括OpenJDK。由于其卓越的性能和穩(wěn)定性,HotSpot VM一直是廣泛使用的Java虛擬機之一,特別適用于生產(chǎn)環(huán)境和要求高性能的Java應用程序。
2) 整體結(jié)構(gòu)介紹
對于上圖,這里簡單介紹一下
首先是Java類通過編譯成class文件,在用過類加載器加載到內(nèi)存中。
類加載是Java虛擬機(JVM)的一個關(guān)鍵組件,負責將Java字節(jié)碼文件加載到內(nèi)存中并轉(zhuǎn)換為可執(zhí)行的類。類加載器的主要任務是查找和加載類文件,確保在程序運行時可以訪問所需的類。類加載器的工作使Java的動態(tài)性成為可能,允許在運行時加載和卸載類。
接著看這個第二層,運行時的數(shù)據(jù)區(qū),這里包含了方法區(qū)、Java棧、本地方法棧、堆、程序計數(shù)器
方法區(qū)是存儲類信息、常量、靜態(tài)變量以及編譯后的字節(jié)碼的地方,包括類的結(jié)構(gòu)信息、方法和字段描述,以及運行時常量池。
堆是Java程序中用于存儲對象實例的區(qū)域。
棧是每個線程獨有的,用于存儲方法調(diào)用、局部變量以及方法返回值。
本地方法棧與棧類似,但它存儲的是Java程序調(diào)用本地方法(使用JNI,Java Native Interface)時的信息。
程序計數(shù)器是當前線程執(zhí)行的字節(jié)碼指令的位置計數(shù)器。
總結(jié)
方法區(qū)和堆:這兩個是多線程共享的
Java棧、本地方法棧和程序計數(shù)器:這是每個線程都獨有一份
最后看第三層,這一層是和操作系統(tǒng)和硬件交互的重要組件。執(zhí)行引擎,這是Java虛擬機核心組件之一,他是負責執(zhí)行Java字節(jié)碼,將Java字節(jié)碼解釋成底層平臺的機器碼,或者通過即時編譯器(Just-In-Time Compiler,JIT)將字節(jié)碼編譯成本地機器代碼以提高性能。本地方法接口是Java虛擬機提供的機制,允許Java代碼與本地代碼(通常是用C或C++編寫的)進行交互,在Java中就是唄native修飾的接口方法。本地方法庫是包含本地方法的動態(tài)鏈接庫(通常是.so文件或.dll文件),用C或C++編寫。
5 Java代碼執(zhí)行流程
Java代碼的執(zhí)行流程可以分為一下幾個步驟:
- 編寫Java代碼:編寫一個xxx.java的文件。
- 編譯源代碼:使用Java編譯器,將Java源文件編譯成xx.class的字節(jié)碼文件(通常是使用javac)。
- Java虛擬機:在Java虛擬機(JVM)中,其負責加載字節(jié)碼文件并將其轉(zhuǎn)換為可執(zhí)行代碼。在類加載過程中還有一些操作,類加載、鏈接、初始化等等。
- 執(zhí)行程序:一旦類加載完成并且程序初始化完成,JVM開始執(zhí)行程序。
- 運行時垃圾收集:JVM會定期檢查不再被引用的對象,并進行垃圾回收以釋放內(nèi)存資源
- 程序結(jié)束:程序執(zhí)行完main方法或遇到異常時,程序?qū)⒔Y(jié)束執(zhí)行。
6 JVM的生命周期
Java虛擬機的生命周期簡單來說就是三個階段:啟動、執(zhí)行、退出。JVM的生命周期確保了Java程序的安全加載、初始化和執(zhí)行,以及資源管理和垃圾回收。這一過程是Java跨平臺性的關(guān)鍵,因為它將Java程序從特定硬件平臺解耦,使其能夠在不同操作系統(tǒng)上運行。
虛擬機啟動
Java虛擬機在啟動的時候是通過類加載器創(chuàng)建一個初始類來完成。在這一階段,類加載器加載Java字節(jié)碼文件,并對其進行驗證、準備、解析和初始化等操作,接著鏈接,包括驗證類的正確性、為靜態(tài)變量分配內(nèi)存和解析符號引用。然后初始化,在這個階段,JVM執(zhí)行類的靜態(tài)初始化代碼,初始化靜態(tài)變量。
虛擬機執(zhí)行
JVM進入運行階段,開始執(zhí)行程序,通常從main方法開始。程序在運行過程中可以加載、鏈接、初始化其他類,并執(zhí)行程序邏輯。同時,JVM的垃圾回收器定期檢查不再被引用的對象,進行垃圾回收。這個Java程序在Java虛擬機中就是一個進程。
虛擬機退出
在程序執(zhí)行完成或出現(xiàn)嚴重錯誤時,JVM會進入終止階段,可以執(zhí)行清理操作。最后,如果某個類不再被引用,并且沒有實例存在,JVM可能會進行卸載,釋放內(nèi)存。
7 常見虛擬機
常見的虛擬機,每種的實現(xiàn)通常都是針對不同的需求,比如sun classic vm、exact vm、jrockit、j9等等。以下筆者通過網(wǎng)絡查閱到一些的簡單介紹。
在Java生態(tài)系統(tǒng)中,有幾個常見的Java虛擬機(JVM)實現(xiàn),每個實現(xiàn)通常針對不同的用例和需求。以下是一些常見的JVM實現(xiàn):
- Oracle HotSpot JVM:這是Oracle公司的官方JVM實現(xiàn),廣泛用于生產(chǎn)環(huán)境。它以高性能和優(yōu)化而聞名,是許多企業(yè)應用程序的首選JVM。
- OpenJDK:OpenJDK是Oracle的開放源JVM實現(xiàn),也是許多其他JVM的基礎。它提供了Java開發(fā)工具和庫,并被許多Linux發(fā)行版采用作為默認JVM。
- IBM J9 JVM:IBM的J9虛擬機是WebSphere應用服務器和其他IBM產(chǎn)品的一部分。它專注于嵌入式和企業(yè)級應用。
- Apache Harmony:雖然已經(jīng)終止,但Apache Harmony曾是一個Apache項目,旨在創(chuàng)建一個免費的、開放源的JVM實現(xiàn)。雖然它不再維護,但它仍然被某些項目和研究用途使用。
- GraalVM:GraalVM是Oracle開發(fā)的一款全棧虛擬機,支持多種語言,包括Java、JavaScript、Python等。它具有高性能和多語言互操作性,適用于各種應用場景。
- Azul Zing:Azul Zing是專門針對大規(guī)模、高性能Java應用程序而設計的JVM。它包括C4垃圾收集器,可顯著降低垃圾回收停頓時間。
- SAP JVM:SAP JVM是針對SAP應用的JVM實現(xiàn),優(yōu)化了SAP系統(tǒng)的性能和穩(wěn)定性。
這些JVM實現(xiàn)在性能、垃圾回收策略、支持的平臺和工具等方面存在差異,開發(fā)人員可以根據(jù)其應用程序的需求選擇最適合的JVM??偟膩碚f,Java虛擬機的多樣性為Java生態(tài)系統(tǒng)的健康發(fā)展提供了重要的選擇。
總結(jié)
本章就是學習一下Java虛擬機的概念,為了對Java虛擬機有個簡單的認識??傊覀冎赖腏VM有許多,但是我們經(jīng)常遇到的就是 Oracle HotSpot JVM ,Java虛擬機的主要任務包括字節(jié)碼加載、解釋執(zhí)行或即時編譯、垃圾回收、內(nèi)存管理等。它還提供了各種標準庫和API,用于支持Java程序的運行和互動。不同的Java虛擬機實現(xiàn)可以適應不同的硬件和操作系統(tǒng)。