- Java性能權威指南
- (美)Scott Oaks
- 1725字
- 2020-05-06 16:35:18
1.2 平臺版本約定
本書基于Oracle HotSpot JVM和Java Standard Edition(Java SE)7和8。在發布版之間,Oracle更新會定期發布更新版本。多數時候,更新版本只修訂bug,不會加入語言新特性或者變更關鍵功能,但會更改調優標志的默認值。Oracle很可能將在本書出版之后提供更新版本,當前版本為Java 7 update 40和Java 8(迄今為止,還沒有Java 8的更新版本)。如果更新版本對JVM的行為做了重大修訂,則會命名如下:7u6(Java 7 update 6)。
本書關于Java企業版(Java EE)的內容是基于Java EE 7。
雖然當前版本的Java構建于之前的發布版,但本書并不涉及老版本Java的性能調優。對這本講述性能調優的書而言,Java 7是一個很好的起始點,因為Java 7引入了大量的性能新特性和優化。其中最主要的是稱為G1的垃圾收集(GC)算法(老版本的Java包含了G1的試驗版,但直至Java 7u4, G1才真正可用于生產環境)。Java 7也包括許多與性能相關的新特性和增強,可以讓我們更清楚地了解Java應用的運轉。Java 8再接再厲,平臺得到了進一步增強(例如引入了lambda表達式)。Java 8自身的性能得到了巨大提升,在好幾個關鍵性領域都大大超過了Java 7。
JVM還有其他實現。Oracle自己的JRockit JVM(支持Java SE 6)。IBM提供了自己的Java兼容實現(包括Java 7版本)。還有許多其他公司得到許可從而可以改進Oracle的Java技術。
Oracle的商業版JVM
Java和JVM都是開源的,任何想參與Java開發的人都可以加入項目:http://openjdk.java.net。即便你不打算參與開發,也可以從上述網站免費下載源代碼。本書討論的所有內容基本上都是基于開源版的Java。
Oracle也有商業版的Java,可以通過支持合同獲得。它基于標準開源版本的Java平臺,但包括了一些開源版中所沒有的特性。商業版JVM中和性能密切相關的一個特性就是Java飛行記錄器(Java Flight Recorder, JFR,參見3.4.1節)。
除非特別說明,本書所有的內容都適用于開源版的Java。
雖然只有通過兼容性測試的平臺才能使用Java的名稱,但本書不會總是圍繞兼容性展開討論。那些調優標志尤其如此。所有的JVM實現都有一個或多個垃圾收集器,但每個供應商所提供的GC實現,其調優標志都是產品特定的。所以本書所講的概念可適用于所有Java實現,但具體的調優標志和建議僅適用于Oracle的標準(基于HotSpot的)JVM。
用較早版本的HotSpot JVM時要注意,標志及其默認值在發布版之間可能會發生變化。本書只涵蓋Java 7(直到7u40)和Java 8(僅首個版本),而不是試圖窮盡迄今為止的各個版本。以后的版本(例如,假定是7u60)可能會對這些信息做少許改動。重要的變更請查閱發布說明。
從API層面來看,不同JVM實現之間的兼容性很高,即便特定類在Oracle HotSpot Java SE(或EE)和其他平臺上的實現方式也有細微的不同。類的功能必須等價,但具體實現可以變更。所幸這些并不多見,不會對性能產生重大影響。
對于本書的剩余部分,術語Java和JVM應理解為特指Oracle HotSpot的實現。嚴格來說,“JVM首次執行時不會進行代碼編譯”的說法并不正確,因為有些Java的實現在首次執行時會編譯代碼。但這種略寫比到處寫(和讀)“Oracle HotSpot JVM……”要簡便得多。
JVM調優標志
除了少數例外,JVM主要接受兩類標志:布爾標志和附帶參數的標志。
布爾標志采用以下語法:-XX:+FlagName表示開啟,-XX:-FlagName表示關閉。
附帶參數的標志采用以下語法:-XX:FlagName=something,表示將標志flagName的值設置為something。其中something通常可以為任意值。例如-XX:NewRatio=N,表示NewRatio可以設置為任意值N(N是我們討論所關注的重點)。
介紹每個標志時,我們會討論它的默認值。默認值的選取通常綜合考慮了不同因素:運行JVM的物理平臺,以及其他傳給JVM的命令行參數。如有疑問,可以參考3.2.1節所介紹的方法,在給定的命令行上,添加-XX:+Printflagsfinal(默認為false,即“關閉”)就能獲得具體運行環境中特定標志的默認值。基于環境對標志進行自動調優的過程稱為自動優化(Ergonomics)。
Client和Server類虛擬機
Java的自動優化前提是機器被分為“Client”和“Server”。這兩個術語直接與特定平臺(參見第4章)上的默認JVM編譯器相關,它們也設定了默認的調優標志。例如,機器類別決定了平臺默認的垃圾收集器(參見第5章)。
Microsoft Windows上運行的任何32位JVM(無論機器上CPU的個數是多少),以及單CPU機器(不論是什么操作系統)上運行的任何32位JVM,都是Client類機器。所有其他機器(包括所有64位JVM)都被認為是Server類。
從Oracle和OpenJDK站點下載的JVM,被稱為“產品”JVM。需要生成不同版本的JVM時,可以從源代碼構建:調試版、開發版等。這些版本通常有更多的特性。特別是開發版,包含了大量的調優標志,開發人員可以嘗試與JVM各種算法的細節打交道。不過本書基本上不會考慮這些標志。
- Redis入門指南(第3版)
- C#程序設計教程
- 前端架構:從入門到微前端
- Python程序設計
- Learning Salesforce Einstein
- 從零開始學C語言
- Mastering ROS for Robotics Programming
- CRYENGINE Game Development Blueprints
- Webpack實戰:入門、進階與調優(第2版)
- Laravel Application Development Blueprints
- 跟戴銘學iOS編程:理順核心知識點
- Data Manipulation with R(Second Edition)
- Mastering Object:Oriented Python(Second Edition)
- 區塊鏈:技術與場景
- Web程序設計與架構