网站首页 > java教程 正文
一、简介
去年九月,Oracle推出了一个长期支持的版本Java 11 (18.9 LTS),但是此次发布的Java 12是短期支持版本,可以在下一个版本发布之前获得Oracle的商业支持。自 2 月 7 日开始,Java/JDK 12 就进入了 RC 阶段。按照发布周期,美国当地时间 3 月 19 日Java 12 正式发布面世了!
版本号
java -version
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode)
从version信息可以看出是build 12+33
二、新特性
官网上是这样描述的:
总的来说是八大重大功能更新:
- 189 Shenandoah: A Low-Pause-Time Garbage Collector - (Experimental) 低暂停时间的GC
- 230 Microbenchmark Suite 微基准测试套件
- 325 Switch Expressions (Preview) Switch表达式
- 334 JVM Constants API JVM常量API
- 340 One AArch64 Port, Not Two 只保留一个AArch64实现
- 341 Default CDS Archives 默认类数据共享归档文件
- 344 Abortable Mixed Collections for G1 可中止的G1 Mixed GC
- 346 Promptly Return Unused Committed Memory from G1 G1及时返回未使用的已分配内存
三、新特性简解
JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
Shenandoah:低暂停时间的 GC(实验性功能)
新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200MB 还是 200GB,都将具有相同的暂停时间。
JEP 230: Microbenchmark Suite
微基准测试套件
JDK 源码中新增了一套微基准测试套件,开发人员可通过它轻松运行已有的微基准测试并创建新的基准测试。
JEP 325: Switch Expressions (Preview)
Switch 表达式(预览功能)
对 switch 语句进行了扩展,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的 "case L ->" 模式匹配语法作用于不同范围并控制执行流。这些更改将简化日常编码工作,并为 switch 中的模式匹配(JEP 305)做好准备。
- 代码示例
原先版本写法:
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; }
新版本写法:
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); }
JEP 334: JVM Constants API
JVM 常量 API
引入 API 来对关键类文件(key class-file)和运行时工件(run-time artifacts)的名义描述(nominal descriptions)进行建模,特别是可从常量池加载的常量。
在新的 java.lang.invoke.constant 包中定义了一系列基于值的符号引用(JVMS 5.1)类型,它们能够描述每种可加载常量。
符号引用以纯 nominal 形式描述可加载常量,与类加载或可访问性上下文区分开。有些类可以作为自己的符号引用(例如 String),而对于可链接常量,定义了一系列符号引用类型(ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc),它们包含描述这些常量的 nominal 信息。
- 以String#indent(int)为例
该方法允许我们调整String实例的缩进。
String result = "foo\nbar\nbar2".indent(4); System.out.println(result); // foo // bar // bar2 System.out.println(result.length()); // 25
- String#transform(Function)
JDK-8203442引入的一个小方法,它提供的函数作为输入提供给特定的String实例,并返回该函数返回的输出。
var result = "foo".transform(input -> input + " bar"); System.out.println(result); // foo bar
或者
var result = "foo" .transform(input -> input + " bar") .transform(String::toUpperCase) System.out.println(result); // FOO BAR
但是,这并不意味着我们应该这样做。
public <R> R transform(Function<? super String, ? extends R> f) { return f.apply(this); }
在某种情况下 该方法应该被称为map().
- String#describeConstable
一个非常有趣的方法来自新引入的接口java.lang.constant.Constable - 它用于标记constable类型,这意味着这类型的值是常量,可以在JVMS 4.4常量池中定义.
/** * Returns an {@link Optional} containing the nominal descriptor for this * instance, which is the instance itself. * * @return an {@link Optional} describing the {@linkplain String} instance * @since 12 */ @Override public Optional<String> describeConstable() { return Optional.of(this); } String#resolveConstantDesc(MethodHandles$Lookup) 不会经常手动调用来自java.lang.constant.ConstantDesc。 /** * Resolves this instance as a {@link ConstantDesc}, the result of which is * the instance itself. * * @param lookup ignored * @return the {@linkplain String} instance * @since 12 */ @Override public String resolveConstantDesc(MethodHandles.Lookup lookup) { return this; }
JEP 340: One AArch64 Port, Not Two
只保留一个 AArch64 实现
在保留 32 位 ARM 实现和 64 位 aarch64 实现的同时,删除与 arm64 实现相关的所有源码。
JDK 中存在两套 64 位 ARM 实现,主要存在于 src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目录。两者都实现了 aarch64,现在将只保留后者,删除由 Oracle 提供的 arm64。这将使贡献者将他们的精力集中在单个 64 位 ARM 实现上,并消除维护两套实现所需的重复工作。
JEP 341: Default CDS Archives
默认类数据共享归档文件
针对 64 位平台,使用默认类列表增强 JDK 构建过程,以生成类数据共享(class data-sharing,CDS)归档。
JEP 344: Abortable Mixed Collections for G1
可中止的 G1 混合 GC
如果混合 GC 的 G1 存在超出暂停目标的可能性,则使其可中止。
JEP 346: Promptly Return Unused Committed Memory from G1
G1 及时返回未使用的已分配内存
增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统。
为了实现向操作系统返回最大内存量的目标,G1 将在应用程序不活动期间定期执行或触发并发周期以确定整体 Java 堆使用情况。这将导致它自动将 Java 堆的未使用部分返回给操作系统。而在用户控制下,可以可选地执行完整的 GC,以使返回的内存量最大化。
四、移除内容
- 移除com.sun.awt.SecurityWarnin;
- 移除FileInputStream、FileOutputStream、- Java.util.ZipFile/Inflator/Deflator的finalize方法;
- 移除GTE CyberTrust Global Root;
- 移除javac的-source, -target对6及1.6的支持,同时移除--release选项;
五、废弃内容
- 废弃的API列表见deprecated-list
- 废弃-XX:+/-MonitorInUseLists选项
- 废弃Default Keytool的-keyalg值
六、总结
- java12不是LTS(Long-Term Support)版本(oracle版本才有LTS),oracle对该版本的support周期为6个月。这个版本主要有几个更新点,一个是语法层更新,一个是API层面的更新,另外主要是GC方面的更新。
- 语法层面引入了preview版本的Switch Expressions;API层面引入了JVM Constants API,引入CompactNumberFormat,让NumberFormat支持COMPACTSTYLE,对String、Files、Collectors、CompletionStage等新增方法;GC方面引入了experimental版本的Shenandoah GC,不过oracle build的openjdk没有enable Shenandoah GC support;另外主要对ZGC及G1 GC进行了改进。
- 其中JDK12对ZGC支持了Concurrent Class Unloading,默认是开启,使用-XX:-ClassUnloading可以禁用;对于G1 GC则新增支持Abortable Mixed Collections以及Promptly Return Unused Committed Memory特性。
七、精彩评论
贡献者
- IT实战联盟-Line
- IT实战联盟-咖啡
猜你喜欢
- 2024-10-10 Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响
- 2024-10-10 重大消息:java 13 正式发布GA版本
- 2024-10-10 Java 21发布计划,正式开启!(招标计划发布 规定)
- 2024-10-10 我的世界:1.18种子数量增多了?疾跑变强!21w41a快照介绍
- 2024-10-10 Java 又双叒叕发布新版本,这么多版本如何灵活管理?
- 2024-10-10 Java 5 问世(JDK 1.5,采用新的版本控制系统)
- 2024-10-10 超赞!IDEA 最新版本,支持免打扰和轻量模式!
- 2024-10-10 3. Java 三大版本(java三个版本)
- 2024-10-10 重磅!Spring Boot 2.6 正式发布,一大波新特性,看完我彻底躺平了
- 2024-10-10 JavaWeb全新版本教程(javaweb入门教程)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)