
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;
4.5. 如果不讓預編譯的方法被C2編譯器編譯,那么服務器預熱后的性能就會比它最終可能達到的性能差
4.6. -XX:+PrintAOT
4.6.1. 在預編譯方法被JVM使用時會產生輸出
4.6.2. 默認值是false
4.7. 對于比較大的程式有好處
4.8. 對于很小的、快速運行的程式沒有幫助,甚至會阻礙它們的運行
5. GraalVM原生編譯
5.1. 生成不需要JVM的可執行檔案
5.1.1. 是短期程式的理想選擇
5.2. 生成的二進制檔案啟動速度很快,特別是相較于在JVM中運行的程式
5.3. GraalVM優化代碼時并沒有C2編譯器那么激進,所以對于運行得足夠久的應用程式,傳統的JVM最侄訓勝出
5.4. GraalVM原生二進制檔案在執行期間不會使用C2編譯器編譯類
5.5. 原生程式的記憶體占用在開始時比傳統JVM少得多
5.5.1. 隨著程式的運行和堆的增長,這種記憶體優勢會逐漸消失
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546017.html
標籤:Java
上一篇:Python實作人臉識別,對視頻跟蹤打碼,拒絕少兒不宜!
下一篇:三天吃透mybatis面試八股文
