目前,国内大部分公司还是坚守JDK8,与其说公司在坚持,还不如说是大家不愿做出改变,因为JDK足够稳定了,为什么要换?我觉得可以先不给急着找理由,先看看Java之父JamesGosling怎么说 JamesGosling表示JDK17对比JDK8有很大的提升,希望开发者尽快转到新版本中。 其实,这几年Java开发最常用的框架还是Spring,它几乎没有什么大改。包括,SpringBoot出来之后也只是让我们使用起来更加简单,学习成本非常低。但从近期的SpringBoot版本来看,它都开始要拥护JDK17了,下面这一段是SpringBoot3。0的更新日志。 SpringBoot3。0requiresJava17asaminimumversion。IfyouarecurrentlyusingJava8orJava11,youllneedtoupgradeyourJDKbeforeyoucandevelopSpringBoot3。0applications。 SpringBoot3。0需要JDK的最低版本就是JDK17,如果你想用SpringBoot开发应用,你需要将正在使用的Java8或Java11升级到Java17。 再看看NIO模型netty,netty5已经开始抛出alpha版本了,最低要求也已经升级到了11。 es前一段已经做好了模块化处理,那模块化虽然是9的东西,但是鉴于9并非lts,所以一般认为最低版本要求是11 事实与大环境在做出改变了,我们还在坚守JDK8?而JDK8在官方上,已经停更了,除非旧项目或历史原因使用JDK8,如果是新项目,建议跟上节奏,否则我们还没做出改变,有可能就被淘汰了。 JDK17学不学,用不用,咱先搁一边,趋势在哪咱们得先知道JDK8到JDK17各个版本的重要特性一览 JDK8新特性(2014年初)(LTS版本)1、Lambda表达式 2、函数式编程 3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法 4、方法引用 5、重复注解,同一个注解可以使用多次 6、引入Optional来避免空指针 7、引入Streams相关的API 8、引入新的DateTime相关的API 9、新增jdeps命令行,来分析类、目录、jar包的类依赖层级关系 10、JVM使用MetaSpace代替了永久代(PermGenSpace) 重要特性:Lambda表达式、函数式接口、方法引用、Stream流式API、采用MetaSpace代替了永久代(PermGenSpace) JDK9新特性(2017年9月)1、接口方法可以使用private来修饰 2、设置G1为JVM默认垃圾收集器 3、支持http2。0和websocket的API 重要特性:主要是API的优化,如支持HTTP2的ClientAPI、JVM采用G1为默认垃圾收集器 JDK10新特性(2018年3月)1、局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型 2、并行FullGC,来优化G1的延迟 3、允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程 重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间 JDK11新特性(2018年9月)(LTS版本)1、ZGC,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为Stoptheworld。只有当整理完成后,线程逻辑才可以继续运行。(并行回收) 2、FlightRecorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架 3、对Stream、Optional、集合API进行增强 重要特性:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器 JDK12新特性(2019年3月)1、ShenandoahGC,新增的GC算法 2、switch表达式语法扩展,可以有返回值 3、G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率 重要特性:switch表达式语法扩展、G1收集器优化、新增ShenandoahGC垃圾回收算法 JDK13新特性(2019年9月)1、Socket的底层实现优化,引入了NIO; 2、switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break; 3、ZGC优化,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统; 4、引入了文本块,可以使用三个双引号表示文本块,文本块内部就不需要使用换行的转义字符; 重要特性:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO JDK14新特性(2020年3月)1、instanceof类型匹配语法简化,可以直接给对象赋值,如if(objinstanceofStringstr),如果obj是字符串类型则直接赋值给了str变量; 2、引入record类,类似于枚举类型,可以向Lombok一样自动生成构造器、equals、getter等方法; 3、NullPointerException打印优化,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查; 空指针异常打印优化这个是好东西,我们对比一下:Stringsnull;Strings1s。toLowerCase(); JDK1。8的版本下运行:Exceptioninthreadmainjava。lang。NullPointerExceptionatorg。jdk8。App。main(App。java:10) JDK14及以上版本Exceptioninthreadmainjava。lang。NullPointerException:CannotinvokeString。toLowerCase()becausesisnullatorg。jdk17。App。main(App。java:14) 出现异常的具体方法和原因都一目了然。如果你的一行代码中有多个方法、多个变量,可以快速定位问题所在,如果是JDK1。8,有些情况下真的不太容易看出来。 JDK15新特性(2020年9月)1、隐藏类hiddenclass; 2、密封类sealedclass,通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用; JDK16新特性(2021年3月)1、ZGC性能优化 2、instanceof模式匹配 3、record的引入 JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入 JDK17新特性(2021年9月)(LTS版本)1、正式引入密封类sealedclass,限制抽象类的实现; 2、统一日志异步刷新,先将日志写入缓存,然后再异步刷新; 虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善。 答案 由于Oracle的更新和授权问题,JDK8虽然性能依旧强劲,但无奈已经停止维护,廉颇老矣;继JDK8之后,JDK11和JDK17是后续的LTS版本,而且很多方面进行了更新和性能提升; 作为开发者而言,在新版本框架的使用过程中,转向JDK17已是必然之举,也是大势所趋。