一 JVM生命週期虛擬機器的啟動Java虛擬機器的啟動是通過引導類載入器(bootstrap class loader)創建一個初始類(initial class)來完成的,這個類是由虛擬機器的具體實現指定的。虛
2021-07-04 03:03:50
一 JVM生命週期
虛擬機器的啟動
Java虛擬機器的啟動是通過引導類載入器(bootstrap class loader)創建一個初始類(initial class)來完成的,這個類是由虛擬機器的具體實現指定的。
虛擬機器的執行
一個運行中的Java虛擬機器有著一個清晰的任務:執行Java程式。
程式開始執行時他才運行,程式結束時他就停止。
執行一個所謂的Java程式的時候,真真正正在執行的是一個叫做Java虛擬機器的程序。
虛擬機器的退出
有如下的幾種情況:
程式正常執行結束
程式在執行過程中遇到了異常或錯誤而異常終止
由於作業系統出現錯誤而導致Java虛擬機器程序終止
某執行緒呼叫Runtime類或system類的exit方法,或Runtime類的halt方法,並且Java安全管理器也允許這次exit或halt操作。
除此之外,JNI(Java Native Interface)規範描述了用JNI Invocation API來載入或解除安裝 Java虛擬機器時,Java虛擬機器的退出情況。
二 JVM發展歷程
Sun Classic VM
早在1996年Java1.0版本的時候,Sun公司釋出了一款名為sun classic VM的Java虛擬機器,它同時也是世界上第一款商用Java虛擬機器,JDK1.4時完全被淘汰。
這款虛擬機器內部只提供直譯器。現在還有及時編譯器,因此效率比較低,而及時編譯器會把熱點程式碼快取起來,那麼以後使用熱點程式碼的時候,效率就比較高。
如果使用JIT編譯器,就需要進行外掛。但是一旦使用了JIT編譯器,JIT就會接管虛擬機器的執行系統。直譯器就不再工作。直譯器和編譯器不能配合工作。
現在hotspot內建了此虛擬機器。
Exact VM
為了解決上一個虛擬機器問題,jdk1.2時,sun提供了此虛擬機器。 Exact Memory Management:準確式記憶體管理
也可以叫Non-Conservative/Accurate Memory Management
虛擬機器可以知道記憶體中某個位置的資料具體是什麼類型。|
具備現代高效能虛擬機器的維形
熱點探測(尋找出熱點程式碼進行快取)
編譯器與直譯器混合工作模式
只在solaris平臺短暫使用,其他平臺上還是classic vm,英雄氣短,終被Hotspot虛擬機器替換
HotSpot VM
HotSpot歷史
最初由一家名為「Longview Technologies」的小公司設計
1997年,此公司被sun收購;2009年,Sun公司被甲骨文收購。
JDK1.3時,HotSpot VM成為預設虛擬機器
目前Hotspot佔有絕對的市場地位,稱霸武林。
不管是現在仍在廣泛使用的JDK6,還是使用比例較多的JDK8中,預設的虛擬機器都是HotSpot
Sun/oracle JDK和openJDK的預設虛擬機器
因此本課程中預設介紹的虛擬機器都是HotSpot,相關機制也主要是指HotSpot的Gc機制。(比如其他兩個商用虛機都沒有方法區的概念)
從伺服器、桌面到移動端、嵌入式都有應用。
名稱中的HotSpot指的就是它的熱點程式碼探測技術。
通過計數器找到最具編譯價值程式碼,觸發即時編譯或棧上替換
通過編譯器與直譯器協同工作,在最優化的程式響應時間與最佳執行效能中取得平衡
JRockit
專注於伺服器端應用
它可以不太關注程式啟動速度,因此JRockit內部不包含解析器實現,全部程式碼都靠即時編譯器編譯後執行。
大量的行業基準測試顯示,JRockit JVM是世界上最快的JVM。
使用JRockit產品,客戶已經體驗到了顯著的效能提高(一些超過了70%)和硬體成本的減少(達50%)。
優勢:全面的Java運行時解決方案組合
JRockit面向延遲敏感型應用的解決方案JRockit Real Time提供以毫秒或微秒級的JVM響應時間,適合財務、軍事指揮、電信網路的需要
MissionControl服務套件,它是一組以極低的開銷來監控、管理和分析生產環境中的應用程式的工具。
2008年,JRockit被oracle收購。
oracle表達了整合兩大優秀虛擬機器的工作,大致在JDK8中完成。整合的方式是在HotSpot的基礎上,移植JRockit的優秀特性。
高斯林:目前就職於谷歌,研究人工智慧和水下機器人
IBM的J9
全稱:IBM Technology for Java Virtual Machine,簡稱IT4J,內部代號:J9
市場定位與HotSpot接近,伺服器端、桌面應用、嵌入式等多用途VM廣泛用於IBM的各種Java產品。
目前,有影響力的三大商用虛擬機器之一,也號稱是世界上最快的Java虛擬機器。
2017年左右,IBM釋出了開源J9VM,命名為openJ9,交給EClipse基金會管理,也稱為Eclipse OpenJ9
OpenJDK -> 是JDK開源了,包括了虛擬機器
KVM和CDC / CLDC Hotspot
oracle在Java ME產品線上的兩款虛擬機器為:CDC/CLDC HotSpot Implementation VM KVM(Kilobyte)是CLDC-HI早期產品目前移動領域地位尷尬,智慧機被Angroid和ioS二分天下。
KVM簡單、輕量、高度可移植,面向更低端的裝置上還維持自己的一片市場
智慧控制器、感測器
老人手機、經濟欠發達地區的功能手機
所有的虛擬機器的原則:一次編譯,到處運行。
Azul VM
前面三大「高效能Java虛擬機器」使用在通用硬體平臺上這裡Azu1VW和BEALiquid VM是與特定硬體平臺繫結、軟硬體配合的專有虛擬機器I
高效能Java虛擬機器中的戰鬥機。
Azul VM是Azu1Systems公司在HotSpot基礎上進行大量改進,運行於Azul Systems公司的專有硬體Vega系統上的ava虛擬機器。
每個Azu1VM例項都可以管理至少數十個CPU和數百GB記憶體的硬體資源,並提供在巨大記憶體範圍內實現可控的GC時間的垃圾收集器、專有硬體優化的執行緒排程等優秀特性。
2010年,AzulSystems公司開始從硬體轉向軟體,釋出了自己的zing JVM,可以在通用x86平臺上提供接近於Vega系統的特性。
Liquid VM
高效能Java虛擬機器中的戰鬥機。
BEA公司開發的,直接運行在自家Hypervisor系統上Liquid VM即是現在的JRockit VE(Virtual Edition),
Liquid VM不需要作業系統的支援,或者說它自己本身實現了一個專用作業系統的必要功能,如執行緒排程、檔案系統、網路支援等。
隨著JRockit虛擬機器終止開發,Liquid vM項目也停止了。
Apache Marmony
Apache也曾經推出過與JDK1.5和JDK1.6相容的Java運行平臺Apache Harmony。
它是IElf和Inte1聯合開發的開源JVM,受到同樣開源的openJDK的壓制,Sun堅決不讓Harmony獲得JCP認證,最終於2011年退役,IBM轉而參與OpenJDK
雖然目前並沒有Apache Harmony被大規模商用的案例,但是它的Java類庫程式碼吸納進了Android SDK。
Micorsoft JVM
微軟為了在IE3瀏覽器中支援Java Applets,開發了Microsoft JVM。
只能在window平臺下運行。但確是當時Windows下效能最好的Java VM。
1997年,sun以侵犯商標、不正當競爭罪名指控微軟成功,賠了sun很多錢。微軟windowsXPSP3中抹掉了其VM。現在windows上安裝的jdk都是HotSpot。
Taobao JVM
由AliJVM團隊釋出。阿里,國內使用Java最強大的公司,覆蓋雲端計算、金融、物流、電商等眾多領域,需要解決高併發、高可用、分散式的複合問題。有大量的開源產品。
基於openJDK開發了自己的定製版本AlibabaJDK,簡稱AJDK。是整個阿里Java體系的基石。
基於openJDK Hotspot VM釋出的國內第一個優化、深度定製且開源的高效能伺服器版Java虛擬機器。
創新的GCIH(GCinvisible heap)技術實現了off-heap,即將生命週期較長的Java物件從heap中移到heap之外,並且Gc不能管理GCIH內部的Java物件,以此達到降低GC的回收頻率和提升Gc的回收效率的目的。
GCIH中的物件還能夠在多個Java虛擬機器程序中實現共享
使用crc32指令實現JvM intrinsic降低JNI的呼叫開銷
PMU hardware的Java profiling tool和診斷協助功能
針對大資料場景的ZenGc
taobao vm應用在阿里產品上效能高,硬體嚴重依賴inte1的cpu,損失了相容性,但提高了效能
目前已經在淘寶、天貓上線,把oracle官方JvM版本全部替換了。
Dalvik VM
谷歌開發的,應用於Android系統,並在Android2.2中提供了JIT,發展迅猛。
Dalvik y只能稱作虛擬機器,而不能稱作「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。
Graal VM
2018年4月,oracle Labs公開了GraalvM,號稱 "Run Programs Faster Anywhere",勃勃野心。與1995年java的」write once,run anywhere"遙相呼應。
GraalVM在HotSpot VM基礎上增強而成的跨語言全棧虛擬機器,可以作為「任何語言」 的運行平臺使用。語言包括:Java、Scala、Groovy、Kotlin;C、C++、Javascript、Ruby、Python、R等
支援不同語言中混用對方的介面和物件,支援這些語言使用已經編寫好的本地庫檔案
工作原理是將這些語言的原始碼或原始碼編譯後的中間格式,通過直譯器轉換為能被Graal VM接受的中間表示。Graal VM提供Truffle工具集快速構建面向一種新語言的直譯器。在運行時還能進行即時編譯優化,獲得比原生編譯器更優秀的執行效率。
如果說HotSpot有一天真的被取代,Graalvm希望最大。但是Java的軟體生態沒有絲毫變化。
總結
具體JVM的記憶體結構,其實取決於其實現,不同廠商的JVM,或者同一廠商釋出的不同版本,都有可能存在一定差異。主要以oracle HotSpot VM為預設虛擬機器。
相關文章
一 JVM生命週期虛擬機器的啟動Java虛擬機器的啟動是通過引導類載入器(bootstrap class loader)創建一個初始類(initial class)來完成的,這個類是由虛擬機器的具體實現指定的。虛
2021-07-04 03:03:50
6月2日,華為鴻蒙的正式問世,在一定程度上意味著EMUI完成了歷史使命,宣佈正式收官。作為一款基於萬物網際網路的分散式系統,鴻蒙作業系統最大的意義在於適用於智慧手機、汽車等全
2021-07-04 03:03:36
眾所周知,在GPU領域,也就是在顯示卡領域,有三大霸主,分別是intel、nvidia、AMD。從2020年的資料來看,整個PC市場的GPU市場分佈情況是英特爾排第一,份額高達63%左右,而AMD、nvidia份
2021-07-04 03:03:29
今年6月8日,微軟在安全更新中修復了一個長時間存在的印表機服務Windows Print Spooler本地提權漏洞,漏洞編號為:CVE-2021-1675,普通使用者可以利用此漏洞以管理員身份在運行列印
2021-07-04 03:03:22
在華為的新一代P系列旗艦之外,最近也陸續出現了不少與華為MatePad 11相關的新品爆料。現在,關於這款新品也再次出現了更多的資訊。 今天,華為商城的官方頁面顯示,其將於7月6日帶
2021-07-04 03:03:13
大資料文摘授權轉載自資料實戰派作者:Yoshua Bengio, Yann Lecun, Geoffrey Hinton譯者:LZM人工神經網路的研究源於以下觀察:人類智慧來自於高度並行的、相對簡單的非線性神經
2021-07-04 03:03:09