一尊浓、簡介
????首先,來看下面這張圖礼预,Java技術(shù)體系所包含的內(nèi)容:
????上圖來自于Oracle官網(wǎng) java SE(java 平臺(tái)標(biāo)準(zhǔn)版) 8 產(chǎn)品文檔(https://docs.oracle.com/javase/8/docs/index.html)眠砾,先別被這么多東西唬住虏劲,總體來說托酸,Java SE包括了?JDK(開發(fā)工具包)與?JRE(運(yùn)行環(huán)境)。
? ? 開發(fā)人員要使用java開發(fā)柒巫,就需要依賴JDK励堡,JDK中主要包含了編譯與調(diào)試工具,例如 javac(編譯) 堡掏、jconsole(打開分析控制臺(tái)应结,用來調(diào)試)命令,沒有JDK,就沒法編譯java代碼鹅龄,編譯后的文件需要一個(gè)特殊的環(huán)境加載運(yùn)行揩慕,而這個(gè)環(huán)境就包含在JRE中,因此扮休,一般來說迎卤,JDK中包含了JRE。
? ? JRE中又有什么呢玷坠,JRE中主要包含了java運(yùn)行的核心類庫(例如常用的java.util.*, com.sun.*, javax.net.*等等)以及今天要講的java虛擬機(jī)蜗搔,因此,JRE是保證java程序運(yùn)行的必要條件八堡。
二樟凄、Java虛擬機(jī)
? ? 2.1 虛擬機(jī)概況
? ? ????要理解Java虛擬機(jī),首先要知道虛擬機(jī)是什么兄渺,虛擬機(jī)?Virtual Machine 缝龄,簡稱VM,一個(gè)模擬硬件運(yùn)行的虛擬系統(tǒng)挂谍。如果覺得抽象二拐,可以對(duì)比VR(Virtual?Reality,即虛擬現(xiàn)實(shí))凳兵,它們都是用程序模擬真實(shí)存在的現(xiàn)實(shí)(硬件)百新,如同VR構(gòu)造一個(gè)虛擬世界,VM構(gòu)造了一個(gè)假的完整硬件系統(tǒng)庐扫,包括硬盤饭望、CPU、網(wǎng)卡形庭、I/O設(shè)備等铅辞;VR需要調(diào)動(dòng)視覺以及觸覺讓人感受真實(shí),VM也一樣萨醒,需要借助真實(shí)硬盤進(jìn)行數(shù)據(jù)持久化斟珊,需要橋接真實(shí)網(wǎng)絡(luò)進(jìn)行網(wǎng)絡(luò)通訊等來實(shí)現(xiàn)一個(gè)“真實(shí)”的硬件系統(tǒng)。
? ? ????上面也提到富纸,虛擬機(jī)本質(zhì)就是一個(gè)程序囤踩,運(yùn)行在一個(gè)隔離的環(huán)境中,這也是虛擬機(jī)主要優(yōu)點(diǎn)之一晓褪,可以將虛擬機(jī)內(nèi)部的數(shù)據(jù)封裝并與外界系統(tǒng)隔離堵漱,運(yùn)行在虛擬機(jī)內(nèi)部的指令或程序不再需要關(guān)注外部各種復(fù)雜的環(huán)境或系統(tǒng),適配工作交給虛擬機(jī)即可涣仿,這也是java “一處編譯勤庐,到處運(yùn)行”的口號(hào)實(shí)現(xiàn)的基石示惊。? ??
? ? ? ? 可以按照用途把虛擬機(jī)大致分為兩大類:
? ? ? ? ? ? 1.系統(tǒng)虛擬機(jī),即對(duì)物理計(jì)算機(jī)的完全仿真愉镰,可以安裝各類操作系統(tǒng)(windows,linux...)米罚,例如?VMware Workstation、Visual Box等丈探。
? ? ? ? ? ? 2.程序虛擬機(jī)阔拳,專門為執(zhí)行單個(gè)計(jì)算程序而產(chǎn)生,最典型的就是Java虛擬機(jī)类嗤。
? ? 2.2 Java虛擬機(jī)
? ? ? ? 有了對(duì)虛擬機(jī)的基本認(rèn)識(shí)糊肠,Java虛擬機(jī)(Java Virtual Machine,簡稱JVM)就很好理解了遗锣,Java虛擬機(jī)屬于程序虛擬機(jī)货裹,是專門執(zhí)行字節(jié)碼文件命令的虛擬機(jī)。
? ? ? ? 這里精偿,有一個(gè)誤區(qū)弧圆,Java虛擬機(jī)并不只是運(yùn)行java程序,而是運(yùn)行字節(jié)碼文件命令笔咽,也就是.class文件搔预,它是由我們熟悉的.java文件經(jīng)過編譯器編譯而來,但又并不只是.java文件能夠編譯為字節(jié)碼文件叶组,還有Kotlin拯田、JRuby、Groovy等程序文件甩十,它們通過自己的編譯器都可以編譯為.class文件船庇,然后在JVM上運(yùn)行,所以java虛擬機(jī)不只是平臺(tái)無關(guān)侣监,還具備語言無關(guān)的特性鸭轮。
? ? ? ? 解釋型語言具備跨平臺(tái)性質(zhì),只需要對(duì)應(yīng)平臺(tái)有解釋器即可橄霉,例如Python窃爷,但純解釋型往往運(yùn)行速度比較慢(因?yàn)橐鹁浒汛a解釋成機(jī)器語言讓機(jī)器運(yùn)行);而編譯型語言運(yùn)行速度快(啟動(dòng)時(shí)直接編譯成機(jī)器指令姓蜂,所以啟動(dòng)會(huì)比較慢)按厘,例如C語言,但針對(duì)不同平臺(tái)必須進(jìn)行不同的編譯覆糟,且甚至同一段代碼在不同操作系統(tǒng)編譯后可能出現(xiàn)不同的運(yùn)行結(jié)果刻剥。JVM(這里指當(dāng)前的主流商用虛擬機(jī)HotSpot VM)作為字節(jié)碼運(yùn)行環(huán)境,使用解釋和編譯混合工作模式滩字,既使用解釋器保證啟動(dòng)速度,在解釋過程中又有即時(shí)編譯器(Just In Time,簡稱JIT)分析熱點(diǎn)編譯機(jī)器碼保證高效運(yùn)行麦箍,而且具備了跨平臺(tái)性質(zhì)漓藕。
三、JVM的發(fā)展史(了解即可)
自1996年初sun公司發(fā)布的JDK1.0中所包含的Sun Classic VM到今天挟裂,曾經(jīng)涌現(xiàn)享钞、湮滅過許多或經(jīng)典或有特色的虛擬機(jī)實(shí)現(xiàn)。
Sun Classic / Exact VM
? ? ?Sun Classic VM是世界上第一款商用Java虛擬機(jī)诀蓉,使用純解釋器方式來執(zhí)行Java代碼栗竖,導(dǎo)致用戶覺得“Java語言很慢”也因此而來;
? ? ?Exact VM為JDK1.2時(shí)發(fā)布的一臺(tái)虛擬機(jī)渠啤,已經(jīng)具備現(xiàn)代高性能虛擬機(jī)雛形狐肢,即解釋器與編譯器混合工作模式,性能高于當(dāng)時(shí)的Sun Classic VM沥曹,然而商用不久后便被后面的HotSpot VM取代份名。
BEA JRockit
? ? ? ?曾號(hào)稱“世界上速度最快的Java虛擬機(jī)”,不關(guān)心程序啟動(dòng)速度妓美,也就意味著這款虛擬機(jī)不包含解釋器僵腺,使用純JIT編譯后執(zhí)行。
IBM J9 VM
? ? ? ? IBM公司的主力Java虛擬機(jī)壶栋,市場(chǎng)定位與Sun公司的HotSpot VM接近辰如。
MicroSoft JVM
? ? ? ? 微軟曾經(jīng)也是Java語言鐵桿粉絲,而這款虛擬機(jī)可以說是當(dāng)時(shí)(1997年左右)Windows平臺(tái)下性能最好的虛擬機(jī)贵试,但后來Sun公司以侵權(quán)狀告了微軟丧没,迫使這款虛擬機(jī)停止發(fā)展,Sun 與 微軟的恩恩怨怨感興趣的可自行查閱锡移,但這件事不禁會(huì)讓人聯(lián)想呕童,假如微軟沒有被告,一直主力研究與發(fā)展Java淆珊,那Java語言的地位可能今日又會(huì)大有不同夺饲。
Sun HotSpot VM
? ? ? ? 沿用至今且目前使用范圍最廣,Sun JDK 和 Open JDK自帶的默認(rèn)虛擬機(jī)施符。擁有熱點(diǎn)代碼探測(cè)技術(shù)往声,通過執(zhí)行計(jì)數(shù)器找出最有編譯價(jià)值的代碼,通知JIT編譯器進(jìn)行編譯戳吝,以獲取最佳執(zhí)行性能浩销。Oracle 收購 Sun 和 BEA 公司后同時(shí)擁有了兩臺(tái)優(yōu)秀的虛擬機(jī):HotSpot VM 以及上面提到的 JRockit VM,Oracle 在JDK 8中把 JRockit VM 中比HotSpot VM優(yōu)秀的特性(例如垃圾回收器與MissionControl服務(wù))整合進(jìn)HotSpot VM听哭。
四慢洋、總結(jié)
????本章節(jié)主要介紹了Java虛擬機(jī)是什么以及它的一些特性塘雳,下一章我們將一起來深入學(xué)習(xí)Java虛擬機(jī)內(nèi)部內(nèi)存結(jié)構(gòu)以及各個(gè)分區(qū)的作用。
《淺談Java虛擬機(jī)(一)—什么是Java虛擬機(jī)》
《淺談Java虛擬機(jī)(二)—運(yùn)行時(shí)數(shù)據(jù)區(qū)域》
《淺談Java虛擬機(jī)(四)—JVM調(diào)優(yōu)》
本系列文章參考文檔:《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》--?周志明