记在这里,便于测试。
版本号
$ 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的动态加载。
诊断和控制
- 跟踪热点大方法, 应用根据方法跟踪信息,减少Method Size, 提高JIT的内联有效性,从而提高热点方法性能
- 命令行选项-XX:+TraceBigHotMethod,用于在标准输出中打印字节码尺寸较大,并且被频繁调用的方法。默认关闭,可动态打开。
- 获取异常丢失的StackTrace
- 在默认模式下, JVM会忽略热点Exception堆栈的生成。用户可以在应用运行时,动态通过jinfo等工具将OmitStackTraceInFastThrow调整为false,从而获得完整的Exception的StackTrace(高级特性,JVM团队指导下使用)。
- 大数组分配引起的GC问题
- 增加命令行选项-XX:ArrayAllocationWarningSize=xxx,默认值512M。堆中分配大对象的大小超过该值的时候,标准输出中打印大数组的分配堆栈,用来排查大数组分配导致的GC问题。
- DirectMemory使用警告
- 增加命令行选项-XX:DirectMemoryUsageWarningRatio=xxx,当使用的direct memory占direct memory最大值(MaxDirectMemory)的百分比超过该值时,在标准输出中打印日志,用来排查分配的direct memory超过最大值而导致的GC问题。
- GC问题辅助排查
- 用户可以在应用运行时,动态通过jinfo等工具修改GC相关参数: DisableExplicitGC,ExplicitGCInvokesConcurrent和PrintJNIGCStalls, 帮助排查和解决GC问题。
- JVM Crash Log增强
- 在AJVM的crash日志中,打印出异常时pc前后的汇编指令,辅助排查解决JVM Crash的Root Cause。
性能优化
- CMS Full GC 并行化
- 为CMS算法添加了新的并行FullGC算法,默认关闭。在启动参数显式设置选项 -XX:+CMSParallelFullGC 可以启用该gc算法。开启后,当应用使用CMS算法时候,如果触发FullGC,可以大幅降低FullGC的停机时间,FullGC线程数可以通过-XX:ParallelGCThreads=x来指定,和CMS的minor gc线程数一致。
- 将闲置的Java Heap归还物理内存,提高内存的使用效率,提高应用部署密度
- 使用命令行选项-XX:+DeallocateHeapPages,CMS可以把不使用的HEAP归还给物理内存。默认关闭,可以动态修改。(注意:如果之前使用了ReclaimMostNativeMemory参数,请改用DeallocateHeapPages)。
- ParNew YGC优化
- 改善ParNewGC中的任务窃取策略,增加新的Hotspot命令行选项-XX:StealingFailureThreshold=xxx,默认值是10,当失败次数>10, 放弃任务窃取,用于改善ParNewGC中任务分配不均可能导致的CPU浪费情况。
- CRC32C
- 基于x86_64硬件指令,性能更优的intrinsic的CRC32C API,临时数据校验可以从CRC32改用CRC32C。持久数据考虑兼容性,不建议改变。(注意,如果之前使用了TCRC32C,请该用CRC32C)
- Native内存优化,用户应用透明
- 使用jemalloc,提高native内存分配的效率,提高系统内存使用率。后续版本会基于jemalloc提供native内存诊断功能。
- 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