Java JVM的基本概念、結構、生命周期詳解
1 JVM簡介
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規(guī)范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。
引入Java語言虛擬機JVM后,Java語言在不同平臺上運行時不需要重新編譯。JVM在執(zhí)行字節(jié)碼時,實際上最終還是把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行,因此屏蔽了與具體平臺(win、mac)相關的信息,使得只需要一份字節(jié)碼文件,就可以在多種平臺上不加修改地運行。
不僅如此,現在的JVM還實現了語言的無關性,Scala、Kotlin、Groovy等語言都可以使用JVM運行。
編譯后被Java虛擬機所執(zhí)行的代碼使用了一種平臺中立(不依賴于特定硬件及操作系統(tǒng))的二進制格式來表示, 并且經常(但并非絕對)以文件的形式存儲, 因此這種格式稱為class 文件格式。 實際上JVM的平臺、語言無關性的上層原因也是因為.class文件格式的平臺、語言無關性。
2 JVM的生命周期
2.1 啟動
JVM實例對應了一個獨立運行的java程序,它是進程級別。
啟動一個Java程序時,會首先建立一個JVM實例,任何一個擁有public static void main(String[] args)函數的class都可以作為JVM實例運行的起點
2.2 運行
main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。
JVM內部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,java程序也可以標明自己創(chuàng)建的線程是守護線程(Thread的setDaemon(true)方法)。
2.3 消亡
- 當程序中的所有非守護線程都終止時,JVM退出;
- 若安全管理器允許,程序也可以使用System.exit(0)或 Runtime.getRuntime().exit()來退出。
- 程序所在平臺強制結束JVM進程
3 JVM的體系結構
3.1 JVM組成
主要分成三塊:
- 類裝載器(ClassLoader)(用來裝載.class文件)
- 執(zhí)行引擎(執(zhí)行字節(jié)碼,或者執(zhí)行本地方法)
- 運行時數據區(qū)(方法區(qū)、堆、java棧、PC寄存器、本地方法棧)
注意:
java編譯器把java源文件(.java文件)編譯成字節(jié)碼文件(.class文件),然后JVM對字節(jié)碼文件進行加載、解釋執(zhí)行。
java的源代碼是無法直接在JVM上運行的,Java編譯器在JDK中,可以使用javac命令對Java源文件進行編譯。
3.1 JVM各模塊簡介

我們的后續(xù)學習主要學習的內容是JVM的類加載機制、運行時數據區(qū)域、GC機制、執(zhí)行引擎機制、以及一些JVM優(yōu)化。
對于源文件的編譯,并不屬于JVM的范疇,編譯原理的內容比較復雜,但是我們可以了解一下,Java源代碼編譯大概步驟為:

生成的字節(jié)碼文件中包含結構信息、元數據、方法信息等,具體的字節(jié)碼結構在類文件結構部分。深入了解編譯器可以看《自己動手實現jvm》、《編譯原理》等書。
JVM對Java字節(jié)碼進行加載、執(zhí)行,JVM的類加載是通過ClassLoader及其子類來完成的,執(zhí)行的過程抽象如下:

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring @Cacheable自定義緩存過期時間的實現示例
本文主要介紹了Spring @Cacheable自定義緩存過期時間的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05
Java使用RedisTemplate操作Redis遇到的坑
這篇文章主要介紹了Java使用RedisTemplate操作Redis遇到的坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
使用JPA自定義VO類型轉換(EntityUtils工具類)
這篇文章主要介紹了使用JPA自定義VO類型轉換(EntityUtils工具類),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

