1. 程式人生 > 程式設計 >JVM從零開始:Java重要概念與JVM(二)

JVM從零開始:Java重要概念與JVM(二)

原文地址:www.sudo.ren/article/81?…

Java的體系結構主要由Java程式語言、位元組碼、Java API 和Java虛擬機器器相關技術組成。 1.Java語言編寫程式; 2.前端編譯器(javac)將Java原始碼編譯為位元組碼檔案(*.class); 3.JVM將位元組碼裝載進其內部,然後解釋/編譯為對應平臺上的機器指令。

Java語言:Java大約定義51個關鍵字。

Java繼承了C語言的語法結構,改編了C++的物件模型。並且Java捨棄了C和C++中很多不安全的語法特性。比如:

  • 廢棄指標操作;
  • 自動記憶體管理;
  • 陣列邊界檢查;
  • 型別轉換檢查;
  • 執行緒安全機制;
  • 物理環境訪問限制。

位元組碼:

Java原始碼的編譯結果不是本地機器指令,而是位元組碼,這就很好的解決了程式的安全性,跨平臺移植性等問題。我們可以將編譯後的位元組碼部署到其他裝有jre環境下,同樣可以正常執行,這就是我們經常說的“一次編譯,處處執行”

JavaAPI:

API即為應用程式程式設計介面,是一些預定義的介面,提供應用程式與開發人員給予軟體或硬體的以訪問一組例程的能力,而又無需訪問原始碼或理解內部工作機制細節。其中包含了Java的基礎類庫集合,提供了一套訪問主機系統資源的標準方法。

Java虛擬機器器:

JVM是由一組規範所定義出的抽象計算機。負責將位元組碼裝載到其內部,解釋/編譯為對應平臺上的機器指令。我們接下來要學習的就是HotSpot VM,它是目前市面上高效能虛擬機器器之一。HotSpot具備熱點探測功能,能將一個被頻繁嗲用的方法或方法體中有效迴圈次數較多的程式碼塊標記為“熱點程式碼”,然後通過內嵌的雙重JIT(Just In Time Compiler)編譯器將位元組碼直接編譯為本地機器指令。HotSpot中編譯器和直譯器並存,依賴熱點探測功能確定位元組碼指令通過解釋執行,還是編譯執行。

編譯器/直譯器在虛擬機器器的執行:

虛擬機器器啟動,直譯器便開始發揮作用,不必等編譯器全部編譯完成再執行,這樣可以節省很多編譯時間。根據熱點探測功能,編譯器會將有價值的位元組碼編譯為本地機器指令,以換取更高的程式執行效率。

HotSpot中內嵌2個JIT編譯器:

系統與物理硬體自動選擇哪種編譯器,開發人員也可手動顯示呼叫編譯策略。預設情況下開啟分層編譯策略,由C1和C2編譯器相互協調共同完成編譯工作。

  • Client Compiler(C1):對位元組碼進行簡單可靠的優化,已達到更快的編譯速度;
  • Server Compiler(C2):啟動一些編譯耗時更長的優化,以獲取更好的編譯質量;

完全解釋/完全編譯

開發人員可以手動呼叫HotSpot VM使用完全編譯,還是完全解釋。

  • 完全解釋:編譯器將停止所有的工作,位元組碼將完全依賴直譯器逐漸解釋執行;
  • 完全編譯:直譯器仍然會在編譯器無法進行的特殊情況下接入執行。

Java技術特性:

  • Java語言無關性:JVM能執行java語言以及其他程式語言編寫的應用程式。Java語言本身本身不支援其他語言特性,但JVM支援(只要滿足幷包含jvm的內部指令集、符號以及其他輔助資訊,就是一個有效的位元組碼檔案,能被JVM裝載執行)
  • Fork/Join 實現多核並行:(java5以後,java.util.concurrent包下)任務拆分到最小,然後每個單獨被計算執行。(如:Hadoop Map/Reduce)
  • Java7新特性:switch(支援String,二進位制),try-with-resources自動管理資源,泛型推斷運運算元,全新的檔案系統NIO2.0、Fork/Join
  • 32位機最大支援4GB記憶體:Java堆區記憶體最大分配(windows 1.5G,linux 2~3G)
  • JDK1.6 update14開始:提供指標壓縮功能,通過對齊補白等操作將64位指標壓縮位32位,改善CPU快取使用率,提升64位JVM效能將。update14~update22之間,可通過"-XX:+UseCompressedOops" 顯示開啟指標壓縮,update23之後,預設開啟。

OpenJDK/Oracle JDK:

  • OpenJDK:
    1.HotSpot用C++,少量C和彙編編寫,其他內容都用Java(如基類庫);
    2.是Sun/Oracle JDK的開源版本(2009年發行第一個版本);
    3.與Oracle JDK7相比,少量程式碼採用其他技術替代。
  • Oracle JDK:
    1.HotSpot用C++,少量C和彙編 編寫,其他內容都用Java(如基類庫);
    2.適合個人開發,不能商用。
  • 市面基於OpenJDK定製的JVM:
    TaoBao JVM:在某一業務方面效能強,但無法通用,嚴重依賴CPU型別:Intel CPU,編譯手段採用IntelC、CPP
    Complier,提升GC效能,使用crc32指令實現JVM intrinsic 降低JNI(jav本地介面)的呼叫開銷。