APP下载
报价宝  ›  科技  › 

JDK13:5大新特性首发 等你来看

报价宝 来源:baojiabao.com 发布时间:2019-11-08 05:51:00 10月02日更新
报价宝综合消息JDK13:5大新特性首发 等你来看

JDK13:5大新特性:

350: Dynamic CDS Archives351: ZGC: Uncommit Unused Memory353: Reimplement the Legacy Socket API354: Switch Expressions (Preview)355: Text Blocks (Preview)

350: Dynamic CDS Archives

了解这个特性之前,需要先了解一下跟它有很大关联的特性JEP310:Application Class-Data Sharing,简称AppCDS。这个特性简介就是为了改善JVM应用的启动速度和内存占用,并且扩充套件了CDS(Class-Data Sharing)特性从而允许应用的类也可以被放置在共享的归档类(archived classes)档案中。这个JEP310的主要目标如下:

通过共享不同Java程序之间通用的类元资料从而减少内存占用;

改进启动时间;

扩充套件CDS从而允许归档类被载入到自定义类载入器中;

扩充套件CDS允许归档类来自JDK执行时映象档案($JAVA_HOME/lib/modules);

成功参考指标:

多JVM程序能够节省很大的内存空间;

程序的启动时间提升明显;

JEP350特性期望扩充套件CDS,从而允许在Java应用执行后进行动态类归档,归档的类将包括当前预设基础CDS归档中不存在的应用类和库中的类。这个特性的主要目标有:

提高CDS的可用性,消除了使用者使用时为每个应用程序建立类列表(class list)的需要;

通过-Xshare:dump引数开启静态归档,包括内建的类载入器和使用者自定义的类载入器。

在这之前,如果Java应用要使用CDS的话,3个步骤是必须的:

执行一次或者多次试执行,从而建立一个class list;

通过使用建立的class list来dump一个归档(archive);

用这个归档来执行;

使用示例:

# JVM退出时动态建立共享归档档案

bin/java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello

# 用动态建立的共享归档档案执行应用

bin/java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello

351: ZGC: Uncommit Unused Memory

增强ZGC特性,将没有使用的堆内存归还给操作系统。ZGC当前不能把内存归还给操作系统,即使是那些很久都没有使用的内存,有点像貔貅一样,只进不出,哈哈。这种行为并不是对任何应用和环境都是友好的,尤其是那些内存占用敏感的服务,例如:

按需付费使用的容器环境;

应用可能长时间闲置,并且和很多其他应用共享和竞争资源的环境;

应用在执行期间有非常不同的堆空间需求,例如,可能在启动的时候比稳定执行的时候需要更多的内存。

HotSpot的G1和Shenandoah这两个GC已经提供了这种能力,并且对某些使用者来说,非常有用。因此,把这个特性引入ZGC会得到这些使用者的欢迎。

ZGC的堆又若干个Region组成,每个Region被称之为ZPage。每个Zpage与数量可变的已提交内存相关联。当ZGC压缩堆的时候,ZPage就会释放,然后进入page cache,即ZPageCache。这些在page cache中的ZPage集合就表示没有使用部分的堆,这部分内存应该被归还给操作系统。回收内存可以简单的通过从page cache中逐出若干个选好的ZPage来实现,由于page cache是以LRU顺序储存ZPage的,并且按照尺寸(小,中,大)进行隔离,因此逐出ZPage机制和回收内存相对简单了很多,主要挑战是设计关于何时从page cache中逐出ZPage的策略。

一个简单的策略就是设定一个超时或者延迟值,表示ZPage被驱逐前,能在page cache中驻留多长时间。这个超时时间会有一个合理的预设值,也可以通过JVM引数覆盖它。Shenandoah GC用了一个型别的策略,预设超时时间是5分钟,可以通过引数-XX:ShenandoahUncommitDelay = milliseconds覆盖预设值。

像上面这样的策略可能会运作得相当好。但是,使用者还可以设想更复杂的策略:不需要新增任何新的命令列选项。 例如,基于GC频率或某些其他资料找到合适超时值的启发式算法。JDK13将使用哪种具体策略目前尚未确定。可能最初只提供一个简单的超时策略,使用-XX:ZUncommitDelay = seconds选项,以后的版本会新增更复杂、更智慧的策略(如果可以的话)。

