Java 12的新功能
Java 12新功能介绍
Java 12于2019年3月19日发布。Java 12发布的几个新功能和增强功能使其成为几乎在所有方面都值得升级到Java 11的升级。Switch表达式、默认CDS存档、Shenandoah和Microbenchmark Suite是Java 12中值得特别提及的功能之一。
为了增加Java的生产力、可用性和适用性,这些功能已被添加。我们将在本文中深入讨论这些新功能。
Switch表达式(JEP 325)
有个有趣的事情要指出的是,Java 12在switch表达式方面有了一个值得注意的增强。它们现在可以作为语句和表达式同时使用,简化了代码并允许使用switch进行模式匹配。
在过去,不包含break语句可能导致默认情况的穿透,这是Java代码中常见的错误原因。然而,通过Java 12的最新更新,switch表达式中的默认情况现在是强制的,防止了这类问题。这些修改提高了Java 12作为开发人员的编程语言的效率和可靠性。
让我们通过示例代码来比较传统的switch语句(Java 11)和Java 12,以便更好地理解。
Stream API中的Collectors.teeing()
作为一种静态方法,我们提供了一个teeing收集器。Collectors::teeing。该收集器将其输入发送到两个额外的收集器,然后将它们的输出与一个函数进行合并。
可以通过tee
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class APITester {
public static void main(String[] args) {
double mean
= Stream.of(8, 9, 10, 11, 12, 13, 14)
.collect(Collectors.teeing(
Collectors.summingDouble(i -> i), Collectors.counting(),
(sum, n) -> sum / n));
System.out.println(mean);
}
}
输出
11.0
Shenandoah
你听说过Shenandoah吗?这是一种全新的增强型垃圾收集器,尽管它仍处于实验阶段。该GC算法通过与运行的Java线程同时执行疏散工作来提供低停顿时间。这意味着停顿时间不取决于堆大小。无论您的堆大小是5MB还是10GB,停顿时间都将相同。
JVM Constant API
如果您正在处理操作类和方法的程序,JVM常量API对您可能是一个有价值的工具。在这些类型的程序中,需要对字节码指令进行建模,并处理可加载的常量。虽然String或Integer类型的常量通常不会出现问题,但Class类型的常量可能更具挑战性。如果类无法访问或不存在,加载类可能会失败。
好消息是,新的API通过使用如ClassDesc、MethodTypeDesc、MethodHandleDesc和DynamicConstantDesc等接口来符号化处理常量值,简化了处理类常量的复杂性,使在程序中操作和管理它们更加容易。
Default CDS Archives
类数据共享(CDS)是一项重要功能,可以减少多个Java虚拟机的启动时间和内存占用。它通过在构建时使用生成的默认类列表来实现这一点,该列表包含了关键的核心库类。
在Java 12中,对该功能进行了更改——CDS归档现在默认处于启用状态。要禁用CDS并在没有使用CDS的情况下运行程序,我们需要手动将Xshare标志设置为”off”。
G1的可中止混合收集(JEP 344)
默认情况下,Garbage First(G1)垃圾收集器作为默认设置,具有强大的分析引擎,可确定收集集合。一旦启动该过程,它将无间断地收集所有活动对象。然而,当目标停顿时间超过时,此方法有时会导致性能问题。
为解决这个问题,G1收集集合现在分为可选和强制两个部分,允许中止该过程。优先处理强制集合通常可确保达到目标停顿时间,防止收集过程超出限制。这种技术对于使G1垃圾收集器高效运行具有关键作用,而不会引起任何重大性能问题。
微基准套件(JEP 230)
这是一项对开发人员来说具有重大意义的最新添加功能,现在开发人员可以轻松地创建和执行微基准测试。微基准测试是用于衡量单个代码片段或方法效果的重要工具。它们有助于找出性能障碍,并优化代码以最大程度地提高效率。
借助新推出的微基准套件,开发人员现在可以无需费力地运行现有的微基准测试或精心策划新的测试。该套件智能地集成到JDK源代码中,这意味着开发人员可以无缝对其代码进行基准测试。
默认类数据共享归档(JEP 341)
在Java 12中增强了CDS(默认类数据共享)归档创建过程。64位平台上的JDK构建过程使用默认类列表来实现这一点。因此,创建CDS归档的过程得到了改进和简化。
立即返回G1未使用的已提交内存(JEP 346)
Java 12中的G1垃圾收集器现在可以通过JEP 346将未充分利用的已分配内存迅速返回给操作系统。在Java 11中,G1垃圾收集器在空闲时不能将Java堆内存返回给操作系统,因此这是一次升级。由于G1垃圾收集器,Java 12提供了增强的内存管理能力,从而更有效地利用系统资源。
Files.mismatch()方法
引入了一个新颖的技术”Files.mismatch()”,它可以进行文件比较。这个有用函数的签名是”public static long mismatch(Path path1, Path path2) throws IOException”,如果没有不匹配的话会返回-1L。如果有不匹配,它将提供第一个不匹配的位置。
有两种不匹配的情况可能发生−
- 首先,如果文件大小不同,该方法将返回较小的文件大小。
-
此外,如果文件的字节不匹配,它将报告第一个不同字节的位置。
结论
Java 12拥有增强开发者的新功能。使用Switch表达式,Stream API中的collectors.teeing()和Shenandoah,Java现在更高效和可靠。JVM常量API,默认的CDS存档,G1的可中止混合集合和Microbenchmark套件使Java更具生产力和多用途。这些升级简化了代码并增加了应用程序的稳固性。