Java JVM的基本概念、結(jié)構(gòu)、生命周期詳解
1 JVM簡介
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。
引入Java語言虛擬機JVM后,Java語言在不同平臺上運行時不需要重新編譯。JVM在執(zhí)行字節(jié)碼時,實際上最終還是把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行,因此屏蔽了與具體平臺(win、mac)相關(guān)的信息,使得只需要一份字節(jié)碼文件,就可以在多種平臺上不加修改地運行。
不僅如此,現(xiàn)在的JVM還實現(xiàn)了語言的無關(guān)性,Scala、Kotlin、Groovy等語言都可以使用JVM運行。
編譯后被Java虛擬機所執(zhí)行的代碼使用了一種平臺中立(不依賴于特定硬件及操作系統(tǒng))的二進制格式來表示, 并且經(jīng)常(但并非絕對)以文件的形式存儲, 因此這種格式稱為class 文件格式。 實際上JVM的平臺、語言無關(guān)性的上層原因也是因為.class文件格式的平臺、語言無關(guān)性。
2 JVM的生命周期
2.1 啟動
JVM實例對應(yīng)了一個獨立運行的java程序,它是進程級別。
啟動一個Java程序時,會首先建立一個JVM實例,任何一個擁有public static void main(String[] args)函數(shù)的class都可以作為JVM實例運行的起點
2.2 運行
main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。
JVM內(nèi)部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,java程序也可以標明自己創(chuàng)建的線程是守護線程(Thread的setDaemon(true)方法)。
2.3 消亡
- 當(dāng)程序中的所有非守護線程都終止時,JVM退出;
- 若安全管理器允許,程序也可以使用System.exit(0)或 Runtime.getRuntime().exit()來退出。
- 程序所在平臺強制結(jié)束JVM進程
3 JVM的體系結(jié)構(gòu)
3.1 JVM組成
主要分成三塊:
- 類裝載器(ClassLoader)(用來裝載.class文件)
- 執(zhí)行引擎(執(zhí)行字節(jié)碼,或者執(zhí)行本地方法)
- 運行時數(shù)據(jù)區(qū)(方法區(qū)、堆、java棧、PC寄存器、本地方法棧)
注意:
java編譯器把java源文件(.java文件)編譯成字節(jié)碼文件(.class文件),然后JVM對字節(jié)碼文件進行加載、解釋執(zhí)行。
java的源代碼是無法直接在JVM上運行的,Java編譯器在JDK中,可以使用javac命令對Java源文件進行編譯。
3.1 JVM各模塊簡介
我們的后續(xù)學(xué)習(xí)主要學(xué)習(xí)的內(nèi)容是JVM的類加載機制、運行時數(shù)據(jù)區(qū)域、GC機制、執(zhí)行引擎機制、以及一些JVM優(yōu)化。
對于源文件的編譯,并不屬于JVM的范疇,編譯原理的內(nèi)容比較復(fù)雜,但是我們可以了解一下,Java源代碼編譯大概步驟為:
生成的字節(jié)碼文件中包含結(jié)構(gòu)信息、元數(shù)據(jù)、方法信息等,具體的字節(jié)碼結(jié)構(gòu)在類文件結(jié)構(gòu)部分。深入了解編譯器可以看《自己動手實現(xiàn)jvm》、《編譯原理》等書。
JVM對Java字節(jié)碼進行加載、執(zhí)行,JVM的類加載是通過ClassLoader及其子類來完成的,執(zhí)行的過程抽象如下:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring @Cacheable自定義緩存過期時間的實現(xiàn)示例
本文主要介紹了Spring @Cacheable自定義緩存過期時間的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05Java使用RedisTemplate操作Redis遇到的坑
這篇文章主要介紹了Java使用RedisTemplate操作Redis遇到的坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式
今天小編就為大家分享一篇關(guān)于MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12使用JPA自定義VO類型轉(zhuǎn)換(EntityUtils工具類)
這篇文章主要介紹了使用JPA自定義VO類型轉(zhuǎn)換(EntityUtils工具類),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11