AJDK 8.0.0 Release Notes

来源:互联网 发布:乐贝网络校园招聘 编辑:程序博客网 时间:2024/06/05 18:49

记在这里,便于测试。

版本号

$ java -versionjava 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

0 0