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参数