Hello,今天給各位童鞋們分享的是JVM,趕忙拿出小本子記下來吧java
Java虛擬機的啓動是經過引導類加載器(bootstrap class loader)建立一個初始類(initial class)來完成的,這個類是由虛擬機的具體實現指定的。bootstrap
一個運行中的Java虛擬機有着一個清晰的任務:執行Java程序。windows
程序開始執行時他才運行,程序結束時他就中止。瀏覽器
執行一個所謂的Java程序的時候,真真正正在執行的是一個叫作Java虛擬機的進程。緩存
有以下的幾種狀況:安全
程序正常執行結束服務器
程序在執行過程當中遇到了異常或錯誤而異常終止markdown
因爲操做系統出現錯誤而致使Java虛擬機進程終止網絡
某線程調用Runtime類或system類的exit方法,或Runtime類的halt方法,而且Java安全管理器也容許此次exit或halt操做。架構
除此以外,JNI(Java Native Interface)規範描述了用JNI Invocation API來加載或卸載 Java虛擬機時,Java虛擬機的退出狀況。
早在1996年Java1.0版本的時候,Sun公司發佈了一款名爲sun classic VM的Java虛擬機,它同時也是世界上第一款商用Java虛擬機,JDK1.4時徹底被淘汰。
這款虛擬機內部只提供解釋器。如今還有及時編譯器,所以效率比較低,而及時編譯器會把熱點代碼緩存起來,那麼之後使用熱點代碼的時候,效率就比較高。
若是使用JIT編譯器,就須要進行外掛。可是一旦使用了JIT編譯器,JIT就會接管虛擬機的執行系統。解釋器就再也不工做。解釋器和編譯器不能配合工做。
如今hotspot內置了此虛擬機。
爲了解決上一個虛擬機問題,jdk1.2時,sun提供了此虛擬機。 Exact Memory Management:準確式內存管理
也能夠叫Non-Conservative/Accurate Memory Management
虛擬機能夠知道內存中某個位置的數據具體是什麼類型。|
具有現代高性能虛擬機的維形
熱點探測(尋找出熱點代碼進行緩存)
編譯器與解釋器混合工做模式
只在solaris平臺短暫使用,其餘平臺上仍是classic vm,英雄氣短,終被Hotspot虛擬機替換
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 JVM是世界上最快的JVM。
使用JRockit產品,客戶已經體驗到了顯著的性能提升(一些超過了70%)和硬件成本的減小(達50%)。
優點:全面的Java運行時解決方案組合
JRockit面向延遲敏感型應用的解決方案JRockit Real Time提供以毫秒或微秒級的JVM響應時間,適合財務、軍事指揮、電信網絡的須要
MissionControl服務套件,它是一組以極低的開銷來監控、管理和分析生產環境中的應用程序的工具。
2008年,JRockit被oracle收購。
oracle表達了整合兩大優秀虛擬機的工做,大體在JDK8中完成。整合的方式是在HotSpot的基礎上,移植JRockit的優秀特性。
高斯林:目前就任於谷歌,研究人工智能和水下機器人
全稱:IBM Technology for Java Virtual Machine,簡稱IT4J,內部代號:J9
市場定位與HotSpot接近,服務器端、桌面應用、嵌入式等多用途VM普遍用於IBM的各類Java產品。
目前,有影響力的三大商用虛擬機之一,也號稱是世界上最快的Java虛擬機。
2017年左右,IBM發佈了開源J9VM,命名爲openJ9,交給EClipse基金會管理,也稱爲Eclipse OpenJ9
OpenJDK -> 是JDK開源了,包括了虛擬機
oracle在Java ME產品線上的兩款虛擬機爲:CDC/CLDC HotSpot Implementation VM KVM(Kilobyte)是CLDC-HI早期產品目前移動領域地位尷尬,智能機被Angroid和ioS二分天下。
KVM簡單、輕量、高度可移植,面向更低端的設備上還維持本身的一片市場
智能控制器、傳感器
老人手機、經濟欠發達地區的功能手機
全部的虛擬機的原則:一次編譯,處處運行。
前面三大「高性能Java虛擬機」使用在通用硬件平臺上這裏Azu1VW和BEALiquid VM是與特定硬件平臺綁定、軟硬件配合的專有虛擬機I
高性能Java虛擬機中的戰鬥機。
Azul VM是Azu1Systems公司在HotSpot基礎上進行大量改進,運行於Azul Systems公司的專有硬件Vega系統上的ava虛擬機。
每一個Azu1VM實例均可以管理至少數十個CPU和數百GB內存的硬件資源,並提供在巨大內存範圍內實現可控的GC時間的垃圾收集器、專有硬件優化的線程調度等優秀特性。
2010年,AzulSystems公司開始從硬件轉向軟件,發佈了本身的zing JVM,能夠在通用x86平臺上提供接近於Vega系統的特性。
高性能Java虛擬機中的戰鬥機。
BEA公司開發的,直接運行在自家Hypervisor系統上Liquid VM便是如今的JRockit VE(Virtual Edition),
Liquid VM不須要操做系統的支持,或者說它本身自己實現了一個專用操做系統的必要功能,如線程調度、文件系統、網絡支持等。
隨着JRockit虛擬機終止開發,Liquid vM項目也中止了。
Apache也曾經推出過與JDK1.5和JDK1.6兼容的Java運行平臺Apache Harmony。
它是IElf和Inte1聯合開發的開源JVM,受到一樣開源的openJDK的壓制,Sun堅定不讓Harmony得到JCP認證,最終於2011年退役,IBM轉而參與OpenJDK
雖然目前並無Apache Harmony被大規模商用的案例,可是它的Java類庫代碼吸納進了Android SDK。
微軟爲了在IE3瀏覽器中支持Java Applets,開發了Microsoft JVM。
只能在window平臺下運行。但確是當時Windows下性能最好的Java VM。
1997年,sun以侵犯商標、不正當競爭罪名指控微軟成功,賠了sun不少錢。微軟windowsXPSP3中抹掉了其VM。如今windows上安裝的jdk都是HotSpot。
由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版本所有替換了。
谷歌開發的,應用於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。
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爲默認虛擬機。
好啦,今天的文章就到這裏了,但願可以幫助到屏幕前迷茫的大家