本文主要是JVM的總體概述鬼佣。
目錄
?1 基本概念
?2 JVM整體結構
?3 JVM代碼執(zhí)行流程
?4 JVM架構模型
?5 JVM的生命周期
1 基本概念
- 虛擬機(Virtual Machine)汞贸,就是一臺虛擬的計算機书在。它是一款軟件飒筑,用來執(zhí)行一系列虛擬計算機指令熙揍。
- 大體上渗稍,虛擬機可分為系統(tǒng)虛擬機(如VMware)和程序虛擬機(如java虛擬機)挑宠。
- JVM是運行在操作系統(tǒng)之上的,并沒有和硬件有直接的交互.
- JVM特點:一次編譯郑口,到處運行鸳碧;自動內存管理,自動垃圾回收
跨平臺的語言java和跨語言的平臺jvm
a.一次編譯犬性,到處運行:我們編寫的程序是以.java結尾的源文件瞻离,經過編譯生成字節(jié)碼文件,所有平臺的jvm都遵守jvm的規(guī)范乒裆,故字節(jié)碼文件可以在不同的平臺上解釋運行套利。
java-跨平臺的語言
b.Java虛擬機根本不關心運行在其內部的程序到底是何種編程語言編寫的,它只關心"字節(jié)碼"文件
jvm-跨語言的平臺
不同的JVM體系架構都會有所不同,我的JVM系列文章均圍繞Hotspot 虛擬機來講
肉迫。
2 JVM整體結構
JVM的內部體系結構分為三部分验辞,分別是:類裝載器子系統(tǒng),運行時數據區(qū)喊衫,和執(zhí)行引擎跌造。
- 類裝載器子系統(tǒng):將字節(jié)碼裝載到內存中,生成class對象
- 運行時數據區(qū):在內存中族购,多線程共享堆和方法區(qū)壳贪,對java虛擬機棧,本地方法棧和程序計數器來說寝杖,每個線程獨有一份违施。
-
執(zhí)行引擎:分為解釋器、JIT編譯器瑟幕、垃圾回收器醉拓,有將高級語言翻譯成機器語言的作用
JVM整體結構
3 JVM代碼執(zhí)行流程
- 先把 Java 代碼編譯成字節(jié)碼,也就是把 .java 類型的文件編譯成 .class 類型的文件收苏。這個過程的大致執(zhí)行流程:Java 源代碼 -> 詞法分析器 -> 語法分析器 -> 語義分析器 -> 字符碼生成器 -> 最終生成字節(jié)碼,其中任何一個節(jié)點執(zhí)行失敗就會造成編譯失敺弑鹿霸;
-
Java 虛擬機使用類加載器(Class Loader)裝載 class 文件;
類加載完成之后秆乳,會進行字節(jié)碼效驗懦鼠,字節(jié)碼效驗通過之后 JVM 解釋器會把字節(jié)碼翻譯成機器碼交由操作系統(tǒng)執(zhí)行。但不是所有代碼都是解釋執(zhí)行的屹堰,JVM 對此做了優(yōu)化肛冶,比如,以 Hotspot 虛擬機來說扯键,它本身提供了 JIT(Just In Time)也就是我們通常所說的動態(tài)編譯器睦袖,它能夠在運行時將熱點代碼編譯為機器碼。
java代碼執(zhí)行流程
4 JVM架構模型
- java編譯器輸入的指令流基本上是一種
基于棧的指令架構
荣刑,另一種指令架構是基于寄存器的指令架構
馅笙。 -
由于跨平臺的設計,java的指令都是根據棧來設計的
厉亏,不同平臺CPU架構不同董习,所以不能設計為基于寄存器的。
棧:跨平臺性爱只、指令集小皿淋、指令多;執(zhí)行性比寄存器差
寄存器:指令集架構完全依賴硬件,可移植性差窝趣;性能優(yōu)秀疯暑,執(zhí)行高效
5 JVM的生命周期
①啟動
通過引導類加載器(bootstrap class loader)創(chuàng)建一個初始類(initial class)來完成的,這個類是由虛擬機的具體實現(xiàn)指定的高帖。
② 執(zhí)行
- 一個運行中的java虛擬機有著一個清晰的任務:執(zhí)行Java程序缰儿;
- 程序開始執(zhí)行的時候他才運行,程序結束時他就停止散址;
- 執(zhí)行一個所謂的Java程序的時候乖阵,真真正正在執(zhí)行的是一個叫做Java虛擬機的進程。
③ 退出
- 程序正常執(zhí)行結束
- 程序異吃铮或錯誤而異常終止
- 操作系統(tǒng)錯誤導致終止
- 某線程調用Runtime類或System類的exit方法瞪浸,或Runtime類的halt方法,并且java安全管理器也允許這次exit或halt操作
- 除此之外吏祸,JNI規(guī)范描述了用JNI Invocation API來加載或卸載Java虛擬機時对蒲,Java虛擬機的退出情況