来源于知乎
java8
- lambda表达式(Lambda Expressions)。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
- 方法引用(Method references)。方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,可以使语言的构造更紧凑简洁,减少冗余代码。
- 默认方法(Default methods)。默认方法允许将新功能添加到库的接口中,并确保兼容实现老版本接口的旧有代码。
- 重复注解(Repeating Annotations)。重复注解提供了在同一声明或类型中多次应用相同注解类型的能力。
- 类型注解(Type Annotation)。在任何地方都能使用注解,而不是在声明的地方。
- 类型推断增强。
- 方法参数反射(Method Parameter Reflection)。
- Stream API 。新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。Stream API集成到了Collections API里。
- HashMap改进,在键值哈希冲突时能有更好表现。
- Date Time API。加强对日期和时间的处理。
- java.util 包下的改进,提供了几个实用的工具类。
- 并行数组排序。
- 标准的Base64编解码。
- 支持无符号运算。
- java.util.concurrent 包下增加了新的类和方法。
java.util.concurrent.ConcurrentHashMap
类添加了新的方法以支持新的StreamApi和lambada表达式。java.util.concurrent.atomic
包下新增了类以支持可伸缩可更新的变量。java.util.concurrent.ForkJoinPool
类新增了方法以支持 common pool。- 新增了
java.util.concurrent.locks.StampedLock
类,为控制读/写访问提供了一个基于性能的锁,且有三种模式可供选择。
- HotSpot
- 删除了 永久代(PermGen).
- 方法调用的字节码指令支持默认方法。
java9
- java模块系统 (Java Platform Module System)。
- 新的版本号格式。
$MAJOR.$MINOR.$SECURITY.$PATCH
- java shell,交互式命令行控制台。
- 在
private instance methods
方法上可以使用@SafeVarargs
注解。 - diamond语法与匿名内部类结合使用。
- 下划线
_
不能单独作为变量名使用。 - 支持私有接口方法(您可以使用diamond语法与匿名内部类结合使用)。
- Javadoc
- 简化Doclet API。
- 支持生成HTML5格式。
- 加入了搜索框,使用这个搜索框可以查询程序元素、标记的单词和文档中的短语。
- 支持新的模块系统。
- JVM
- 增强了
Garbage-First(G1)
并用它替代Parallel GC
成为默认的垃圾收集器。 - 统一了JVM 日志,为所有组件引入了同一个日志系统。
- 删除了JDK 8中弃用的GC组合。(DefNew + CMS,ParNew + SerialOld,Incremental CMS)。
- properties文件支持
UTF-8
编码,之前只支持ISO-8859-1
。 - 支持
Unicode 8.0
,在JDK8中是Unicode 6.2
。
java10
-
局部变量类型推断(Local-Variable Type Inference)
//之前的代码格式 URL url = new URL("http://www.oracle.com/); URLConnection conn = url.openConnection(); Reader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())) //java10中用var来声明变量 var url = new URL("http://www.oracle.com/"); var conn = url.openConnection(); var reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
var
是一个保留类型名称,而不是关键字。所以之前使用var
作为变量、方法名、包名的都没问题,但是如果作为类或接口名,那么这个类和接口就必须重命名了。
var
的使用场景主要有以下四种:
- 本地变量初始化。
- 增强for循环中。
- 传统for循环中声明的索引变量。
- Try-with-resources 变量。
Optional
类添加了新的方法orElseThrow
。相比于已经存在的get方法,这个方法更推荐使用。
java11
- 支持
Unicode 10.0
,在jdk10中是8.0。 - 标准化HTTP Client
- 编译器线程的延迟分配。添加了新的命令
-XX:+UseDynamicNumberOfCompilerThreads
动态控制编译器线程的数量。 - 新的垃圾收集器—ZGC。一种可伸缩的低延迟垃圾收集器(实验性)。
- Epsilon。一款新的实验性无操作垃圾收集器。Epsilon GC 只负责内存分配,不实现任何内存回收机制。这对于性能测试非常有用,可用于与其他GC对比成本和收益。
- Lambda参数的局部变量语法。java10中引入的var字段得到了增强,现在可以用在lambda表达式的声明中。如果lambda表达式的其中一个形式参数使用了var,那所有的参数都必须使用var。
java12
1、低暂停的垃圾收集器-Shenandoah
2、默认CDS归档
通过在64位平台上的默认类列表的帮助下生成CDS归档来改进JDK构建过程,从而有效地消除了运行java -Xshare:dump。 此功能的目标包括:1。)改进开箱即用的启动时间,以及2.)摆脱使用-Xshare:dump。
3、Shenandoah GC
Shenandoah是一种垃圾收集(GC)算法,旨在保证低延迟(10 - 500 ms的下限)。 它通过在运行Java工作线程的同时执行GC操作减少GC暂停时间。 使用Shenandoah,暂停时间不依赖于堆的大小。 这意味着无论堆的大小如何,暂停时间都是差不多的。这是一个实验性功能,不包含在默认(Oracle)的OpenJDK版本中。
4、JMH 基准测试
此功能为JDK源代码添加了一套微基准测试(大约100个),简化了现有微基准测试的运行和新基准测试的创建过程。 它基于Java Microbenchmark Harness(JMH)并支持JMH更新。此功能使开发人员可以轻松运行当前的微基准测试并为JDK源代码添加新的微基准测试。 可以基于Java Microbenchmark Harness(JMH)轻松测试JDK性能。 它将支持JMH更新,并在套件中包含一组(约100个)基准测试。
5、JVM 常量 API
JEP 334引入了一个API,用于建模关键类文件和运行时artifacts,例如常量池。 此API将包括ClassDesc,MethodTypeDesc,MethodHandleDesc和DynamicConstantDesc等类。此 API 对于操作类和方法的工具很有帮助。
6、G1的可中断 mixed GC
此功能通过将Mixed GC集拆分为强制部分和可选部分,使G1垃圾收集器更有效地中止垃圾收集过程。通过允许垃圾收集过程优先处理强制集,g1可以更多满足满足暂停时间目标。G1是一个垃圾收集器,设计用于具有大量内存的多处理器机器。由于它提高了性能效率,g1垃圾收集器最终将取代cms垃圾收集器。G1垃圾收集器的主要目标之一是满足用户设置的暂停时间。G1采用一个分析引擎来选择在收集期间要处理的工作量。此选择过程的结果是一组称为GC集的区域。一旦GC集建立并且GC已经开始,那么G1就无法停止。如果G1发现GC集选择选择了错误的区域,它会将GC区域的拆分为两部分(强制部分和可选部分)来切换到处理Mix GC的增量模式。如果未达到暂停时间目标,则停止对可选部分的垃圾收集。
7、G1归还不使用的内存
此功能的主要目标是改进G1垃圾收集器,以便在不活动时将Java堆内存归还给操作系统。 为实现此目标,G1将在低应用程序活动期间定期生成或持续循环检查完整的Java堆使用情况。这将立即归还未使用的部分Java堆内存给操作系统。 用户可以选择执行FULL GC以最大化返回的内存量。
8、移除多余ARM64实现
Java 12将只有一个ARM 64位实现(aarch64)。 目标是删除所有与arm64实现相关的代码,同时保留32位ARM端口和64位aarch64实现。这将把重点转移到单个64位ARM实现,并消除维护两个实现所需的重复工作。 当前的JDK 11实现中有两个64位ARM实现。