目錄
1、JVM虛擬機學習系列之一(Java虛擬機的發展史和java發展重大事件)
2、JVM虛擬機學習系列之二(Java虛擬機的內部結構和整體框架)
3、JVM虛擬機學習系列之三(Java虛擬機的運行時資料區:程式計數器+虛擬機堆疊+本地方法堆疊)
4、JVM虛擬機學習系列之四(Java虛擬機的位元組碼與類的加載)
5、JVM虛擬機學習系列之五(Java虛擬機的位元組碼與類的加載)
一、為什么要學習Java虛擬機
- 首先是高新作業的面試需要(BAT、TMD、PKQ等面試都愛問),
- 再是中高級程式員必備技能,也是專案管理、調優的需要,
- 最后是追求極客的精神,比如:垃圾回收演算法、JIT、底層原理等,
- java虛擬機的垃圾收集機制為我們打理了很多繁瑣的作業,大大提高了開發的效率,但是,垃圾收集也不是萬能的,懂得JVM內部的記憶體結構、作業機制,才是設計高擴展性應用和診斷運行時問題的基礎,也是Java工程師進階的必備能力,
二、什么是Java虛擬機
- 虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實作的,Java虛擬機有自己完善的硬體架構,如處理器、堆疊、暫存器等,還具有相應的指令系統,Java虛擬機屏蔽了與具體作業系統平臺相關的資訊,使得Java程式只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平臺上不加修改地運行,其實是因為不同的作業系統的開發了相應的Java虛擬機才能使Java撰寫好的程式能在不同的機器上運行,
- Java虛擬機(Java Virtual Machine 簡稱JVM)是運行所有Java程式的抽象計算機,是Java語言開發的程式的運行環境,
- Java虛擬機就是二進制位元組碼的運行環境,負責裝載位元組碼到其內部,解釋/編譯為對應平臺上的機器指令執行,每一.條Java指令,Java虛擬機規范中都有詳細定義,如怎么取運算元,怎么處理運算元,處理結果放在哪里,
三、常用的Java虛擬機
1、Sun Classic VM
- 早在1996年Java1.0版本的時候,Sun公司發布了一款名為Sun Classic vm的java虛擬機,它同時也是世界上第一款商業java虛擬機,jdk1.4時完全被淘汰
- 這款虛擬機內部只提供解釋器,
- 如果使用JIT編譯器,就需要進行外掛,但是一旦使用了JIT編譯器,JIT就會接管虛擬機的執行系統,解釋器就不再作業,解釋器和編譯器不能配合作業,
- 現在Hotspot內置了此虛擬機;
2、Exact VM
- 為了解決上一個虛擬機問題,jdk1.2時,sun提供了此虛擬機,Exact Memory Management(準確式記憶體管理),也可以叫Non-Conservative/Accurate Memory Management;
- 特點是虛擬機可以知道記憶體中某個位置的資料具體是什么型別;同時也具備現代高性能虛擬機的雛形,熱點探測和編譯器與決議器混合的作業模式,
- Exact VM只在Solaris平臺短暫使用,其他平臺上還是classic vm,
3、HotSpot VM
- HotSpot歷史最初由一家名為“Longview Technologies”的小公司設計,
- 1997年,此公司被Sun收購;2009年,Sun公司被甲骨文收購,
- JDK1.3時,HotSpot VM成為java默認的虛擬機,
- 特點:從他的名稱中HotSpot指的就是它的熱點代碼探測技術,
- 作業:通過計數器找到最具編譯價值的代碼,觸發即時編譯(JIT)或堆疊上替換;通過編譯器與解釋器協同作業,在最優化的程式回應時間與最佳執行性能中取得平衡,
- HotSpot VM不管是現在廣泛使用JDK6,還是使用比較多的JDK8中,默認的虛擬機都是HotSpot;也是Sun/Oracle JDK和OpenJDK的默認虛擬機,
- HotSpot VM從服務器、桌面到移動端、嵌入式都有應用,
4、JRockit
- MissionControl服務套件,它是一組以極低的開銷來監控、管理和分析生產環境中的應用程式的工具,全面的Java運行時解決方案組合;2008,BEA被Oracle收購,
- 使用JRockit產品,性能有顯著的提高(一些超過了70%)和硬體成本的減少(達50%);
- JRockit面向延遲敏感型應用的解決方案JRockit Real Time提供以毫秒或微秒級的JVM回應時間,適合財務、軍事指揮、電信網路的需要;
- Oracle表達了整合兩大優秀虛擬機的作業,大致在JDK8中完成,整合的方式是在HotSpot的基礎上,移植JRockit的優秀特性;
- JRockit專注于服務器端應用,它可以不太關注程式的啟動速度,因此JRockit內部不包含決議器實作,全部代碼都靠即時編譯器編譯后執行;大量的行業基準測驗顯示,JRockit JVM是世界上最快的JVM,
5、J9 JVM
- 全稱:IBM Technology for Java Virtual Machine,簡稱IT4J,內部代號:J9
- 市場定位于HotSpot接近,服務器端、桌面應用、嵌入式等多用途JVM;
- 廣泛用于IBM的各種Java產品;
- 目前,有影響力的三大商用虛擬機之一,也號稱是世界上最快的Java虛擬機(在IBM自己的產品上穩定);
- 2017年左右,IBM發布了開源J9 VM,命名OpenJ9,交給Eclipse基金會管理,也稱為Eclipse OpenJ9;
6、Azul
- 這里Azul VM和BEA Liquid VM是與特定硬體平臺系結、軟硬體配合的專有虛擬機
- 高性能Java虛擬機中的戰斗機;
- Azul VM是Azul Systems公司在HotSpot基礎上進行大量改進,運行于Azul Systems公司的專有硬體Vega系統上的Java虛擬機,
- 每個Azul VM實體都可以管理至少數十個CPU和數百GB記憶體的硬體資源,并提供在巨大記憶體范圍內實作可控的GC時間的垃圾收集器、專有硬體優化的執行緒調度等優秀特性,
- 2010年,Azul Systems公司開始從硬體轉向軟體,發布了自己的Zing JVM,可以在通用X86平臺上提供接近于Vega系統的特性;
7、Liquid
- Liquid是BEA公司開發的高性能Java虛擬機中的戰斗機;
- 運行在自家研發的Hypervisor系統上;
- Liquid VM即是現在的JRockit VE(Virtual Edition),Liquid VM不需要作業系統的支持,或者說它自己本身實作了一個專有作業系統的必要功能,如執行緒調度、檔案系統、網路支持等;
- 隨著JRockit虛擬機終止開發,Liquid VM專案也停止了;
8、Apache Harmony
- Apache也曾推出過于JDK1.5和JDK1.6兼容的Java運行平臺Apache Harmony;
- Apache Harmony是IBM和Intel聯合開發的開源JVM,受到同樣開源的OpenJDK的壓制,SUN堅決不讓Harmony獲得JCP認證,最終于2011年退役,IBM轉而參與OpenJDK;
- 雖然目前并沒有Apache Harmony被大規模商用的案例,但是它的Java類別庫代碼吸納進了Android SDK;
9、Microsoft JVM
- 微軟為了在IE3瀏覽器中支持JAVA Applets,開發了Microsoft JVM;
- 只能在Windows平臺下運行,但卻是當時windows下性能最好的Java JVM;
- 1997年,Sun以侵犯商標、不正當競爭罪名指控微軟成功,賠了Sun很多錢,微軟在WindowsXP SP3中抹掉了其JVM,現在windows上安裝的jdk都是HotSpot,
10、Taobao JVM(國產研發)
- 由Ali JVM 團隊發布,阿里,國內使用Java最強大的公司,覆寫云計算、金融、物流、電商等眾多領域,需要解決高并發、高可用、分布式的復合問題,有大量的開源產品,
- 基于OpenJDK 開發了自己的定制版本AlibabaJDK,簡稱AJDK,是整個阿里JAVA體系的基石;
- 基于OpenJDK HotSpot JVM發布的國內第一個優化、深度定制且開源的高性能服務器版Java虛擬機;
- 創新的GCIH(GC invisible heap)技術實作了off-heap,即將生命周期較長的Java物件從heap中移到heap之外,并且GC不能管理GCIH內部的Java物件,以此達到降低GC的回收頻率和提升GC的回收效率的目的,
- GCIH中的物件還能夠在多個Java虛擬機行程中實作共享
- 使用crc32指令實作JVM intrinsic降低JNI的呼叫開銷;
- PMU hardware的Java profiling tool和診斷協助功能
- taobao JVM應用在阿里產品上性能高,硬體嚴重依賴intel的cpu,損失了兼容性,但提高了性能;
11、Dalvik JVM
- Dalvik JVM是谷歌開發的,應用于Android系統,并在Android2.2中提供了JIT,發展迅猛;
- Dalvik JVM只能稱作虛擬機,而不能稱作 “Java 虛擬機”,它沒有遵循Java虛擬機規范;
- 不能直接執行Java的Class檔案;
- 基于暫存器架構,不是JVM的堆疊架構;
- 執行的是編譯后的dex(Dalvik Executable)檔案,執行效率比較高;
- 它執行的dex(Dalvik Executable)檔案可以通過Class檔案轉化而來,使用Java語法撰寫應用程式,可以直接使用大部分的Java API等;
- Android 5.0使用支持提前編譯(Ahead of Time Compilation,AOT)的ART VM替換Dalvik VM,
12、Graal VM
- 2018年4月 Oracle Labs公開了Graal VM,號稱“Run Programs Faster Anywhere”,與1995年java的“write once, run anywhere”遙相呼應;
- Graal vm在HotSpot VM基礎上增強而成的跨語言全堆疊虛擬機,可以作為“任何語言”的運行平臺使用,語言包括:java、Scala、Groovy、Kotlin、C、C++、JavaScript、Ruby、Python、R等;
- 支持不同語言中混用對方的介面和物件,支持這些語言使用已經撰寫好的本地庫檔案;
- 作業原理是將這些語言的源代碼或源代碼編譯后的中間格式,通過解釋器轉換為能被Graal VM接受的中間表示,Graal VM提供Truffle工具集快速構建而向一種新語言的解釋器,在運行時還能進行即時編譯優化,獲得比原生編譯器更優秀的執行效率;
- 如果說HotSpot有一天真的被取代,Graal VM希望最大,但是Java的軟體生態沒有絲毫變化;
四、這么多的虛擬機,我們應該怎么學習呢
- 當然我們的學習與我們息息相關的HotSpot VM,現在我們大多公司開發中,使用的的java虛擬機都是HotSpot VM,當然你也可以使用Java -version命令查看一下你安裝的java版本和java虛擬機,
- 打開cmd,輸入命令:java -version