uncommit能力预设是开启的,但是无论指定何种策略,ZGC都不能把堆内存降到低于Xms。这就意味着,如果Xmx和Xms相等的话,这个能力就失效了,-XX:-ZUncommit这个引数也能让这个内存管理能力失效。

353: Reimplement the Legacy Socket API

用一个易于维护和Debug的,更简单、更现代的实现来取代java.net.Socket和java.net.ServerSocket。Socket和ServerSocket可以追溯到JDK1.0,它们的实现混合了Java和C程式码,维护和除错都非常痛苦。而且其实现用执行绪栈来进行IO buffer,导致某些场景需要调大Xss。

全新实现的NioSocketImpl,用来取代PlainSocketImpl,它的优点如下:

非常容易维护和Debug;

直接使用JDK的NIO实现,不需要自己的原生代码;

结合了buffer cache机制,所以不需要用执行绪栈来进行IO操作;

用JUC的锁取代synchronized修饰的方法;

354: Switch Expressions (Preview)

扩充套件Switch表示式,既能用陈述的方式,也能用表示式的方式。并且这两种形式都可以用传统方式(case … : labels),或者新的方式(case … -> labels),并且还准备引入表示式匹配(JEP305),类似这种玩法:

if (obj instanceof String s && s.length > 5) {

.. s.contains(..) ..

}

Switch表示式最初在JEP325中被提出,在JDK12中作为预览特性,根据反馈,这次的JEP354相比JEP325有一些改变,新版Switch表示式用法参考如下:

switch (day) {

case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);

case TUESDAY -> System.out.println(7);

case THURSDAY, SATURDAY -> System.out.println(8);

case WEDNESDAY -> System.out.println(9);

}

int numLetters = switch (day) {

case MONDAY, FRIDAY, SUNDAY -> 6;

case TUESDAY -> 7;

case THURSDAY, SATURDAY -> 8;

case WEDNESDAY -> 9;

};

355: Text Blocks (Preview)

即文字块。文字块就是指多行字串,例如一段格式化后的xml、json等。使用者不需要转义,Java能自动搞定。这个需求是承接自JEP326,JEP326已经废弃。

JEP326使用`这个符号,例如:

String html = `

Hello World.

`;

JEP355使用"""这个符号,例如:

String html = """

Hello World.

""";

JEP326废除的原因:JEP326时把注意力放在字串的原始性上,但是现在意识到这种关注是错误的。因为源代码中原始字串跨多行是很常见的,但是在内容中支付非转义分隔符的程式码很大,这样的话,在使用者使用多行字串的时候,效率就会受到影响。原文如下:

because while raw string literals could easily span multiple lines of source code, the cost of supporting unescaped delimiters in their content was extreme. This limited the effectiveness of the feature in the multi-line use case

新版本文字块特性的目标:

简化表达多行字串,不需要转义;

增强可读性;

接下来展示几种使用程式码块特性前后的字串申明方式。

HTML示例

一维表达方式(旧):

String html = " " +

" " +

"

Hello, world

" +

" " +

" ";

二维表达方式(新):

String html = """

Hello, world

""";

SQL示例

一维表达方式(旧):

String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` " +

"WHERE `CITY` = 'INDIANAPOLIS' " +

"ORDER BY `EMP_ID`, `LAST_NAME`; ";

二维表达方式(新):

String query = """

SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`

WHERE `CITY` = 'INDIANAPOLIS'

ORDER BY `EMP_ID`, `LAST_NAME`;

""";

参考连结地址:https://openjdk.java.net/projects/jdk/13/

“往期精彩”

↓↓↓↓

深(浅)入(出)剖析G1(Garbage First)

Shenandoah GC:一个来自OpenJDK12的全新并发压缩垃圾回收器

【阿飞的部落格】公众号二维码

↓↓↓↓

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 报价宝 笔记本电脑价格 电视机价格 小米手机价格 华为手机价格