1. CPU相關代碼 1.1. Advanced Vector Extensions 1.1.1. AVX 1.1.2. 2013年,Intel為Haswell以及之後的晶元引入了AVX2 1.1.3. 2016年,Intel又引入了AVX-512指令 1.1.4. JDK 8不支持這些指令 1.1 ...
1. CPU相關代碼
1.1. Advanced Vector Extensions
1.1.1. AVX
1.1.2. 2013年,Intel為Haswell以及之後的晶元引入了AVX2
1.1.3. 2016年,Intel又引入了AVX-512指令
1.1.4. JDK 8不支持這些指令
1.1.5. JDK 11支持
1.2. -XX:UseAVX=N
1.2.1. 0
1.2.1.1. 不使用AVX指令
1.2.2. 1
1.2.2.1. 使用Intel AVX 1指令(對於Sandy Bridge和之後的處理器)
1.2.3. 2
1.2.3.1. 使用Intel AVX 2指令(對於Haswell和之後的處理器)
1.2.4. 3
1.2.4.1. 使用Intel AVX-512指令(對於Knights Landing和之後的處理器)
1.3. -XX:UseSSE=N
1.3.1. 支持Intel流SIMD擴展1到4
1.3.1.1. Streaming SIMD Extensions,SSE
1.3.2. 針對奔騰系列處理器的
2. 分層編譯的權衡
2.1. 當在記憶體受限的環境中運行時有理由關閉它
2.2. 給定足夠長的預熱期,禁用分層編譯時的執行情況和開啟時應該是差不多的
2.3. javac編譯器
2.3.1. 包含額外調試信息的-g標誌不會影響性能
2.3.2. 在Java應用程式中使用final關鍵字並不能更快地編譯代碼
2.3.3. 用較新的javac版本重新編譯通常不會使應用程式更快
2.3.3.1. JDK 11引入了一種新的字元串連接方式,可以比以前的版本更快,但需要重新編譯代碼才能用
3. GraalVM
3.1. 一個新的虛擬機
3.1.1. 可以運行許多其他語言的代碼
3.2. 兩個版本
3.2.1. 完全開源的社區版(Community Edition,CE)
3.2.1.1. 社區版比企業版慢
3.2.2. 商用的企業版(Enterprise Edition,EE)
3.3. 對JVM性能有兩個重要貢獻
3.3.1. 插件技術允許GraalVM生成完全原生的二進位文件
3.3.2. 以常規JVM的模式運行,只是它包含了一個新的C2編譯器實現
3.3.2.1. 這個編譯器是用Java寫的
3.3.2.2. 傳統的C2編譯器是用C++寫的
3.4. -XX:+UnlockExperimentalVMOptions
3.4.1. 預設值是false
3.5. -XX:+EnableJVMCI
3.5.1. 預設值是false
3.6. -XX:+UseJVMCICompiler
3.6.1. 預設值是false
4. 提前編譯
4.1. ahead-of-time compilation,簡稱AOT compilation
4.2. 最初僅在JDK 9的Linux版本中可用
4.2.1. JDK 11時所有平臺都可以用了
4.3. 啟動速度更快
4.3.1. 目前,應用程式類數據共用給啟動性能帶來的提升更大,而且它已經是平臺完全支持的特性
4.3.2. 提前編譯針對的是像REST伺服器這樣啟動時間相對比較長的程式
4.3.2.1. 載入共用庫的時間就被較長的啟動時間抵消了,提前編譯就更有優勢
4.4. jaotc工具
4.4.1. 生成一個共用庫,其中包含你選出的編譯過的類
4.4.2. 然後通過運行參數將共用庫載入到JVM中
$ java -XX:+UnlockDiagnosticVMOptions -XX:+LogTouchedMethods \
-XX:+PrintTouchedMethodsAtExit <other arguments>
java/net/URI.getHost:()Ljava/lang/String;
4.4.5. 為了生成methods.txt文件,需要保存這些輸出內容,然後在每一行前添加compileOnly命令並刪除方法參數之前的冒號
$ jaotc --compile-commands=/tmp/methods.txt \
--output JavaBaseFilteredMethods.so \
--compile-for-tiered \
--module java.base
4.4.7. /tmp/methods.txt文件中
compileOnly java.net.URI.getHost()Ljava/lang/String;