JDK 13 于 2019 年 9 月 17 日正式发布。
新版本主要包含五个特性JEP 350: Dynamic CDS Archives
JEP 351: ZGC: Uncommit Unused Memory
JEP 353: Reimplement the Legacy Socket API
JEP 354: Switch Expressions (Preview)
JEP 355: Text Blocks (Preview)
Dynamic CDS Archives(动态 CDS 归档)首先介绍一下 CDS,CDS 全名为 Class Data Sharing,目的是减少Java编程语言应用程序的启动时间,特别是较小的应用程序,并减少内存占用。实现思路是通过JVM调用期间,将共享的归档文件被映射到内存中,从而节省了加载这些类的成本,并允许多个 JVM 进程共享这些类的大部分 JVM 元数据。
JVM 中 CDS 的历史JDK 1.5 引入了CDS 的概念,通过把 rt.jar 中的核心类提前转化成内部表示,转储到一个共享存档(shared archive)中。每个 JVM 只需要装载自己的应用类,启动时间减少了,另外核心类是共享的,所以 JVM 的内存占用也减少了;
Oracle JDK 9 中,在支持其他 GC 算法和应用程序类的情况下,这变得非常有用;
JDK 10 之前,它一直是一个商业特性,在JDK 10 中它成为了开源的;
OpenJDK 13 / JDK 13 中实现了动态 CDS 归档,提高应用程序类数据共享(AppCDS)的可用性。消除了用户为每个应用程序创建类列表而进行试运行的需要。当程序存在时,可以使用 -XX:ArchiveClassesAtExit=,而不是提供类列表。然后使用 -XX:SharedArchiveFile=,可以在 JDK 的系统默认存档之上共享类数据
ZGC: Uncommit Unused Memory
ZGC 是在 JDK 11 中引入的,但是到目前为止它还没有像 G1 垃圾收集器那样将未使用的堆内存返回到操作系统。这个 JEP 解决了这个问题,并且默认启用了这个功能。
Reimplement the Legacy Socket API
java.net.Socket 和 java.net.ServerSocket 的实现非常古老,这个 JEP 为它们引入了新的实现。新的实现方法是 Java 13 中的默认实现,但是旧的实现还没有被删除,可以通过设置系统属性 jdk.net.usePlainSocketImpl 来使用它们。但没有为 java.net.DatagramSocket 引入新的实现。
运行一个实例化 Socket 和 ServerSocket 的类将显示这个调试输出。这是默认的(新的实现):
sun.nio.ch 上面的 NioSocketImpl 是新的实现。
现在让我们设置系统属性并再次运行:
它显示了现在使用的旧的实现 java.net.PlainSocketImpl。
Switch Expressions (Preview)
在 JDK 12 中引入了 Switch 表达式作为预览特性。JEP 354 修改了这个特性,它引入了 yield 语句来从块中返回值,而不是使用 break。这意味着,switch 表达式(返回值)应该使用 yield,而 switch 语句(不返回值)应该使用 break。
JDK 13 之前的 Switch 的写法:
JDK 13 的 Switch 的写法:
或者
Text Blocks (Preview)
JDK 12 中引入了 Raw String Literals 特性,但在发布之前就放弃了。JEP 在引入多行字符串文字(一个文本块)方面与此类似。
HTML 例子:
使用字符串文字:
使用文本块:
SQL 例子
使用字符串文字:
使用文本块:
总结:
以上,就是 JDK 13 中包含的 5 个新特性,能够改变开发者编码风格的主要有 Text Blocks 和 Switch Expressions 两个新特性,但是这两个特性还处于预览阶段。
而且,JDK 13 并不是 LTS(长期支持)版本,如果你正在使用 Java 8(LTS)或者 Java 11(LTS),暂时可以不必升级到 Java 13。