jdk13-新特性预览
一新特性
350: Dynamic CDS Archives(动态CDS档案)
351: ZGC: Uncommit Unused Memory(ZGC:取消提交未使用的内存)
353: Reimplement the Legacy Socket API(重新实现旧版套接字API)
354: Switch Expressions (Switch表达式)
355: Text Blocks(文字块)
二动态CDS归档(扩展应用程序类数据共享)
2.1主要实现功能:
允许在Java应用程序执行结束时动态归档类。归档的类将包括默认基层CDS归档中不存在的所有已加载应用程序类和库类。
2.2支持存档配置
方式一:基本静态存档(默认存档)+ 动态存档;
方式二:仅基本静态存档;
说明:动态存档是基于静态存档实现的,如果静态存档没有映射成功,动态存档无法实现。
2.3前提要求
1 需要运行一次或者多次生成class列表
2使用class列表存档
3将存档和应用一起运行
2.4生成动态存档指令
用户可以指定动态档案的文件名做为-XX:ArchiveClassesAtExit选项的入参。
示例创建动态归档hello.jsa :
% bin/java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
将归档文件和同一个应用运行:
% bin/java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello
2.3归档依赖性
动态创建的顶层归档取依赖于基础层存档(它包含指向基础层数据的指针),因此基础存档头和所有共享空间的CRC值都会记录在顶层中。
在运行时,当映射动态归档时,会将所有记录的CRC值与当前映射的基本归档CRC值进行比较。如果任何CRC值都不匹配,则禁用动态归档,而不会影响当前映射的基本归档的使用。
2.4动态档案的共享空间
动态档案的共享空间的元数据和静态档案的元数据类似。分割成4个空间不需md空间。
rw:读写
ro:只读
mc:
在运行的时候会分别映射
一台主机上运行可以运行同一套库的多个进程:
2个进程: -cp:lib.jar:foo.jar FooApp
4个进程: -cp:lib.jar:bar.jar BarApp
然后创建2个归档一个用在foo进程上,一个用在bar进程上,就是共享6个进程,达到节省内存目的。
三ZGC:取消提交未使用的内存
3.1实现功能:
将未使用的堆内存还给系统(即未提交的内存空间)
3.2原理概述
ZGC堆由一组称为ZPages的堆区域组成。每个ZPage与可变数量已提交的堆内存关联。当ZGC压缩堆时,ZPage被释放并插入到ZPageCache(页面缓存)中。页面缓存中的ZPage已准备好重新使用以满足新的堆分配,在这种情况下,它们将从缓存中删除。页面缓存对性能十分重要,提交和取消提交是非常昂贵的操作。
Zpage退出页面缓存的时机:
Zpage在页面缓存停留5分钟(默认值)后退出缓存,可以使用 -XX:ShenandoahUncommitDelay= 参数覆盖默认值
取消提交功能是默认启用(JVM选项:-XX:-ZUncommit),否则会引起堆内存低于最小大小堆(-Xms),最大最小堆方式启用的JVM会有禁用取消提交功能的提示。
四重新实现旧版套接字API
4.1简要说明:
会用更简单的实现方式替换java.net.Socket和java.net.ServerSocketAPI ,新的实现正在Project Loom中进行探索。
五 switch表达式
5.1功能实现:
主要是对switch表达式进行扩展,支持原有的case方式和新的case方式。新的case语句更加精炼简洁。
使用yield语句返回值,放弃了break语句。
5.2通常语法格式
T result = switch (arg) {
case L1 -> e1;
case L2 -> e2;
default -> e3;
};
5.3官方示例1
官方提供旧版本丢失了break的switch语句:
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
java13中的语法格式(提倡"case L ->"语法格式,提倡常量中用逗号隔开):
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);
}
5.4官方示例2:
老版本
int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break;
case TUESDAY:
numLetters = 7;
break;
case THURSDAY:
case SATURDAY:
numLetters = 8;
break;
case WEDNESDAY:
numLetters = 9;
break;
default:
throw new IllegalStateException("Wat: " + day);
}
jdk13新版本(官方提倡直接计算出值赋值给变量)
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
官方示例3(yield表达):
新版本:
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};
新版本:
int result = switch (s) {
case "Foo":
yield 1;
case "Bar":
yield 2;
default:
System.out.println("Neither Foo nor Bar, hmmm...");
yield 0;
};
5.4箭头标签语法特性
”case L -> “语法格式,如果标签匹配,则仅执行箭头右侧的表达式或语句;否则,将不执行任何操作(没有失败)
static void howMany(int k) {
switch (k) {
case 1 -> System.out.println("one");
case 2 -> System.out.println("two");
default -> System.out.println("many");
}
}
执行输出:
howMany(1);//one
howMany(2);//two
howMany(3);//many
5.5注意点
switch表达式必须以一个值正常完成,或者必须通过引发异常来突然完成,这回出现一些不完美的结果
首先,编译器会检查每个开关标签是否匹配,其次,控制语句,break,yield,return和continue,无法跳出switch表达式。
示例:
z:
for (int i = 0; i < MAX_VALUE; ++i) {
int k = switch (e) {
case 0:
yield 1;
case 1:
yield 2;
default:
continue z;
// ERROR! Illegal jump through a switch expression
};
...
}
六文字块
6.1 实现功能
将文本块添加至java语言,多行字符串不需要转义,提高代码的可读性。
6.2HTML示例
使用一维字符串:
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
使用二维文本块
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
6.3SQL示例
使用一维字符串:
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
"WHERE `CITY` = 'INDIANAPOLIS'\n" +
"ORDER BY `EMP_ID`, `LAST_NAME`;\n";
使用二维文本块:
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`
""";
6.4使用多语言例子
一维字符串:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("function hello() {\n" +
" print('\"Hello, world\"');\n" +
"}\n" +
"\n" +
"hello();\n");
二维文本块:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("""
function hello() {
print('"Hello, world"');
}
hello();
""");
6.5等效例子1
"""
line 1
line 2
line 3
"""
等效于
"line 1\nline 2\nline 3\n"
等效于
"line 1\n" +
"line 2\n" +
"line 3\n"
等效例子2(字符串的末尾不需要行终止符)
"""
line 1
line 2
line 3"""
等效于
"line 1\nline 2\nline 3"
等效于
String empty = """
""";
七参考链接(官网)
http://openjdk.java.net/projects/jdk/13/
八寄语
新版本的jdk固然加了新特性,但是我们的其他配套开发工具是否能跟上jdk半年一个版本的升级是一个问题。
而且新版本的jdk刚刚出来肯定有许多要改进的地方,鉴于学习我们是可以使用新版,如果是实际生产环境我觉得还是旧版本的jdk8,jdk11较好。

jdk13-新特性预览的更多相关文章
- C# 9.0 新特性预览 - 类型推导的 new
C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...
- C# 9.0 新特性预览 - 空参数校验
C# 9.0 新特性预览 - 空参数校验 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它 ...
- C# 9.0 新特性预览 - 顶级语句
C# 9.0 新特性预览 - 顶级语句 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们 ...
- C# 9.0 新特性预览 - init-only 属性
C# 9.0 新特性预览 - init-only 属性 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章 ...
- Windows Phone 8.1SDK新特性预览
前言 Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装.本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的 ...
- avalon1.3的新特性预览
avalon1.2的性能优化风暴很快就告一段落,入职也快一个月了,许多乱七八糟的事也少了下来,估计未来一个月会有许多好东呈现给大家. 首先是一个性能检测工具.由于MVVM是将原本由人脑干的事,转到各种 ...
- Office 2016 正式发布——新特性预览
今天微软又发生了一件大事!Windows Office 2016正式发布,这标志着Windows Office 又达到了一个新的里程碑! 全新的Office 发布为Office 365 用户带来了新的 ...
- CSS3_新特性预览
一.强大的CSS选择器 以前我们通常用class. ID 或 tagname 来选择HTML元素,CSS3的选择器强大的难以置信. 它们可以减少在标签中的class和ID的数量更方便的维护样式表.更 ...
- Vue.js 3.0 新特性预览
总结起来,Vue 3 以下方面值得我们期待 : 更快 更小 更易于维护 更多的原生支持 更易于开发使用 完整的PPT:docs.google.com/presentatio… Evan 和 Vue 团 ...
- 20天等待,申请终于通过,安装和体验IntelliJ IDEA新UI预览版
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于IDEA的预览版 IDEA会启用新的UI,这事情之 ...
随机推荐
- ASP.NET Core MVC+EF Core项目实战
项目背景 本项目参考于<Pro Entity Framework Core 2 for ASP.NET Core MVC>一书,项目内容为party邀请答复. 新建项目 本项目开发工具为V ...
- ASP.NET Core 中的 ObjectPool 对象重用(一)
前言 对象池是一种设计模式,一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象.池的对象可以从池中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁他,他是一种 ...
- python网络爬虫之入门[一]
目录 前言 一.探讨什么是python网络爬虫? 二.一个针对于网络传输的抓包工具fiddler 三.学习request模块来爬取第一个网页 * 扩展内容(爬取top250的网页) 后记 @(目录) ...
- 使用python删除指定文件夹及子文件,保留多少
python版本为:2.7 import os,time,shutil,datetime def rmdir(deldir,N): dellist=os.listdir(deldir) deldate ...
- hashtable基础
- 用生动的案例一步步带你学会python多线程模块
鱼和熊掌不可兼得 鱼,我所欲也,熊掌,亦我所欲也,二者不可得兼,舍鱼而取熊掌者也. 从6月开始写公众号,连着四个月一直尽量保证一周五更,结果整天熬夜搞的身体素质骤降.十一休假决定暂时将公众号放放,好好 ...
- 带着canvas去流浪系列之五 绘制K线图
[摘要] 用canvas原生API实现百度Echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
- 全新一代云服务器S6,重新定义性价比
S6通用计算型云服务器,搭载全新一代处理器,配套华为自研高性能智能网卡,计算与网络性能全面升级.S6进一步强化高性价比定位,满足企业性能要求的同时,降低中小企业上云成本. 更多详情请访问ECS产品介绍 ...
- 使用react-breadcrumbs-dynamic
这是完全独立于路由器的解决方案,你可以将其与任何版本的React Router(2或3或4)或任何其他用于React的路由库一起使用,或者完全不进行路由.您只需要指定面包屑项目及其道具的组件.然而道具 ...
- SpringBoot使用注解(@value)读取properties(yml)文件中 配置信息
为了简化读取properties文件中的配置值,spring支持@value注解的方式来获取,这种方式大大简化了项目配置,提高业务中的灵活性. 1. 两种使用方法1)@Value("#{co ...