Java 13 明天发布,最新最全新特性解读
△Hollis, 一个对Coding有着独特追求的人△
这是Hollis的第 229篇原创分享
作者 l Hollis
来源 l Hollis(ID:hollischuang)
2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布。
目前,JDK官网上已经可以看到JDK 13的进展,最新版的JDK 13将于2019年9月17日发布。
目前,JDK13处于Release-Candidate Phase(发布候选阶段),将于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)
下面来逐一介绍下这五个重要的特性。
1、Dynamic CDS Archives
这一特性是在JEP310:Application Class-Data Sharing 基础上扩展而来的,Dynamic CDS Archives中的CDS指的就是Class-Data Sharing。
那么,这个JEP310是个啥东西呢?
我们知道在同一个物理机/虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内存占用是比较高的。所以Java团队引入了CDS的概念,通过把一些核心类在每个JVM间共享,每个JVM只需要装载自己的应用类,启动时间减少了,另外核心类是共享的,所以JVM的内存占用也减少了。
CDS 只能作用于 Boot Class Loader 加载的类,不能作用于 App Class Loader 或者自定义的 Class Loader 加载的类。
在 Java 10 中,则将 CDS 扩展为 AppCDS,顾名思义,AppCDS 不止能够作用于 Boot Class Loader了,App Class Loader 和自定义的 Class Loader 也都能够起作用,大大加大了 CDS 的适用范围。也就说开发自定义的类也可以装载给多个JVM共享了。
Java 10中包含的JEP310的通过跨不同Java进程共享公共类元数据来减少了内存占用和改进了启动时间。
但是,JEP310中,使用AppCDS的过程还是比较复杂的,需要有三个步骤:
1、决定要 Dump 哪些 Class
2、将类的内存 Dump 到归档文件中
3、使用 Dump 出来的归档文件加快应用启动速度
这一次的JDK 13中的JEP 350 ,在JEP310的基础上,又做了一些扩展。允许在Java应用程序执行结束时动态归档类,归档类将包括默认的基础层 CDS(class data-sharing)存档中不存在的所有已加载的应用程序类和库类。
也就是说,在Java 13中再使用AppCDS的时候,就不在需要这么复杂了。
2、ZGC: Uncommit Unused Memory
在讨论这个问题之前,想先问一个问题,JVM的GC释放的内存会还给操作系统吗?
GC后的内存如何处置,其实是取决于不同的垃圾回收器的。因为把内存还给OS,意味着要调整JVM的堆大小,这个过程是比较耗费资源的。
在JDK 11中,Java引入了ZGC,这是一款可伸缩的低延迟垃圾收集器,但是当时只是实验性的。并且,ZGC释放的内存是不会还给操作系统的。
而在Java 13中,JEP 351再次对ZGC做了增强,本次 ZGC 可以将未使用的堆内存返回给操作系统。之所以引入这个特性,是因为如今有很多场景中内存是比较昂贵的资源,在以下情况中,将内存还给操作系统还是很有必要的:
- 1、那些需要根据使用量付费的容器
- 2、应用程序可能长时间处于空闲状态并与许多其他应用程序共享或竞争资源的环境。
- 3、应用程序在执行期间可能有非常不同的堆空间需求。例如,启动期间所需的堆可能大于稍后在稳定状态执行期间所需的堆。
3、Reimplement the Legacy Socket API
[0.033s][info ][class,load] java.net.Socket source: jrt:/java.base
[0.035s][info ][class,load] java.net.SocketOptions source: jrt:/java.base
[0.035s][info ][class,load] java.net.SocketImpl source: jrt:/java.base
[0.039s][info ][class,load] java.net.SocketImpl$$Lambda$1/0x0000000800b50840 source: java.net.SocketImpl
[0.042s][info ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
[0.042s][info ][class,load] sun.nio.ch.NioSocketImpl source: jrt:/java.base
[0.043s][info ][class,load] sun.nio.ch.SocketDispatcher source: jrt:/java.base
[0.044s][info ][class,load] java.net.DelegatingSocketImpl source: jrt:/java.base
[0.044s][info ][class,load] java.net.SocksSocketImpl source: jrt:/java.base
[0.044s][info ][class,load] java.net.ServerSocket source: jrt:/java.base
[0.045s][info ][class,load] jdk.internal.access.JavaNetSocketAccess source: jrt:/java.base
[0.045s][info ][class,load] java.net.ServerSocket$1 source: jrt:/java.base
[0.037s][info ][class,load] java.net.Socket source: jrt:/java.base
[0.039s][info ][class,load] java.net.SocketOptions source: jrt:/java.base
[0.039s][info ][class,load] java.net.SocketImpl source: jrt:/java.base
[0.043s][info ][class,load] java.net.SocketImpl$$Lambda$1/0x0000000800b50840 source: java.net.SocketImpl
[0.046s][info ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
[0.047s][info ][class,load] java.net.AbstractPlainSocketImpl source: jrt:/java.base
[0.047s][info ][class,load] java.net.PlainSocketImpl source: jrt:/java.base
[0.047s][info ][class,load] java.net.AbstractPlainSocketImpl$1 source: jrt:/java.base
[0.047s][info ][class,load] sun.net.ext.ExtendedSocketOptions source: jrt:/java.base
[0.047s][info ][class,load] jdk.net.ExtendedSocketOptions source: jrt:/jdk.net
[0.047s][info ][class,load] java.net.SocketOption source: jrt:/java.base
[0.047s][info ][class,load] jdk.net.ExtendedSocketOptions$ExtSocketOption source: jrt:/jdk.net
[0.047s][info ][class,load] jdk.net.SocketFlow source: jrt:/jdk.net
[0.047s][info ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions source: jrt:/jdk.net
[0.047s][info ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions$1 source: jrt:/jdk.net
[0.048s][info ][class,load] jdk.net.LinuxSocketOptions source: jrt:/jdk.net
[0.048s][info ][class,load] jdk.net.LinuxSocketOptions$$Lambda$2/0x0000000800b51040 source: jdk.net.LinuxSocketOptions
[0.049s][info ][class,load] jdk.net.ExtendedSocketOptions$1 source: jrt:/jdk.net
[0.049s][info ][class,load] java.net.StandardSocketOptions source: jrt:/java.base
[0.049s][info ][class,load] java.net.StandardSocketOptions$StdSocketOption source: jrt:/java.base
[0.051s][info ][class,load] sun.net.ext.ExtendedSocketOptions$$Lambda$3/0x0000000800b51440 source: sun.net.ext.ExtendedSocketOptions
[0.057s][info ][class,load] java.net.DelegatingSocketImpl source: jrt:/java.base
[0.057s][info ][class,load] java.net.SocksSocketImpl source: jrt:/java.base
[0.058s][info ][class,load] java.net.ServerSocket source: jrt:/java.base
[0.058s][info ][class,load] jdk.internal.access.JavaNetSocketAccess source: jrt:/java.base
[0.058s][info ][class,load] java.net.ServerSocket$1 source: jrt:/java.base
4、Switch Expressions (Preview)
switch (x) {
case "1":
i=1;
break;
case "2":
i=2;
break;
default:
i = x.length();
break;
}
case "1" -> 1;
case "2" -> 2;
default -> {
int len = args[1].length();
yield len;
}
};
case "1": yield 1;
case "2": yield 2;
default: {
int len = args[1].length();
yield len;
}
};
5、Text Blocks (Preview)
<body>
<p>Hello, Hollis</p>
</body>
</html>
" <body>\n" +
" <p>Hello, Hollis</p>\n" +
" </body>\n" +
"</html>\n";
<html>
<body>
<p>Hello, Hollis</p>
</body>
</html>
""";
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
6、总结
推荐阅读:
喜欢我可以给我设为星标哦
好文章,我 在看
Java 13 明天发布,最新最全新特性解读相关推荐
- Java 13,最新最全新特性解读
2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 目前,JDK官网上已经可以看到JDK 13的进展,最新版的JDK ...
- 鸿蒙os上海交大教授,等了两年,鸿蒙OS明天发布,十大特性抢先看!
上周二,华为正式对外宣布,研发两年多的鸿蒙 OS 将于 6 月 2 号,也就是明晚八点正式发布. 华为表示,发布会上不仅会推出「华为WATCH 3.华为 MatePad Pro」等多款搭载鸿蒙 OS ...
- JDK13 GA发布:5大特性解读
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 阿飞 来源 | 公众号「阿飞的博客」 JDK13 GA版本 5大新特性如下: 35 ...
- layuiajax提交表单控制层代码_有奖直播TI最新低成本 C2000特性解读,快速上手精细电源与电机控制!...
在不断发展的汽车和工业电源转换市场中,设计人员正在寻求能够帮助他们应对两个关键设计挑战的创新:如何轻松扩展实时控制资源?以及如何构建和维护长期的平台解决方案? 长按下方二维码,预约直播:TI最新C20 ...
- java9新特性 2017_Java 9 ← 2017,2019 → Java 13 ,来看看Java两年来的变化
作者 l Hollis来源 l Hollis(ID:hollischuang)距离 2019 年结束,只剩下 35 天了.你做好准备迎接 2020 年了吗?一到年底,人就特别容易陷入回忆和比较之中,比 ...
- java 12 、13、14、15新特性汇总
java 12 Switch 表达式 使用Java 12,switch不仅可以作为语句也可以作为表达式. 无论作为语句或者作为表达式,switch都可以使用传统/简化的作用域和控制流行为. 这将有助于 ...
- Java 9 ← 2017,2019 → Java 13 ,来看看Java两年来的变化
距离 2019 年结束,只剩下 10 几天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天, 的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋 ...
- java9 变化_Java 9 ← 2017,2019 → Java 13,来看看Java两年来的变化
距离 2019 年结束,只剩下 33 天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋友圈, ...
- Java 9 ← 2017,2019 → Java 13 ,Java 两年来都经历了什么?| CSDN 博文精选
作者 | Hollis 责编 | maozz 出品 | CSDN 博客 距离 2019 年结束,只剩下 35 天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说 ...
- java 和javafx_9月的十大Java故事:Java 13,JavaFX 13和Jakarta EE 8
java 和javafx 简而言之,9月对于Java来说是繁忙的月份. 我们不仅发布了JFX 13和Jakarta EE 8,而且Java 13还发布了一些新的JEP和功能预览. 即使天气变凉,Jav ...
最新文章
- zynq7000 clk 设备树时钟对照表
- 【TensorFlow】PyCharm中无法识别tensorflow、numpy等Python库问题的解决办法
- python众数问题给定含有n个元素的多重集合s_2-1 问题描述:给定含有n个元素的多重集合S - 下载 - 搜珍网...
- Struts2笔记——struts常用标签
- 在win8下安装使用java及在win8下部署java环境变量-图文
- slave_exec_mode参数跳过复制异常
- android中的handler例
- 经典卷积神经网络---VGG16网络
- The POM for is missing, no dependency information available
- 二三、A转置乘以A可逆
- python插值算法_python插值算法
- C++[USACO06NOV] Fence Repair G合并果子
- Go语言之flag基础用法
- 电子面单打印结果通知回调API接口
- oracle11gora1435,oracle导入的问题
- 什么是北向接口和南向接口?
- 第2-1课:非线性方程与牛顿迭代法
- 苹果ppt_毫无惊喜的苹果新品发布会,用到的这4个PPT技巧却值得学习
- 如何更新计算机的flash player,flash插件如何升级?win7升级flash插件的方法
- jquery 滚动特效
热门文章
- 计算机专业课911,2018年北京物资学院911计算机学科专业基础综合考研复习资料...
- mocha-only和skip的用法
- 教程 | 10分钟成为简笔画达人 6(POP字体+简笔技法)
- dna数据u盘_DNA数据库黑客时代来临
- 整理总结:英语口语发音技巧
- ucore开启虚拟存储器过程详解
- 晦涩难懂的c语言语句,《C++覆辙录》——2.12:晦涩难懂的operator -
- kindle长时间不用,屏幕显示电池感叹号,一直充电没反应,试了网上的方法都不好用,到亚马逊官网找到了解决办法
- 《科学》:基因编辑婴儿入选年度“科学崩坏”事件
- 一句话讲清种子轮、天使轮、ABC轮的区别