Java是一門能夠跨平臺的語言,可是Java自己是不能夠實現跨平臺的,須要JVM實現跨平臺。javac編譯好後的class文件,在Windows、Linux、Mac等系統上,只要該系統安裝對應的Java虛擬機,class文件均可以運行。達到 」一次編譯,處處運行」 的效果。java
JVM是能夠運行在Java代碼的虛擬的計算機,既然是虛擬的計算機,固然也包含本身的CPU、字節碼指令集、寄存器、棧、垃圾回收、堆和存儲方法域,咱們能夠理解成JVM本身就是一套操做系統。linux
Virtual Machine是物理機器的軟件實現。Java是用在VM上運行的WORA(Write Once Run Anywhere)概念而開發的。編譯器將Java文件編譯爲Java .class文件,而後將.class文件輸入到JVM中,JVM會加載並執行類文件,以下圖所示:程序員
對於Java代碼來講,是對於一個java類的編譯,利用java編譯器(javac.exe)將源碼編譯成可以被JVM的類加載器加載的.class文件(字節碼),字節碼不是機器碼,是一箇中間代碼,與平臺無關。java編譯一個類的時候,若是這個類所依賴的類尚未被編譯,編譯器就會先編譯這個被依賴的類,而後引用,若是java編譯器在指定的目錄下找不到該類所依賴的類的 .class文件或者 .java源文件,就會報 "Cant found sysbol"
的異常錯誤。macos
編譯後的字節碼文件格式主要分爲兩部分:常量池和方法字節碼。windows
java類執行的過程大概分爲兩個步驟:性能優化
須要說明的一點的是:JVM主要在程序第一次運行時主動使用類的時候,纔會當即去加載。換言之,JVM並非在運行時就會把全部使用到的類都加載到內存中,而是用到,不得不加載的時候,才加載進來,並且只加載一次。架構
目前有一百多種語言能夠跑在Java虛擬機上....oracle
意思是說程序員寫代碼的時候只須要寫一次代碼,javac編譯也只編譯一次,可是能夠在windows上運行,也能夠把打好的包放到linux或者macos上運行。jvm
任何語言只要使用提供的編譯器編譯相應的語言,經過jvm就能夠運行了ide
任何語言只要你能編譯成class就能夠編譯在JVM上
JVM是一種規範
(1)虛擬機是一種抽象的計算機,經過從實際的計算機中仿真模擬各類計算機功能來實現的。JAVA虛擬機規範是一種對JAVA虛擬機實現的規範要求,是由oracle制定的,而咱們平時常說的JAVA虛擬機通常是指的一種具體的JAVA虛擬機規範的實現。好比咱們最常用的JAVA虛擬機hotspot,其實JAVA虛擬機還有不少種實現,甚至若是你對JAVA虛擬機規範有了深刻的瞭解並且對此有興趣的話,能夠寫一個本身的JAVA虛擬機,固然這其中的難度不難想象。Java虛擬機有本身完善的硬體架構,如處理器、堆棧、寄存器等,還具備相應的指令系統。JVM屏蔽了與具體操做系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就能夠在多種平臺上不加修改地運行。
(2)JVM是Java程序運行的環境,同時是一個操做系統的一個應用程序進程,所以它有本身的生命週期,也有己的代碼和數據空間。
(3)JVM體系主要是兩個JVM的內部體系結構分爲三個子系統和兩大組件,分別是: 類裝載(ClassLoader)子系統、執行引擎子系統和GC子系統 組件是內存運行數據區域和本地接口。
HotSpot VM,它是Sun JDK和OpenJDK中所帶的虛擬機,也是目前使用範圍最廣的Java虛擬機。
但不必定全部人都知道的是,這個目前看起來「血統純正」的虛擬機在最初並不是由Sun公司開發,而是由一家名爲「Longview Technologies」的小公司設計的;
甚至這個虛擬機最初並不是是爲Java語言而開發的,它來源於Strongtalk VM,
而這款虛擬機中至關多的技術又是來源於一款支持Self語言實現「達到C語言50%以上的執行效率」的目標而設計的虛擬機,
Sun公司注意到了這款虛擬機在JIT編譯上有許多優秀的理念和實際效果,在1997年收購了Longview Technologies公司,從而得到了HotSpot VM。
HotSpot VM既繼承了Sun以前兩款商用虛擬機的優勢(如前面提到的準確式內存管理),也有許多本身新的技術優點,
如它名稱中的HotSpot指的就是它的熱點代碼探測技術(其實兩個VM基本上是同時期的獨立產品,HotSpot還稍早一些,HotSpot一開始就是準確式GC,
而Exact VM之中也有與HotSpot幾乎同樣的熱點探測。
爲了Exact VM和HotSpot VM哪一個成爲Sun主要支持的VM產品,在Sun公司內部還有過爭論,HotSpot戰勝Exact並不能算技術上的勝利),
HotSpot VM的熱點代碼探測能力能夠經過執行計數器找出最具備編譯價值的代碼,而後通知JIT編譯器以方法爲單位進行編譯。
若是一個方法被頻繁調用,或方法中有效循環次數不少,將會分別觸發標準編譯和OSR(棧上替換)編譯動做。
經過編譯器與解釋器恰當地協同工做,能夠在最優化的程序響應時間與最佳執行性能中取得平衡,並且無須等待本地代碼輸出才能執行程序,
即時編譯的時間壓力也相對減少,這樣有助於引入更多的代碼優化技術,輸出質量更高的本地代碼。
在2006年的JavaOne大會上,Sun公司宣佈最終會把Java開源,並在隨後的一年,陸續將JDK的各個部分(其中固然也包括了HotSpot VM)在GPL協議下公開了源碼,
並在此基礎上創建了OpenJDK。這樣,HotSpot VM便成爲了Sun JDK和OpenJDK兩個實現極度接近的JDK項目的共同虛擬機。
在2008年和2009年,Oracle公司分別收購了BEA公司和Sun公司,這樣Oracle就同時擁有了兩款優秀的Java虛擬機:JRockit VM和HotSpot VM。
Oracle公司宣佈在不久的未來(大約應在發佈JDK 8的時候)會完成這兩款虛擬機的整合工做,使之優點互補,因此咱們如今使用的虛擬機應該就是整合以後的虛擬機。
整合的方式大體上是在HotSpot的基礎上,移植JRockit的優秀特性,譬如使用JRockit的垃圾回收器與MissionControl服務,使用HotSpot的JIT編譯器與混合的運行時系統。
查看JVM,咱們只須要使用 java -version
就能夠查看了
jrockit前身是BA jrockit,後被oracle收購,並免費發佈,但並不開源。
jrockit能夠看作是兼容標準的JDK基礎上的JVM,同原有的JVM相比,jrockit聲稱在速度上有顯著的提升(甚至超過70%),jrockit在速度上的優點使其應用在時間敏感的領域內,如軍事,電信,控制等,這也得益於其針對不一樣處理器架構所作的優化,曾經號稱是世界上最快的JVM
J9 是一個IBM推出的Java虛擬機和類庫,J9在IBM的從移動設備到企業解決方案中普遍的被使用
來自於微軟的JVM
hotspot深度定製版,除了在性能優化方面下足了功夫,TaobaoVM還在HotSpot的基礎之上大幅度擴充了一些特定的加強實現。好比創新的GCIH(GC invisible heap)技術實現off-heap,這樣一來就能夠將生命週期較長的Java對象從heap中移至heap以外,而且GC不能管理GCIH內部的Java對象,這樣作最大的好處就是下降了GC的回收平率以及提高了GC的回收效率,而且GCIH中的對象還可以在多個Java虛擬機進程中實現共享。其餘擴充技術還有利用PMU hardware的Java profiling tool和診斷協助功能等。
聽說淘寶裏面大概有十我的可以手寫TaobaoVM,都是P9 P10級別的
直接針對於硬件
最新垃圾回收的業界標杆,性能極高,可是這個是收費的,而且只有土豪才用的起。
官網:www.azul.com
JVM : 英文名稱(Java Virtual Machine),就是咱們耳熟能詳的 Java 虛擬機。它只認識 xxx.class 這種類型的文件,它可以將 class 文件中的字節碼指令進行識別並調用操做系統向上的 API 完成動做。因此說,jvm 是 Java 可以跨平臺的核心,具體的下文會詳細說明。
JRE : 英文名稱(Java Runtime Environment),咱們叫它:Java 運行時環境。它主要包含兩個部分,jvm 的標準實現和 Java 的一些基本類庫。它相對於 jvm 來講,多出來的是一部分的 Java 類庫。
JDK : 英文名稱(Java Development Kit),Java 開發工具包。jdk 是整個 Java 開發的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。
顯然,這三者的關係是:一層層的嵌套關係。 JDK>JRE>JVM
爲何咱們的電腦在裝完 jdk 後會有兩個版本的 jre?
沒有聯繫。甚至準確的來講,它倆是同樣的,不管是用哪個都是能夠的。只是不少人習慣將會單獨安裝另外一個 jre,雖然單獨安裝的 jre 也並無被使用,緣由可能就是剛開始你們都不清楚 jdk 和 jre 之間的關係,因此就默認的都安裝上了。
今天的JVM知識點就講完了,有疑問的小夥伴能夠留言或評論
怕什麼真理無窮,進一步有進一步的歡喜,我是牧小農,你們加油!!!