五、Java 12 新特性概述

news2025/1/12 8:00:46

五、Java 12 新特性概述

JDK12 在 2019 年 3 月 19 号正式发布,不同于JDK11,JDK12并不是一个LTS版本。作为一个中间版本,JDK12版本特性增加较少。 2017年宣布的加速发布节奏要求每六个月发布一次功能,每季度更新一次,每三年发布一次长期支持(LTS)更新版本(或每六个版本一次)。

1、知识体系

在这里插入图片描述

2、新功能和库的更新

1、JEP334: JVM常量API

每个Java类文件都有一个常量池,该池存储该类中字节码指令的操作。广义上讲,常量池中的条目要么描述运行时artifacts(例如类和方法),要么描述简单值(例如字符串和整数)。

所有这些条目都称为可加载常量,因为它们可以用作ldc指令的参数(“加载常量”)。它们也可能出现在invokedynamic指令的引导方法的静态参数列表中。执行ldc或invokedynamic指令会导致将可加载常量解析为标准Java类型(如Class,String或int)的“实时”值。

处理类文件的程序需要对字节码指令进行建模,然后对可加载常量进行建模。但是,使用标准Java类型对可加载常量进行建模是不够的。

描述一个字符串(一个CONSTANT_String_info条目)的可加载常量可能是可以接受的,因为生成一个“live” String对象是很简单的,但是对于描述一个类(一个CONSTANT_Class_info条目)的一个可加载常量来说,这是有问题的,因为生成一个“live”类对象依赖于类加载的正确性和一致性。

在实际应用中,类加载具有许多环境依赖性和失败的情况,例如:所需的类不存在或请求者可能无法访问;类加载的结果随上下文而变化;加载类具有副作用;有时根本不可能加载类。

因此,处理可加载常量的程序如果能够操纵类和方法,并且以纯名义上的符号形式操纵诸如方法句柄和动态计算的常量之类的artifacts,则它们将变得更加简单。

JDK12在新包java.lang.invoke.constant中定义了一系列基于值的符号引用(JVMS 5.1)类型,它们能够描述每种可加载常量。符号引用以纯字面的形式描述了可加载常量,与类加载或可访问性上下文分开。某些类可以充当自己的符号引用(例如String);对于可链接常量,JDK12定义了一系列符号引用类型(ClassDesc,MethodTypeDesc,MethodHandleDesc和DynamicConstantDesc),来包含描述这些常量的信息。

2、JEP341: 默认CDS归档

通过在64位平台上的默认类列表的帮助下生成CDS归档来改进JDK构建过程,从而有效地消除了运行java -Xshare:dump。 此功能的目标包括:

  • 改进开箱即用的启动时间
  • 摆脱使用-Xshare:dump

3、JEP230: Microbenchmark测试套件

此功能为JDK源代码添加了一套Microbenchmark测试(大约100个),简化了现有Microbenchmark测试的运行和新基准测试的创建过程。 它基于Java Microbenchmark Harness(JMH)并支持JMH更新。

此功能使开发人员可以轻松运行当前的Microbenchmark测试并为JDK源代码添加新的Microbenchmark测试。 可以基于Java Microbenchmark Harness(JMH)轻松测试JDK性能。 它将支持JMH更新,并在套件中包含一组(约100个)基准测试。

3、新的平台支持

1、JEP340: 移除多余ARM64实现

Java 12将只有一个ARM 64位实现(aarch64)。 目标是删除所有与arm64实现相关的代码,同时保留32位ARM端口和64位aarch64实现。

这将把重点转移到单个64位ARM实现,并消除维护两个实现所需的重复工作。 当前的JDK 11实现中有两个64位ARM实现。

4、JVM 优化

1、JPE 344: G1的可中断 mixed GC

此功能通过将Mixed GC集拆分为强制部分和可选部分,使G1垃圾收集器更有效地中止垃圾收集过程。通过允许垃圾收集过程优先处理强制集,g1可以更多满足满足暂停时间目标。

G1是一个垃圾收集器,设计用于具有大量内存的多处理器机器。由于它提高了性能效率,g1垃圾收集器最终将取代cms垃圾收集器。

G1垃圾收集器的主要目标之一是满足用户设置的暂停时间。G1采用一个分析引擎来选择在收集期间要处理的工作量。此选择过程的结果是一组称为GC集的区域。一旦GC集建立并且GC已经开始,那么G1就无法停止。

如果G1发现GC集选择选择了错误的区域,它会将GC区域的拆分为两部分(强制部分和可选部分)来切换到处理Mix GC的增量模式。如果未达到暂停时间目标,则停止对可选部分的垃圾收集。

2、JEP 346: G1归还不使用的内存

