作者 | 小猴
编辑 | 小猴
2020年9月,Oracle官方发布JDK 15。这些年,大家有关注JDK的版本变化吗?可能没有吧,因为我们日常都是用Java 8,甚至还有小伙伴在用Java 7。从2011年7月发布的JDK 7到今天,已经快10年了。这10年,JDK发生了翻天覆地的变化,大家想想自己做了些什么呢?你的工作、生活是否也像JDK一样,也发生翻天覆地的改变呢?
我们来看看从JDK7到JDK15的近10年,到底经历了些什么。Oracle到底为Java做了哪些振奋人心的创新呢?作为一个Java的老用户,我就献丑带大家回到2011年,带大家去Oracle走一遭。
提前声明下,我看的都是第一个GA大版本的第一次发布内容。
1
从JDK7到JDK15
1
JDK 7
发布时间:2011年7月
后续发布次数:133次发布
代号:Dolphin
经典8层架构
打开JDK7的文档首页,跳转的页面一下把我拉回到10年前。非常朴素,一股浓浓的乡土气息。
Oracle延续之前的风格,先介绍了Java SE 7的两个产品:一个是JDK7、一个是JRE7。(后面Java就不再是这几个产品了,有一些模块会陆续独立出来)。然后就是把这张Oracle Java SE的组件图放在下方。
这张图清晰地标识出来了JDK、JRE的组件范围,并且也描述了Java SE API的范围。
这张图一共分为8层。我们从下到上来看看。
第八层(最底层)
最底层也就是第八层是Java Virtual Machine,也就是Java虚拟机(JVM)。Java7使用的是Java HotSpot VM,也就是HotSpot VM。所有的组件都是基于JVM之上运行的。它是平台的基础核心。
第七层
Lang and Util基础库。也就是Java编程中最常用的各类Java的类库。包括lang和util、集合、并发包、日志、配置、反射、正则表达式、ZIP压缩等等。
第六层
Other Base Libraries,也就是其他基础库。这里面包含了一些IO、JMX、JNI、数学库、序列化、安全、XML等类库。这些类库也是开发时候会用到的类库。
第五层
Integration Libraries,也就是系统集成相关的类库(外部系统集成)。例如:JDBC、JNDI、RMI等登场了。连接数据库、Java命名服务接口、远程过程调用等相关类库。
第四层
User Interface Toolkits,也就是用户接口开发包。一说到User Interface就表示要人机交互了。例如:Java 7提供了Java FX(Java 6没有)、还有以前的Swing、Java 2D图形编程、AWT、拖拽操作、对Window系统资源的桥接访问、还有图片、打印和声音等组件。
第三层
Deployment,也就是部署相关了,说到部署很多时候会想起来部署webapp到tomcat容器中。但这里面的功能不一样,大部分Java开发用得少一点,像Java Web Start,我以前在18摸的时候,公司里面有很多内部的应用都是基于Java Web Start的。无需安装其他组件,通过浏览器就可以启动运行Java程序。还有Applet,呵呵!Java的小程序,也是可以通过浏览器来运行的。大家也看到了,Oracle是让Java运行在Web Browser中还是花了很多心思的。实施情况,也确实有一些公司的系统是基于这样的技术来部署的。但它的命运最终,会和微软的Active X一样,走向灭亡(Java11)。注意,这跟部署B/S架构的应用不一样,它是让Java程序进入到了客户端。
第二层
Tools & Tool API,从一层开始就是属于JDK的领域了,这里面包含了大量的Java编译、监控等工具、以及针对工具包提供的扩展API。例如:有javac、javadoc、jar、JConsole、WebService等等。
第一层
第一层是我们的主打开发语言——Java Language。注意哦,第二层是Lang和Util库,要和Java Language区分出来。Java Language是划分到JDK中,JavaSE是不认识Java语言的,只认识class字节码。
我们还是来重点关注下JDK7的Release Note。JDK7一共发布了133个版本。我们主要来看一下这个JDK7这个大版本发布的Hightlights吧。
Java语言上的升级。
支持使用二进制来表示整数类型
byte aByte = (byte)0b00100001;
在Switch中可以使用String类型,点赞!
try … with resource语法,点赞!
只要实现了AutoCloseable接口都可以使用这种方式。看一下JDBC接口的源码,例如:Connection、Statement、ResultSet,他们都提供了对AutoCloseable的支持。
try(Connection connection = DriverManager.getConnection(url, user, password); Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery("SELECT * FROM t_teacher");) { while(rs.next()) { String line = rs.getString("id") +" " + rs.getString("name"); System.out.println(line); } } catch (SQLException e) { e.printStackTrace(); }
你是不是还在用finally?哈哈,中招了吧。
对多个异常的捕获
Java 7之前要写一排,像下面这样
catch (IOException ex) { logger.log(ex); throw ex;catch (SQLException ex) { logger.log(ex); throw ex;}
Java 7只要这样就可以了。
catch (IOException|SQLException ex) { logger.log(ex); throw ex;}
在JDK7中,数字与数字之间是可以出现任意数量的下划线的,提高代码的可读性。
int money = 1_0000_0000;
这样一看就知道,哦,这是一千万。
在new泛型类的时候,使用菱形<>来替代,让编译器直接从上下文推断出类型参数。
ArrayListlist = new ArrayList<>();
看一下IDEA中对JDK 7的简洁描述
diamonds、muti-catch,大家懂我上面的意思了吧?<>这就是钻石,IOException|SQLException ex这就是muti-catch。
虚拟机的优化
JVM提供client端和server端的实现
提供JVM的多种实现
JDK带了一个称为Java HotSpot客户端VM实现。这个VM进行了调整,可以减少启动时间和内存占用。启动应用程序时,可以使用-client来启动该VM。例如:打包一些JAVA应用,我们可以加入-client来进行调优。JDK还提供了HotSpot的Server端VM。这种VM是以最大程度地提高程序的执行速度。启动时加入-server来调用它。
自适应编译器
应用以一个标准的解释器启动,在运行代码过程中,会对执行的代码进行分析,并自动地检测性能瓶颈或者是Hot Spots(热点),并基于此编译出对性能影响最大的代码。并且,HotSpot VM还能够自适应编译器动态决定如何使用in-lining(内联)优化已经编译的代码。
HotSpot提供快速内存分配、提供了快速、高效地GC选择,并且HotSpot提供了一种多线程处理功能,能够比较容易地扩展大型共享内存的多核处理器。
其他支持
JDBC。从JDK7开始,提供了对try-with-resource的支持,可以自动关闭Connection、ResultSet、Statement的能力。
升级了Swing的一些什么JLayer布局组件、Nimbus Look&Feel(其实就是皮肤),解决了一些AWT(重量级)和SWING(轻量级)组件混合使用的效率问题、支持什么圆角矩形、透明窗口、颜色之类的。
从Java 7开始对NIO提供了对文件I/O、访问文件系统的全面支持。也对NIO的ByteBuffer的缓存做了升级优化,无需与page边界对齐,减少内存使用空间。
对Java RIA(Java富浏览器应用程序),基于此,所有的JRE中都添加了新的功能。可以与Windows7的兼容更好,对JNLP(Java网络启动协议)语法进行了安装和升级。这一块其实就是就是我们前面提到的Web Start部署方式的支持。
网络编程。提供了基于SDP(套接字直接协议)的高性能网络连接访问。
安全相关的升级。添加了椭圆曲线密码(ECC)加密、启动CertPath算法加密(MD2加密很不安全),还有对SSL/TLS的一系列升级。
升级并发包。基于Fork/Join框架,通过ForkJoinPool可以使用一个工作线程池来运行更多的任务,并且通过work-strealing技术确保工作线程的状态是busy的,充分利用多核处理器的优势。增加了ThreadLocalRandom实现、可重用的同步Barrier。
改善Java 2D绘图性能。采用XRender的渲染管道。
升级Java XML的相关技术。例如:JAXP、JAXB、JAX-WS等,支持更高版本的标准。
升级了Java SE对国际化的支持。包括像Unicode 6的一些新字符、对ISO 4217货币代码的扩展支持、在正则表达式中支持Unicode 6。
2
JDK 8
发布时间:2014年3月。距JDK 7大版本发布已经2年8个月。
后续发布次数:46次发布
很直观的可以看到,JDK 8的官方界面做了蛮大的改造。页面的颜色换成了淡蓝色,冷色系。
有了JDK 7的经验,大概可以总结出来Oracle的几大升级方向:
语言、虚拟机、用户交互、国际化、部署、网络、安全、系统集成、并发。
可以说,上述的这些内容也是Java SE的升级的核心。而Java 8最大的亮点和特色,就是Lambda和Stream流式API。这套语法对于Java,是划时代的,也是最经典的一代Java。这是每一个Java开发人员都必须要掌握好的。
Lambda表达式
从Java 8开始,Oracle开始引入Lambda表达式。通过使用Lambda表达式,我们可以将一些功能封装称为方法的参数,或者code as data。Lambda表达式可以让我们更加简洁的表示只有一个方法的接口(这种一般称为是功能接口)的实例。为了确保Lambda表达式的使用,Oracle对旧版的接口提供了一些默认方法。Java8还提供了方法引用的语法支持,可以提供阅读性更好的Lambda表达式。用习惯了之后,你会爱上它的。
printPersons( roster, (Person p) -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25);
Stream流式API开发
util.stream包提供了Stream API,可以用来对流式的元素集进行函数式地编程API。并且Java 8将Stream API集成到了Collections API中,通过这些API可以对集合进行批量操作,例如:可以进行串行的、或者并行的MapReduce处理。如果你是Java开发,你应该熟悉以下这种语法的操作:
Listlist = people.stream().map(Person::getName).collect(Collectors.toList());
相信我,用习惯之后,你再也不会像回到Java 7了。
安全相关
默认启用客户端TLS 1.2。提供了更强大的基于密码的加密算法。例如:支持AEAD算法、ASE、GCM、Nopadding密码等。支持Windows 64位的PKCS11。支持Kerberos 5协议。
Java FX
提供新的Modena主题,并且提供了SwingNode,以支持将Swing内容嵌入到Java FX中。提供了DatePicker和TreeTableView控件。还提供了更多的3D功能,包括形状、相机、灯光、材质等场景。并对WebView组件进行了更新,可以支持H5的更多功能。大家可以看到了,AWT和SWING基本上要退出历史的舞台了。所以大家如果真要学Desktop UI,也应该是去看看Java FX,而不是去写swing。
JDK8中开始包含Java DB 10.10
JavaDB是基于Java编程语言和SQL的RDBMS。其他它是Apache Derby项目的Oracle版本。Java DB包含Derby,并且没有对基础源代码进行任何修改。其实就是基于文件的单机存储。
JDK工具
JDK8提供了更多的工具,以帮助更好地运行程序、并提供监控、诊断功能。提供犀牛引擎(Javascript),可以通过java指令直接启动JavaFX应用。可以使用jdeps来分析class字节码文件,通过JMX可以进行远程诊断命令执行。还包括了其他的javac、javadoc工具、命令的升级。
Java HotSpot VM
JDK8中添加了基于硬件的高级标记加密标准(AES),同时从JDK 8开始,移除永久代。基于字节码的调用支持默认方法。
3
JDK 9
发布时间:2017年9月。距JDK 8大版本发布已经3年6个月。
后续发布次数:3次发布
从JDK9开始,Oracle开启了疯狂更新模式。半年一个大版本,2020年9月,JDK 15都已经出来了。Orale目前官方下载,其实主推的是三个版本:JDK8、JDK11以及JDK15。
好了,现在JDK 9的文档首页变成了这样了。
JDK 9在Java语言层面做了一些更新。例如:try-with-resource,我们可以在JDK 9中,在try块外边开启资源,在try…with中应用。这样看起来会更加简洁一些。例如:
try(connection1; connection2) { //…}
在Java8中,必须要把资源的创建放在try…with中。然后其他语言层面就没有大的动作了。
JDK 9最大的特点就是引入了一种新的Java编程组件,模块。模块是自描述的,包含了代码和数据集合。
在编译和运行期间,可以将模块组装在一起优化成自定义的运行时镜像。在JDK中提供了jlink的属性。而且可以基于JAR文件的方式来承载模块。JDK还提供了一种叫做JMOD的文件,类似于JAR,但它可以包含Native的代码和配置文件。
在IDEA中,对Java9的描述也是重点描述Modules上。
JDK9开始支持对JRE和JDK的模块进行重组,并且从Java运行时中删除rt.jar和tool.jar。默认情况,只保留了最关键的、广泛使用的内部API。
JDK 9中还提供了不可变的List、Sets、和Map。
List stringList = List.of("a", "b", "c");SetstringSet = Set.of("a", "b", "c");Map stringMap = Map.of("a", 1, "b", 2, "c", 3);
通过of方法创建的集合都是不可变的,如果我们试图是修改他们,会抛出UnspportedOperationException。这意味着,所有的操作都将是线程安全的,当在线程之间共享这些集合,都可以安全地看到一致的视图。但要注意,这个是表示创建的集合是immutable的,并不代表集合中的对象是不可变的。如果不可变集合的对象是可变的,依然会有线程安全问题。
JDK9中还更新了Process API,这套API可以支持重定向输出、日志输出、可以监控长时间运行的进程,可以在进程终止的时候重启,以及收集进程的运行统计信息等。
Java 9增加了jshell交互式命令行。学习语言或者做一些语法的探索的时候比较有用。
JDK 9可以将代码缓存到不同的段中,每个段包含特定类型的已编译的代码,以此来提升编译性能。
JDK 9对JVM进行了优化,增强了G1垃圾收集器,使用它可以自动设定内存回收配置。以前是要手动设置的。并且,在稳定性、性能、可用性上都对G1进行了升级。
更多内容请参考官网:
https://docs.oracle.com/javase/9/
4
JDK 10
发布时间:2017年9月
JDK10在Java语言上有一项重大突破,那就是本地变量类型推断。大家来看一下下面这段代码:
URL url = new URL("http://www.oracle.com/");URLConnection conn = url.openConnection();Reader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
是不是感觉没啥毛病?我们已经很习惯这样去编码了。但其实,它里面还是有大量冗余,URL 变量名 = new URL。这URL类型出现了两次,其实我们读代码的时候,只要一看右边是什么,马上就能脑补是什么类型的。这样实在是臃肿(还有人我看到写scala的时候,居然还把类型给带回来了)。
基于此,JDK10对于非null进行初始化的局部变量可以使用var来定义变量。通过var可以根据上下文来推断变量类型。
var url = new URL("http://www.oracle.com/");var conn = url.openConnection();var reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
世界一下清爽了很多。
var不仅除了用在初始化局部变量中,还可以用在for循环中、try-with-resource中。来一段代码,爽、爽、爽!
Class.forName(Driver.class.getName()); var url = "jdbc:mysql://localhost:3306/test"; var user = "root"; var password = "000000"; try(var connection = DriverManager.getConnection(url, user, password); var statement = connection.createStatement(); var rs = statement.executeQuery("SELECT * FROM t_teacher");) { while(rs.next()) { var line = rs.getString("id") +" " + rs.getString("name"); System.out.println(line); } } catch (SQLException e) { e.printStackTrace(); } // 用于for中 for(var i = 0; i < 10; ++i) { System.out.println(i); } for(var ele : List.of(1, 2, 3, 4)) { System.out.println(ele); }
所以,有的代码不是Java臃肿!而是你自己肿了!说Java臃肿的,把头伸过来,我保证不打死你。
大家可以看到在IDEA中,对JDK 10的描述也是Local variable type inference。大家注意到了吗?
JDK 10对不可变集合提供了更多地支持。加入了像List.copyOf、Set.copyOf、Map.copyOf这些API可以从现有的集合中创建新的不可变集合,并且在Stream包中添加了Collectors中添加了toUnmodifiableList、toUnmodifiableSet、toUnmodifiableMap,可以将可变列表转换为不可变集合。其实就是通过stream API将可变流转换为不可变流。
提升G1垃圾回收器的性能。JDK10可以让整个GC过程并行,保证G1在最坏情况下的延迟(Stop the world)。G1旨在避免发生Full GC,但并发收集无法足够快进行回收时,将进行Fall back Full GC。而之前的G1的Full GC是通过单线程地方式标记-清除-压缩算法。现在Full GC可以和其他回收相同数量的工作线程进行回收。
JDK10还对JMX、安全认证、编译器、Javadoc工具进行了小幅升级。并且还移除了一些旧的API。
更多详情请参考Oracle官方文档:
https://www.oracle.com/java/technologies/javase/10-relnote-issues.html
5
JDK 11
发布时间:2018年9月
JDK 11是Oralce官网主推的。大家可以在Oracle Java官方产品页面上看到。从JDK 11开始,Java产品的文档首页换成了这种样式。黑色简约,从中看到的更多的是严谨和专注。这一版的界面是我对比下来,最好的一次改版。
JDK 11对Java语言的更新。
我们看到了,还是对于本地变量类型推断的升级。在JDK 11中,var开始在Lambda表达式中支持。在JDK 10中,var是不能够用在Lambda表达式中。而JDK 11可以。
List.of(1, 2, 3, 4, 5).stream() .map(n -> { var i = n * 2 + 1; System.out.println(i); return i; });
接下来,说一下JDK的重大升级——ZGC
JDK11提供了新的Z垃圾收集器(ZGC),是一种可扩展的低延迟垃圾收集器。这一版的垃圾收集器非常牛X,暂停时间不超过10毫秒,而且这个暂停时间不会随着堆的容量增大而增加。Z垃圾收集器旨在处理几百MB – 若干TB的堆内存。所以,机器性能的纵向扩展将会更好。ZGC的核心还是并发的垃圾收集器,也就意味着Java线程在执行的过程中,一些比较heavy的操作(例如:标记、压缩、引用处理、字符串表清理等)都已经完成了。JDK11的ZGC目前是一个使用版本,而且目前仅能在Linux 64bit操作系统下使用。
JDK11还提供了一个No-Op GC。Epsilon GC是新的无操作垃圾收集器,它目前也是一个实验性的GC。这种GC仅处理内存分配,没有实现任何的内存回收机制。这种GC仅用于性能测试,可以用它来对比其他GC的成本/消耗。它可以用来方便观察内存占用量和内存压力。并且,在一些特殊情况下的排错,对于一些寿命很短的作业会比较有用。
除此之外,还对加密算法、认证、权限进行了一些升级。同时,也移除了一些旧的API,例如:AWTUtilities、AppletViewer。
分离JDK
Java Deployment在JDK11被移除掉了、JMC也被拿掉了,开始有自己的独立包。Java FX也被拿掉了,作为单独的模块提供。JavaEE和CORBA模块也从JDK中移除:
霸气!
更多详细内容请参考:
https://www.oracle.com/java/technologies/javase/jdk-11-relnote.html#NewFeature
6
JDK 12
发布时间:2019年3月
JDK12的风格和11保持一致。我们还是来看一下语言上的更新。这次JDK 12仅提供了一个Preview的功能:
Day day = Day.WEDNESDAY; System.out.println( switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; default -> throw new IllegalStateException("Invalid day: " + day); });
呃…把scala的match…case拿过来了。好吧,我不说啥了。我们来看一下IDEA对12的描述~
哈哈哈,No new language feature~好吧,这只能说是一个早期的测试版本吧。算了,抬走。我们继续看下一个吧~
7
JDK 13
发布时间:2019年9月
还是先看一下Language Update。这个版本引入了文本块。看代码吧:
String message = """ 'The time has come,' the Walrus said, 'To talk of many things: Of shoes -- and ships -- and sealing-wax -- Of cabbages -- and kings -- And why the sea is boiling hot -- And whether pigs have wings.'""";
终于,终于等到了~当我们在代码中嵌入其他脚本的时候,例如:SQL、JSON、XML等等,文本块可以说是非常方便。
int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> { System.out.println(6); yield 6; } case TUESDAY -> { System.out.println(7); yield 7; } case THURSDAY, SATURDAY -> { System.out.println(8); yield 8; } case WEDNESDAY -> { System.out.println(9); yield 9; } default -> { throw new IllegalStateException("Invalid day: " + day); } };
支持了yield表达式,又抄scala~现在大家看switch以然变成了一个表达式(就差if了)。
看一下IDEA中的描述,依然是No new language features。
依然是Preview Feature。
JDK13对NIO、Unicode 12.1做了升级。并且,对ZGC进行了增强,它可以将未使用的堆内存返回给操作系统。这对于一些比较消耗内存的应用和环境是很有用的,JVM不会一直占用着内存空间。并且,增加了SoftMaxHeapSize的JVM配置选项。如果在一些关注资源的应用中,我们希望占用较少的空间,但因为突发的处理,需要临时增加堆内存大小,这个配置就很有用了。也可以有效避免因为临时的处理内存需求而导致OOM,ZGC会比其他的垃圾回收器更积极的回收垃圾,让GC保持更小的堆。并且从JDK13开始,ZGC的最大堆内存增加到16TB。
更多详情请浏览:
https://www.oracle.com/java/technologies/javase/13-relnote-issues.html#NewFeature
8
JDK 14
发布时间:2020年3月
继续看Language New。JDK14为instanceOf提供了模式匹配的支持。以前,我们如果用Java进行类型匹配,代码如下:
public static double getPerimeter(Shape shape) throws IllegalArgumentException { if (shape instanceof Rectangle) { Rectangle s = (Rectangle) shape; return 2 * s.length() + 2 * s.width(); } else if (shape instanceof Circle) { Circle s = (Circle) shape; return 2 * s.radius() * Math.PI; } else { throw new IllegalArgumentException("Unrecognized shape"); }}
而从JDK14开始,可以这样:
public static double getPerimeter(Shape shape) throws IllegalArgumentException { if (shape instanceof Rectangle s) { return 2 * s.length() + 2 * s.width(); } else if (shape instanceof Circle s) { return 2 * s.radius() * Math.PI; } else { throw new IllegalArgumentException("Unrecognized shape"); }}
大家可以看到,新的instanceOf省去了类型转换的过程。其实还可以更简洁一点,
if (shape instanceof Rectangle s && s.length() > 5) { // ...}
但这里&&如果改成||就该报错了。因为如果s不是Rectangle类型就麻烦了。
JDK 14还支持了一种叫做Record的定义类的方式。以前,定义各一个Java Bean要这样,
final class Rectangle implements Shape { final double length; final double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } double length() { return length; } double width() { return width; }}
现在如果使用record那就简单了。record Rectangle(float length, float width) { }
啊…啊…啊…,这不就是scala中的样例类吗?使用record定义的类还自带了一些实现:
每个字段都是private的
自动提供public并且与字段名一模一样的访问方法,例如:length()、width()
自动提供一个公共的构造器,该构造器用于初始化每一个private变量。
自动实现了equals和hashcode方法,针对于一个record比较,如果成员变量都是相等的,那他们就是相等的
提供了默认toString的实现,返回包含所有字段的名称和值。
JDK14对Text Block也做了进一步的升级。支持两种转义字符:\和\s
String text = """ Lorem ipsum dolor sit amet, consectetur adipiscing \ elit, sed do eiusmod tempor incididunt ut labore \ et dolore magna aliqua.\ """;
\转义字符表示一些长的文本可以分开几段,提高可读性。
String colors = """ red \s green\s blue \s""";
\s表示被简单地替换为空格,通过\s来进行对齐,每一行都是6个字符。
以上三个语言的更新,依然是Preview Feature。
终于,IDEA中有了Records、patterns、text blocks的新语言特性了。
JDK14的ZGC终于在windows、MacOS平台有了支持,不过是一个测试版本。同时,并行GC采用与其他收集器相同的任务管理机制来进行调度,对性能有较大地提升。从JDK14开始,CMS(Concurrent Mark Seep)垃圾回收器被移除,以及关于CMS的一些配置都被废弃掉了。再见!CMS!
更多的内容请参考:
https://www.oracle.com/java/technologies/javase/14-relnote-issues.html#NewFeature
9
JDK 15
发布时间:2020年9月
终于到15了。这一晃,9年过去了。
大家可以在IDEA中看到Text Blocks已经正式上线。
至于instanceOf、Record之类的估计要等到JDK 16了。我对Record还是蛮期待的。我们继续来看看JDK 15的其他New Feature和Enhancement。
JDK 15开始提供为字符串提供isEmpty方法,也该有啦~
public static void main(String[] args) { var text = """ select * from hello_jdk15 """; if(text.isEmpty()) { System.out.println(text); }}
这个版本GC这一块没有大的调整。更多的详细,大家可以参考:
https://www.oracle.com/java/technologies/javase/15-relnote-issues.html#NewFeature
2
开源社区对Java版本的响应情况
Oracle升级动作如此之迅速,而且JDK之上的应用非常多。Oracle如此升级,我们来看看各大社区作何反应。
1
Spring开源社区
Spring Boot
Spring Boot已经开始支持Java 15了。最低要求是Java 8。
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes
2
Hadoop社区
主流版本,Java 8是兼容性最好的,Java 11提供有限的支持(运行时是OK的)。编译用Java 11是不被支持的。
https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions
我们看到对Java 11编译支持的ISSUE还是处在Open状态,当前的work log也是空的。
Hadoop加油!
3
Scala社区
scala社区对JDK的支持是非常好的。大家可以看到上面的兼容情况。从2.11.12开始就支持JDK11。
Spark社区
https://spark.apache.org/docs/latest/
我们看到,Spark 3.x能够运行在Java8和Java 11上的。
https://spark.apache.org/docs/2.4.7/
Spark 2.x版本运行在Java 8上。Spark 2.x运行在Java 8上。
4
Flink社区
Flink 1.12版本要求的是Java 8或者11。
5
Kafka社区
Kafka 2.7版本推荐Java 11版本。
大家可以看到大数据几个大社区,基本上瞄准的就是Java 11。Spark、Flink社区后续肯定会持续推动Haodop社区/YARN对于Java 11的支持。所以,大数据拥抱并推广Java 11只是迟早的事。
结尾
我很期待着JDK record的上线,以及未来对Tuple的原生支持。相信Java 11会很快流行起来。因为var、ZGC、模块化这些特性一定会吸引更多的社区、开发者的关注。尤其是大数据,切换到Java 11不会太久。
2021年3月,记住这个时间,我们JDK 16见。
作者|小猴