1. 程式人生 > >AJDK 8.0.0 Release Notes

AJDK 8.0.0 Release Notes

記在這裡,便於測試。

版本號

$ java -version
java version "1.8.0_66"
OpenJDK Runtime Environment (Alibaba 8.0.0) (build 1.8.0_66-b60)
OpenJDK 64-Bit Server VM (Alibaba 8.0.0) (build 25.66-b60, mixed mode)

多租戶(Technical Preview)

多租戶JDK通過JVM的虛擬化/資源隔離的能力,支援容器的多租戶,多個應用可以同時部署在同一個“多租戶”容器而互相不受影響,以提高應該的部署密度,從而可以更大程度的提高資源利用率,降低單應用的部署成本(如果需要多租戶支援,請聯絡JVM團隊)。

  • CPU隔離
    增加命令列選項//-XX:+TenantCpuThrottling//,用於開啟針對單個租戶的cpu配額功能。預設關閉,重啟生效。

  • 記憶體隔離
    增加命令列選項//-XX:+TenantHeapThrottling//,用於開啟針對單個租戶的記憶體隔離、限制功能,目前該功能只支援G1垃圾回收策略。預設關閉,重啟生效。
    可以通過TenantConfiguration類設定每個租戶使用的記憶體上限,當租戶使用記憶體超過指定上限時,JVM會嘗試觸發Full GC來回收空間以滿足該租戶的記憶體限制,如果GC後仍無法滿足,會在分配記憶體的執行緒中丟擲OutOfMemoryError錯誤。

工具

jcmd擴充套件

  • 增加 JavaAgent.load 和 AgentLib.load 兩條命令,使用者可以不寫任何程式碼,使用這兩條命令實現java agent和jvmti agent的動態載入。

診斷和控制

  1. 跟蹤熱點大方法, 應用根據方法跟蹤資訊,減少Method Size, 提高JIT的內聯有效性,從而提高熱點方法效能

    • 命令列選項-XX:+TraceBigHotMethod,用於在標準輸出中列印位元組碼尺寸較大,並且被頻繁呼叫的方法。預設關閉,可動態開啟。
  2. 獲取異常丟失的StackTrace

    • 在預設模式下, JVM會忽略熱點Exception堆疊的生成。使用者可以在應用執行時,動態通過jinfo等工具將OmitStackTraceInFastThrow調整為false,從而獲得完整的Exception的StackTrace(高階特性,JVM團隊指導下使用)。
  3. 大陣列分配引起的GC問題

    • 增加命令列選項-XX:ArrayAllocationWarningSize=xxx,預設值512M。堆中分配大物件的大小超過該值的時候,標準輸出中列印大陣列的分配堆疊,用來排查大陣列分配導致的GC問題。
  4. DirectMemory使用警告

    • 增加命令列選項-XX:DirectMemoryUsageWarningRatio=xxx,當使用的direct memory佔direct memory最大值(MaxDirectMemory)的百分比超過該值時,在標準輸出中列印日誌,用來排查分配的direct memory超過最大值而導致的GC問題。
  5. GC問題輔助排查

    • 使用者可以在應用執行時,動態通過jinfo等工具修改GC相關引數: DisableExplicitGC,ExplicitGCInvokesConcurrent和PrintJNIGCStalls, 幫助排查和解決GC問題。
  6. JVM Crash Log增強

    • 在AJVM的crash日誌中,打印出異常時pc前後的彙編指令,輔助排查解決JVM Crash的Root Cause。

效能優化

  1. CMS Full GC 並行化

    • 為CMS演算法添加了新的並行FullGC演算法,預設關閉。在啟動引數顯式設定選項 -XX:+CMSParallelFullGC 可以啟用該gc演算法。開啟後,當應用使用CMS演算法時候,如果觸發FullGC,可以大幅降低FullGC的停機時間,FullGC執行緒數可以通過-XX:ParallelGCThreads=x來指定,和CMS的minor gc執行緒數一致。
  2. 將閒置的Java Heap歸還實體記憶體,提高記憶體的使用效率,提高應用部署密度

    • 使用命令列選項-XX:+DeallocateHeapPages,CMS可以把不使用的HEAP歸還給實體記憶體。預設關閉,可以動態修改。(注意:如果之前使用了ReclaimMostNativeMemory引數,請改用DeallocateHeapPages)。
  3. ParNew YGC優化

    • 改善ParNewGC中的任務竊取策略,增加新的Hotspot命令列選項-XX:StealingFailureThreshold=xxx,預設值是10,當失敗次數>10, 放棄任務竊取,用於改善ParNewGC中任務分配不均可能導致的CPU浪費情況。
  4. CRC32C

    • 基於x86_64硬體指令,效能更優的intrinsic的CRC32C API,臨時資料校驗可以從CRC32改用CRC32C。持久資料考慮相容性,不建議改變。(注意,如果之前使用了TCRC32C,請該用CRC32C)
  5. Native記憶體優化,使用者應用透明

    • 使用jemalloc,提高native記憶體分配的效率,提高系統記憶體使用率。後續版本會基於jemalloc提供native記憶體診斷功能。
  6. JNI 呼叫 優化,使用者應用透明

    • 調整 x86_64 平臺下 JNI 呼叫被 JIT 後所生成的程式碼的分支順序,通過減少流水線停頓來提升 JNI 呼叫效能。

新增應用程式設計介面(API)

JNI獲取執行緒資訊

  • 添加了一個JMM程式設計介面“GetThreadJNIEnvInfo”,用於從JNI快速獲取所有執行緒相關資訊(高階特性,JVM團隊指導下使用)。

Bug修復

JDK-8048556 - [ref: 5]
JDK-8139549 - [ref: 6]

試用功能

Symbol Translation Service

  • 增加了Hotspot命令列選項-XX:+UseSymbolTranslation, 可以根據pc值獲得相應的方法symbol資訊,用於支援效能profiling工具。

NOTES: 如果需要,請聯絡JVM團隊

跟蹤G1大物件分配,提升G1使用的效能

  • 在使用G1 GC策略時,Humongous物件的分配會極大傷害G1的效能,使用命令列選項 -XX:+TraceG1HObjAllocation,在標準輸出列印大物件的分配堆疊。使用者可以根據這些Trace資訊,在應用層面減少大物件的分配,提高G1的效率

升級嚮導

spring 升級到 3.2.9 以上(如果要用jdk8完整新特性,建議spring升到4.x,servlet升到3.x)
webx應用如果想用spring4,建議webx 升級,參考:http://gitlab.alibaba-inc.com/middleware-container/citrus/wikis/webx-spring4-jdk8
如果有org.projectlombok:lombok, 升級到1.14.X,不要升級到1.16.x
如果有org.eclipse.jdt.core.compiler:ecj, 升級到4.4.2及以上
目前集團很多二方包依賴spring2.x,二方包很容易把spring2.x引進來。排除spring2.x,強烈建議利用這個空包來排除。

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    <version>999-not-exist</version>
  </dependency>

啟動引數調整:
jdk8去除了Perm區,所以:PermSize改為MetaspaceSize,MaxPermSize改為MaxMetaspaceSize。
另外以下引數在jdk8已經不支援,會報警告,建議刪除:UseCMSCompactAtFullCollection和CMSFullGCsBeforeCompaction