此功能的主要目标是改进G1垃圾收集器,以便在不活动时将Java堆内存归还给操作系统。 为实现此目标,G1将在低应用程序活动期间定期生成或持续循环检查完整的Java堆使用情况。

这将立即归还未使用的部分Java堆内存给操作系统。 用户可以选择执行FULL GC以最大化返回的内存量。

5、新功能的预览和实验

1、JEP 189: Shenandoah:低暂停时间垃圾收集器(实验)

JDK 12 引入的回收算法(实验阶段),该算法通过与正在运行的 Java 线程同时进行疏散工作来减少 GC 暂停时间。Shenandoah 的暂停时间与堆大小无关,无论堆栈是 200 MB 还是 200 GB,都具有相同的一致暂停时间。

Shenandoah适用于高吞吐和大内存场景,不适合高实时性场景。Shenandoah算法设计目标主要是响应性和一致可控的短暂停顿,对于垃圾回收生命周期中安全点停顿(TTSP)和内存增长监控的时间开销并无帮助。

Shenandoah算法为每个Java对象添加了一个间接指针,使得GC线程能够在Java线程运行时压缩堆。标记和压缩是同时执行的,因此我们只需要暂停Java线程在一致可控的时间内扫描线程堆栈以查找和更新对象图的根。

怎么形容Shenandoah和ZGC的关系呢?异同点大概如下:

  • 相同点:性能几乎可认为是相同的
  • 不同点:ZGC是Oracle JDK的。而Shenandoah只存在于OpenJDK中,因此使用时需注意你的JDK版本
  • 打开方式:使用-XX:+UseShenandoahGC命令行参数打开。

2、JEP 325: Switch 表达式 (预览版本)

在 Java 12 中引入了 Switch 表达式作为预览特性

在 Java 12 之前,传统 Switch 语句写法为:

private static String getText(int number) {
    String result = "";
    switch (number) {
        case 1, 2:
            result = "one or two";
            break;
        case 3:
            result = "three";
            break;
        case 4, 5, 6:
            result = "four or five or six";
            break;
        default:
            result = "unknown";
            break;
    };
    return result;
} 

在 Java 12 之后,关于 Switch 表达式的写法改进为如下:

private static String getText(int number) {
    String result = switch (number) {
        case 1, 2 -> "one or two";
        case 3 -> "three";
        case 4, 5, 6 -> "four or five or six";
        default -> "unknown";
    };
    return result;
}

更多内容:

更多内容大家可以关注一下个人博客网,https://blog.xueqimiao.com/,内容更丰富喔。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

北鲲教程|基于 ABAQUS 的 CFRP 加固钢筋混凝土柱承载能力分析

随着我国经济实力快速发展与国家竞争力迅速提高,尤其是“一带一路”倡议与“海洋开发战略”实施,我国基础设施建设正逐步冲破东部地区的狭长地带,不断扩展至更加广阔的海洋与西部地区。混凝土结构作为土木工程中最常用的结构形式,…

女生戴蓝牙耳机什么颜色好看?适合女生的高颜值蓝牙耳机

蓝牙耳机作为当前畅销的数码单品,越来越多的品牌商推出新的蓝牙耳机,导致选购的时候不知道从何下手,蓝牙耳机最主要的是清晰音效,其次就是佩戴舒适度,但是近年来不少的人在外观上做出很大的改变,吸引人们的…

测试执行中工作效率相关指标

→ 执行效率:利用测试用例文档页数除于此次系统测试执行的时间总和(不包含用例文档编写时间)。补充指标方法是用例的个数除于此次系统测试的时间总和。用于获得工作中测试人员每小时执行测试的速度。 公式:∑测试用例文档页数(页) / ∑执行系统测试的有效…

Java多线程创建及典型实例(多线程买票)

Java多线程创建及典型实例(多线程买票)多线程1. Thread2. Runnable3. 线程通信4. Callable5. 线程池多线程卖票实例1. 继承Thread类(存在线程安全问题)2. 实现Runnable接口(存在线程安全问题)3. 对线程安全…

Mybatis源码(三)如何操作数据库

前言 接着environmentElement获取数据源信息后,同级执行代码的mappersElement。里面参杂了mybatis缓存。 Mybatis源码(三)如何操作数据库 MyBatis源码(二)如何执行sql Mybatis源码(一)获取数…

从咖啡馆到世界,共赴下一个十年 |写在 EMQX 开源十周年

十年前,在 2012 年 12 月 17 日,源于个人对 Erlang、MQTT 和开源的热爱,EMQX 诞生于一家咖啡馆并作为开源项目在 GitHub 上发布了初次提交。十年后的今天,EMQX 已成长为 Erlang 生态中最具影响力的物联网开源基础软件项目,作为全球最具扩展性的 MQTT 消息服务器在物联网、工业互…

