引用参考文档链接
写在开头
- JDK12对用户代码无直接影响
- 主要内容是新增GC(实验阶段)和对已有G1的增强
新GC:Shenandoah(实验)
GC时间不受堆内存大小影响,200M与200G 停顿时间一致,通过启动参数-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
开启。
基准测试组件
添加了基础的基准测试组件,方便开发人员(测试方向)执行现有的基准测试和创建新的基准测试。
实际尝试了,从JDK12-18在maven未引入jmh
相关jar包是无法使用相关注解的。
1 | <dependency> |
但是官方文档明确说了将基础的组件添加到了jdk的源码中,因此只能推测是只开放给JDK开发人员使用。通过官方github下载的jdk12
源码,目录结构也与文档一致,相关代码都在test目录中,因此该特性是针对JDK开发人员来说的….
Switch表达式优化(JDK12暂未开放)
简化case分支
但在JDK12中还不能使用,会提示Enhanced 'switch' blocks are not supported at language level '12'
1 | switch (day) { |
1 | switch (day) { |
switch代码块可当作函数返回值
实际不确定这样写会不会影响代码的可读性,尤其是switch的case情况较多的场景,还是建议封装为单独的函数,避免switch代码块庞大影响代码可读性。
模板
1 | T result = switch (arg) { |
示例
1 | int result = switch (s) { |
JVM常量API
Introduce an API to model nominal descriptions of key class-file and run-time artifacts, in particular constants that are loadable from the constant pool.
引入一个 API 来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量。
没有搜到有博主分享使用该特性的场景,应该也是JDK或JVM内部的开发工作优化。
AArch64兼容代码优化
属于代码重构,简化后续JDK工作。
默认 CDS
该特性仅针对64位的JDK,相当于默认开启JDK的CDS,如果不需要CDS,需要使用启动参数-Xshare:off
停止。
可中断的Mixed G1
当G1预计回收的区域过多时,将会切换到Mixed模式,将目标切割为必须回收与可选回收,在目标时间内,有限回收必须回收部分,如果时间有剩余,才会处理可选回收部分,并且时间结束就立即停止,无论可选回收部分是否全部回收结束。
有效的避免G1的回收时间超过用户指定时间(-XX:MaxGCPauseMillis
默认200ms)
空闲时G1也可释放内存回操作系统
增强G1(定期触发),使得G1在应用程序不活动期间,也可以进行内存回收行动,减少资源消耗。
触发条件有两个,需同时满足:
- G1PeriodicGCInterval时间内无任何垃圾回收行为(包括并发标记周期)
- 一分钟内,系统负载(通过
getloadavg()
获取)低于G1PeriodicGCSystemLoadThreshold
(该值为0则此条件忽略)