天天看點

深入了解JVM虛拟機 第一章走進java

前言:

系統介紹Java的技術體系、發展曆程、虛拟機家族、以及自己動手編譯JDK的方法。

1. Java技術體系
  • JDK:Java程式設計語言、Java虛拟機、java類庫這三部分統稱為JDK(Java Development Kit),是用于支援Java程式開發的最小環境。
  • JRE:Java類型API中的Java SE API子集和Java虛拟機這兩部分統稱為JRE(Java Runtime Environment),是支援Java程式運作的标準環境。
2. Java虛拟機家族 (一次編譯,到處運作)
  • Classic VM:“世界第一款商用Java虛拟機”,這款虛拟機隻能使用純解釋器方式來執行Java代碼。假如外挂了即時編譯器的話,即時編譯器就會完全接管虛拟機的執行系統,解釋器便不能再工作了。
  • Exact VM:因它使用準确記憶體管理(EXact Memory Management)而得名,Exact VM可以抛棄掉以前Classic VM基于句柄(Handle)的對象查找方式。
  • HotSpot VM:繼承了Classic VM和Exact VM的優點(如準确記憶體管理),也有自己的新的技術,熱點代碼探測技術等。(PS:熱點代碼探測能力可以通過執行計數器找出最具有編譯價值的代碼。如果一個方法被頻繁調用,或方法中有效循環次數很多,将分别觸發标準即時編譯和棧上替換編譯行為)
  • JRockit VM:一款專門為伺服器硬體和服務端應用場景高度優化的虛拟機,它可以不太關注程式啟動速度,是以JRockit内部不包含解釋器實作,全部代碼都靠即時編譯器編譯後執行。
  • IBM J9 VM:IBM J9直至今天仍舊非常活躍,IBM J9虛拟機的職責分離與子產品化做得比HotSpot更優秀。
  • Zing VM:Zing虛拟機是從一個HotSpot某舊版本代碼分支基礎獨立重新開放出來的高性能java虛拟機。Azul公司為它編寫了新的垃圾收集器,也修改了HopSpot内的許多實作細節,在要求低延遲、快速預熱等場景中,表現都比HotSpot表現得更好。Zing的PGC、C4收集器可以輕易支援TB級别的java堆記憶體,而且保證暫停時間 仍然可以維持在不超過10毫秒的範圍内。
3. 新一代即時編譯器

​ 對需要長時間運作的應用來說,由于經過充分預熱,熱點代碼會被HotSpot的探測機制準确定位捕獲,并将其編譯為實體硬體可直接執行的機器碼,在這類應用中java的運作效率很大程度上取決于即時編譯器所輸出的代碼品質

  • HotSpot虛拟機中含有兩個即時編譯器,分别是編譯耗時短但是輸出代碼優化程度較低的用戶端編譯器(C1)以及編譯耗時長但是輸出代碼優化品質也更高的服務端編譯器(C2)。
  • 新一代即時編譯器:Graal編譯器。Graal編譯器比服務端編譯器晚了足足二十年面世,有着極其充沛的後發的優勢,在保持輸出相近品質的編譯代碼的同時,開發效率和擴充性上都要顯著優于C2編譯器,這決定了C2編譯器中優秀的代碼技術可以輕易地移植到Graal編譯器上,但是反過來Graal編譯器中行之有效的優化在C2編譯器裡實作起來異常艱難。在某些測試項中已經逐漸反超C2編譯器。Graal能夠比C2更加複雜的優化,如"部分逃逸分析"(Partial Escape Analysis),也擁有比C2更容易使用激進預測性優化政策,支援自定義的預測性假設。
4. 本章疑問
  1. 什麼是解釋器和即時編譯器
  2. 什麼是使用者态和核心态