【Java开发】Spring Cloud 02 :微服务项目介绍及开发环境

了解完 Spring Cloud 的发展背景以及各个组件库后,在敲代码前,本章节会聊一聊优惠券平台项目的整体功能和模块,以及每个功能点的技术选型和背后的依据,最后讲解下搭建项目所需的开发环境~ 目录 1 优惠券平台项目 1.1 项目介绍 …

[Linux安装软件详解系列]05 安装ElasticSearch和IK分词器

目录1、安装ElasticSearch2、安装IK分词器操作系统:Anolis OS 8.6 RHCK 64位、jdk1.8。ElasticSearch:v6.8.6下载文件: ElasticSearch v6.8.6: https://elastic.co/downloads/elasticsearch IK分词器 v6.8.6:https://g…

脚本-简单脚本

脚本执行顺序 默认脚本是无序执行,也就是哪个脚本先执行,哪个脚本后执行是未知的。 也可以手动指定执行顺序, 在如上图所示中,可以点击 加号 按钮,然后添加脚本的顺序,数值越大,执行顺序越靠后…

为什么团队执行力差,管理者应该如何解决?

没有执行力,一切都是空谈。团队执行力差可能是这些原因: 1、目标不明确,项目方向不清晰。 2、责任不清,不知道干啥,也不知道为什么而干。 3、技能不熟练,没有明确的完成标准。 4、分配任务,…

【JavaScript】飞机大战

文章目录一、效果演示设计思路二、鼠标版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码js.js文件plane.js文件三、键盘版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码四、代码资源分享一、效果演示 利用html,css,js制…

华为云服务器上部署war包(虚拟机也同样适用)

目录linux部署war包安装jdk关闭防火墙简单粗暴(推荐虚拟机使用)复杂但安全(推荐服务器使用)安装tomcat部署war包linux部署war包 安装jdk 执行命令查看可安装java版本 yum -y list java*执行命令安装jdk8 yum install -y java-…

12. 爬虫训练场项目,jinja2 模板继承,项目继续迭代

本篇博客我们将前端模板的通用部分进行抽离,便于整理管理,使用的是 jinja2 中模板继承相关技术。 文章目录Flask 模板引擎块(Block)更细的块拆解完善 general 目录和 school 目录 HTML 文件宏(Macro)Flask …

章节六:RASA NLU组件介绍--特征生成器

目录一、前言二、特征生成器MitieFeaturizerSpacyFeaturizerConveRTFeaturizerLanguageModelFeaturizerRegexFeaturizerCountVectorsFeaturizerLexicalSyntacticFeaturizer一、前言 RASA在处理对话时,整体流程是pipeline结构,自然语言理解(N…

SpringBoot操作Redis

目录 1.IDE创建一个maven项目 2、 添加redis启动器 3.修改配置文件application.properties 4.在测试类中测试 SpringBoot操作Hash(哈希) SpringBoot操作List集合类型 SpringBoot操作Set集合类型 SpringBoot操作ZSet集合类型 1.IDE创建一个maven项…

dubbo(尚硅谷)学习笔记2

我们现在来做dubbo和springboot整合: 我们先来创建一个springboot项目: 然后把serviceimpl层拷贝过来。 因为我们这个也需要用到公用接口和实体类,所以还是需要导入一下这个依赖: 同样的我们也需要创建一个服务的消费者&#xf…

设计模式之美总结(行为型篇)

title: 设计模式之美总结(行为型篇) date: 2022-12-26 17:25:29 tags: 设计模式 categories:设计模式 cover: https://cover.png feature: false 文章目录1. 观察者/发布订阅模式(Observer Design Pattern/Publish-Subscribe Design Pattern…

Unity2D像素游戏开发——Aseprite简单人物绘画+动画制作导出精灵表示例

目录 前言 什么是帧? 什么是Aseprite? 运行环境 正文 示例:绘制人物 制作多帧动画 微调 导出精灵表 总结 作品欣赏 附一个下载链接: 前言 什么是帧? 我们看到的动画都是由一张张图片连续播放而成的&#…

scipy

scipy.interpolate插值方法 import numpy as np def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2grid_x, grid_y np.mgrid[0:1:100j, 0:1:200j]rng np.random.default_rng() points rng.random((1000, 2)) values func(points[:,0], points[:…

高颜值蓝牙耳机有哪些?音质好颜值高的蓝牙耳机推荐

喜欢安静的人们,相信都会有一副蓝牙耳机吧,作为我们生活当中必不可少的数码产品,除了手机以外,蓝牙耳机几乎也是使用率很高的,它通过蓝牙连接,非常方便,下面是小编精心挑选的四款蓝牙耳机。 一…