JDK版本比较
JDK8
- 接口
default方法 lambda表达式- 依赖lambda表达式的函数式接口@FunctionalInterface修饰接口
- 基于lambda表达式的
StreamAPI - jvm内存管理,移出永久代,
元空间meta替换 HashMap中的优化- 增加红黑树
- 解决jdk1.7多线程下的死循环,扩容使用尾插法,抛弃头插法
- rehash的优化:jdk7扩容的rehash是重新计算桶的位置,而jdk8则进行了优化,不需要进行重新计算。
- currentHashMap的优化
- jdk7是使用分段锁实现线程安全
- jdk8则使用sy关键字和大量的CAS操作实现。
JDK11
完全支持Linux容器,如docker。jvm可以识别容器配置的内存、cpu使用约束;- 识别内存限制有助于jvm各个内存区域的分配管理,否则需要手动设置jvm参数,容器部署上比较复杂
- 识别cpu限制,jvm能得到真正可用的cpu数量,有助于jvm中各个线程的调度
- 性能提升, Parallel Full GC for G1带来的性能提升,新增
ZGC - 增加
模块化,增加jlink,jlink可以多jvm进行裁剪,更适合在容器环境部署 - jdk9开始
String底层存储从char[] 改成 byte[],节省内存 - String、集合、SteamApi增强
var关键字变量Java可以运行源文件
JDK17
模块化成为正式功能,需要添加jvm参数才能运行jar- 语法增强
- record 类
switch箭头语法增强文本块- 密封类
- 增强的伪随机数生成器
- Java模块化需要设置jvm参数