五、Java虛擬機的特點
- 跨平臺的語言
- 一次編譯,到處運行
- 自動記憶體管理
- 自動垃圾回收功能
- 多語言混合編程:Java平臺_上的多語言混合編程正成為主流,通過特定領域的語言去解決特定領域的問題是當前軟體開發應對日趨復雜的專案需求的一個方向,試想一下,在一個專案之中,并行處理用Clojure語言撰寫,展示層使用JRuby/Rails,中間層則是Java,每個應用層都將使用不同的編程語言來完成,而且,介面對每一層的開發者都是透明的,各種語言之間的互動不存在任何困難,就像使用自己語言的原生API- -樣方便,因為它們最終都運行在-一個虛擬機之上,
- 隨著Java7的正式發布,Java虛擬機的設計者們通過JSR-292規范基本實作在Java虛擬機平臺上運行非Java語言撰寫的程式,
- Java虛擬機根本不關心運行在其內部的程式到底是使用何種編程語言撰寫的,它只關心“位元組碼”檔案,也就是說Java虛擬機擁有語言無關性,并不會單純地與Java語言“終身系結”,只要其他編程語言的編譯結果滿足并包含Java虛擬機的內部指令集、符號表以及其他的輔助資訊,它就是-一個有效的位元組碼檔案,就能夠被虛擬機所識別并裝載運行,
六、補充一下Java發生的重大事件
- 1990年,在Sun計算機公司中,由Patrick Naughton、MikeSheridan及James Gosling領導的小組Green Team,開發出的新的程式語言,命名為0ak, 后期命名為Java,
- 1995年, Sun 正式發布Java和HotJava產品,Java 首次公開亮相,
- 1996年1月23 日Sun Microsystems發布了JDK 1.0,
- 1998年,JDK 1.2版本發布,同時,Sun發布了JSP/Servlet、EJB規范,以及將Java分成了J2EE、 J2SE和J2ME,這表明 了Java開始向 企業、桌面應用和移動設備應用3大領域挺進,
- 2000年, JDK 1.3發布,Java HotSpot Virtual Machine正式發布,成為Java的默認虛擬機,
- 2002年, JDK 1.4發布,古老的Classic虛擬機退出歷史舞臺,
- 2003年年底,Java平臺的Scala正式發布,同年Groovy也加入了Javal陣營 ,
- 2004年, JDK 1.5發布,同時JDK 1.5改名為JavaSE 5.0,
- 2006年,JDK 6發布,同年,Java開源并建立了OpenJDK, 順理成章,Hotspot虛擬機也成為了OpenJDK中 的默認虛擬機,
- 2007年, Java平臺迎來了新伙伴Clojure.
- 2008 年,Oracle收購了BEA, 得到了JRockit 虛擬機,.
- 2009年, Twitter宜 布把后臺大部分程式從Ruby遷移到Scala,這是Java平臺的又一次大規模應用,
- 2010年, Oracle收購了Sun,獲得Java商標和最具價值的Hotspot虛擬機,此時,Oracle擁有市場占用率最高的兩款虛擬機HotSpot和JRockit,并計劃在未來對它們進行整合: HotRockit
- 2011年,JDK7發布,在JDK 1.7u4中,正式啟用了新的垃圾回收器G1,
- 2017年, JDK9發布,將G1設定為默認GC,替代CMS,同年,IBM的J9開源, 形成了現在的0pen J9社區
- 2018年, Android的Java侵權案判決,Google賠 償Oracle計88億美元;同年,Oracle宣告JavaEE成為歷史名詞,JDBC、JMS、 Servlet贈予Eclipse基金會;同年,JDK11發布,LTS版本的JDK,發布革命性的ZGC,調整JDK授權許可
- 2019年,JDK12發布,加入RedHat領導開發的Shenandoah GC
后續學習請關注博主,持續更新分享java虛擬機的優化與原理應用,下次見,
更多學習請到:https://mp.csdn.net/console/editor/html/112061984
知識腦圖學習:https://www.processon.com/view/60504b5ff346fb348a93b4fa#map
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271885.html
標籤:其他
