JavaRush /Java 博客 /Random-ZH /Java 12 来了:有什么新变化?

Java 12 来了:有什么新变化?

已在 Random-ZH 群组中发布
因此,Java 出现在第 12 位。尽管这不是 LTS 版本(即不是长期支持,不是长期支持的版本)。版本11被认为是第一个具有 8 个版本的 LTS 版本年支持期),更新中出现了有趣的事情。让我们看看其中最重要的一些。回想一下,在 Java 中,变更提案缩写为 jeps(来自 JDK 增强提案)。 Java 12 来了:有什么新变化? - 1

最有趣的 Jep 的 JDK 12

189:Shenandoah:低暂停时间垃圾收集器(实验性) 垃圾收集器 Shenandoah 使用一种新算法,通过在运行 Java 线程的同时进行清理来减少运行时间。在这种情况下,无论堆的大小如何,Shenandoah 中的暂停时间都将相同。由于某种原因,Oracle 没有将 Sheandoah 包含在其“官方”版本中,尽管开发人员认为此功能是新版本中最重要的功能之一。因此,如果您打算尝试高级垃圾收集器,则需要使用第三方构建,例如Azul230:Microbenchmark Suite Microbenchmark 是衡量某些小元素性能的微基准。在 Java 中,它们是使用 JMH 框架编写和运行的。从版本 12 开始,JMH 已添加到 JDK 中,并且已经编写了测试,这使开发人员的工作更加轻松。 325:Switch 表达式(预览) 使用 switch 语句编写表达式的新形式。该功能页面提供了使用传统 switch 的示例代码,其中不断使用break使其变得不必要的冗长,导致频繁的随机错误。
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;
}
更新的作者建议引入一种新形式的开关标签“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);
}
334:JVM Constants API 常量池包含所谓的可加载常量。这些是值,例如 String 类型或任何原始类型,以及运行时工件,例如类和方法。当使用类文件时,程序员将受益于操作可加载常量的便捷工具。这个 jep 的作者开始通过引入新的基于值的符号链接类型来解决这个问题,每个符号链接都将描述一种特定类型的常量。创新代码340:一个 AArch64 端口,而不是两个 这个复杂的名称隐藏了 Java 9 中出现的问题的解决方案,当时 Oracle 的 64 位 ARM 端口和 Red Hat 的 aarch64 同时出现在套件中。而且,在 JDK 11 发布时,甚至 Oracle 本身也不支持 64 位版本的 Oracle ports。因此,现在 64 位 Oracle 端口已被删除,只剩下 32 位 ARM32 和 64 位、效率更高的 aarch64。 341:默认 CDS 存档 一个非常好的更新,因为它确实加快了应用程序的启动速度。众所周知,当 Java 应用程序启动时,就会开始加载大量的类,这是一个相当漫长的过程。CDS 代表类数据共享,此功能允许您使用这些相同类的默认列表,将启动时启动的所有这些类打包到一个特殊的类数据共享存档中。结果,应用程序启动速度显着提高。 344:G1 的可中止混合收集 G1 是一个垃圾收集器,成为 JDK 9 中的主要垃圾收集器,取代了并行 GC。在Java 10中,G1学会了在多线程中收集垃圾。然而,并不是每个人都对他的工作感到满意;主要问题之一是长时间的停顿。现在它们可以被取消。G1 基于对程序行为的分析,确定工作量,然后将“活动”对象收集到 Collection 集中,直到收集完所有内容,而不会停止。G1经常会错过工作量的计算,并且工作时间过长。一旦实现了 jep-344,G1 就可以切换到增量垃圾收集,如果下一步需要比合理时间更长的时间来完成,则可以中止该步骤。 346:立即从 G1 返回未使用的提交内存 还有前面提到的 G1 汇编器阵营中的一些更新。有时候会出现Java堆内存一堆,但是没有人用,这块内存。在 Java 12 中,您现在可以将不活动内存“返回”给操作系统。以前,让G1放弃内存的情况很少见,但现在一切都变得简单了。使用新功能,如果自上次构建以来的时间间隔已过并且不存在并发周期,则应用程序将被定义为非活动状态。另一种情况是,如果已监控一段时间的 getloadavg() 函数显示负载低于设置的可接受阈值。如果发生两个事件之一,则部分垃圾收集开始。 Java 12 没有的功能:原始字符串文字 许多开发人员对这个功能很感兴趣,但它从未出现在这个版本中。它的作者认为它仍然需要工作。因此,我们敢于希望在 Java 的下一版本中出现一个方便处理字符串文字的函数。对原始字符串文字的支持使您可以使用任何语言的字符串信息。这消除了屏蔽的需要。在广泛使用反斜杠的正则表达式中以及使用反斜杠作为分隔符的 Windows 路径中特别有用。也就是说,要避免这样的结构: C:\\My\\Test\\Pack\\
每个程序员在工作中经常会遇到这样或那样的困难。有时它们与开发人员的经验不足有关,但有时与工具本身的不完善有关。Java 是一门伟大的语言,但它还远非完美。也许您已经遇到过 Java 中的一些东西,并且知道您想在您的“工具”(语言)中改变什么?在评论中分享吧!

结论

Java 12 没有发生革命。然而,没有人计划这么做。然而,许多创新旨在优化应用程序的运行并加快工作速度,这是个好消息。顺便说一句,IDEA 已经支持 JDK 12,因此您可以尝试一下它的功能。当然,很少有更新直接影响初学者,尽管即使是那些刚刚开始学习 JavaRush 的人也可以使用新的开关(在设置 --enable-preview 标志之后)。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION