我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JDK12的新特性详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JDK12的新特性详解

本篇内容介绍了“JDK12的新特性详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、JDK12之Shenandoah低暂停时间垃圾收集器(实验性)

      定义:

    添加一个名为Shenandoah的新垃圾收集(GC)算法,通过与正在运行的Java线程同时进行疏散工作来减少GC暂停时间。使用Shenandoah的暂停时间与堆大小无关,这意味着无论堆是200MB还是200GB,都将具有相同的一致暂停时间。

      非目标:

    这不是一个统治所有人的GC。还有其他垃圾收集算法可以优先考虑吞吐量或内存占用而不是响应性。Shenandoah是适用于评估响应性和可预测的短暂停顿的应用程序的算法。目标不是解决所有JVM暂停问题。由于GC之外的其他原因(例如安全时间点(TTSP)发布或监控通胀)而暂停时间超出了此JEP的范围。

      构建和调用:

    作为实验性功能,Shenandoah将-XX:+UnlockExperimentalVMOptions在命令行中要求。Shenandoah构建系统会自动禁用不受支持的配置。下游建设者可以选择--with-jvm-features=-shenandoahgc在其他支持的平台上禁用构建Shenandoah。要启用/使用Shenandoah GC,需要以下JVM选项:-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
2、JDK12之Microbenchmark Suite

      定义:

    在JDK源代码中添加一套基本的微基准测试,使开发人员可以轻松运行现有的微基准测试并创建新的基准测试。

      目标:

1、基于[Java Microbenchmark线束(JMH)] [1]2、稳定且经过调整的基准测试,针对持续性能测试    2.1、在功能发布的功能完成里程碑之后,以及非功能版本之后的稳定且不移动的套件    2.2、支持与先前JDK版本的适用测试比较3、简单    3.1 轻松添加新基准    3.2 在API和选项更改,不推荐使用或在开发期间删除时,可以轻松更新测试    3.3 易于构建    3.4 易于查找和运行基准    3.5 支持JMH更新    3.6 在套件中包含大约一百个基准的初始集
3、JDK12之Switch表达式(预览版)

      预览功能,如果该jdk12的switch效果不好的话,会被下一版本jdk13直接移除该功能,并不是之后每个版本必须的。

      许多break使它不必要地冗长,如果忘记写break,则会产生意料之外的结果或者异常,所以针对于此jdk12在这里进行了优化升级。

      JDK12之前的版本:   

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;}

      JDK12:我们建议引入一种新形式的开关标签,写成“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);}

      许多Switch表达式,每个case都会赋值给一个变量或者执行某种操作,如下是赋值给numLetters变量具体值。

      JDK12之前:

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);}

      JDK12:将此表达为一种陈述是迂回的,重复的,并且容易出错。意味着我们应该计算numLetters每一天的价值。应该可以直接说,使用更清晰,更安全Switch表达式

int numLetters = switch (day) {    case MONDAY, FRIDAY, SUNDAY -> 6;    case TUESDAY                -> 7;    case THURSDAY, SATURDAY     -> 8;    case WEDNESDAY              -> 9;};

      如果将它用在方法上,则可以为:

static void howMany(int k) {    switch (k) {        case 1 -> System.out.println("one");        case 2 -> System.out.println("two");        case 3 -> System.out.println("many");    }}

      或者类上,我想到的这个switch这个功能可以用在抽象工厂类方面。

T result = switch (arg) {    case L1 -> e1;    case L2 -> e2;    default -> e3;};
4、JDK12之JVM常量API

      摘要:

引入API来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量。

      动机:

    每个Java类文件都有一个常量池,用于存储类中字节码指令的操作数。从广义上讲,常量池中的条目描述了运行时工件(如类和方法)或简单值(如字符串和整数)。所有这些条目都称为可加载常量,因为它们可以作为ldc指令的操作数(“加载常量”)。它们也可能出现在invokedynamic指令的bootstrap方法的静态参数列表中。执行一个ldc或invokedynamic指令导致加载常数被解析成一个标准的Java类,如“活”的值Class,String或int。    操作class文件的程序需要对字节码指令进行建模,并依次对可加载的常量进行建模。但是,使用标准Java类型来模拟可加载常量是不合适的。    描述字符串(CONSTANT_String_info条目)的可加载常量可能是可以接受的,因为生成“实时” String对象很简单,但是对于描述类(CONSTANT_Class_info条目)的可加载常量是有问题的,因为产生“实时”ClassObject依赖于类加载的正确性和一致性。    不幸的是,类加载有许多环境依赖和失败模式:所需的类不存在或者请求者可能无法访问; 类加载的结果因上下文而异; 装载类有副作用;有时类加载可能根本不可能(例如当所描述的类尚不存在或者无法加载时,如在编译那些相同类或在jlink转换期间)。    因此,处理可加载常量的程序如果能够以纯粹的名义符号形式操作类和方法,以及不太知名的工件(如方法句柄和动态计算常量),则会更简单:    1、字节码解析和生成库必须以符号形式描述类和方法句柄。如果没有标准机制,它们必须采用ad-hoc机制,无论是ASM的描述符类型Handle,还是字符串元组(方法所有者,方法名称,方法描述符),或者这些机制的特殊(并且容易出错)编码单个字符串。    2、如果它们可以在符号域中工作而不是使用“实时”类和方法句柄,invokedynamic那么通过旋转字节码(例如LambdaMetafactory)来操作的Bootstraps 将更简单。    3、编译器和脱机转换器(例如jlink插件)需要描述无法加载到正在运行的VM的类的类和成员。编译器插件(例如注释处理器)同样需要用符号术语来描述程序元素。
5、JDK12之一个AArch74端口,而不是两个

      摘要:

arm64在保留32位ARM端口和64位aarch74端口的同时,删除与端口相关的所有源。

      动机:

删除此端口将允许所有贡献者将他们的精力集中在单个64位ARM实现上,并消除维护两个端口所需的重复工作。
6、JDK12之默认CDS档案

      摘要:

在64位平台上使用默认类列表增强JDK构建过程以生成类数据共享(CDS)归档。

      目标:

1、改善开箱即用的启动时间2、消除用户运行-Xshare:dump以从CDS中受益的需要
7、JDK12之G1的可流动混合收集

      摘要:

如果G1混合集合可能超过暂停目标,则使其可以中止。

      动机:

    G1的目标之一是满足用户提供的暂停时间目标以暂停其收集暂停。G1使用高级分析引擎来选择在集合期间要完成的工作量(这部分基于应用程序行为)。此选择的结果是一组称为集合集的区域。一旦确定了集合集并且已经开始集合,则G1必须在不停止的情况下收集集合集的所有区域中的所有活动对象。如果启发式选择过大的收集,则此行为可导致G1超过暂停时间目标,例如,如果应用程序的行为发生变化,以致启发式工作在“陈旧”数据上,则可能发生这种情况。特别是在混合集合期间可以观察到这种情况,其中集合集通常可以包含太多旧区域。需要一种机制来检测启发式方法何时反复为集合选择错误的工作量,如果是,则让G1逐步递增地执行收集工作,其中集合可以在每个步骤之后中止。这种机制将允许G1更频繁地满足暂停时间目标。
8、JDK12之从G1中立即返回未使用的已提交内存

      摘要:

增强G1垃圾收集器,以便在空闲时自动将Java堆内存返回给操作系统。

      成功指标:

如果应用程序活动非常低,G1应该在合理的时间段内释放未使用的Java堆内存。

      动机:

    目前G1垃圾收集器可能无法及时将已提交的Java堆内存返回给操作系统。G1仅在完整GC或并发周期内从Java堆返回内存。由于G1很难完全避免完整的GC,并且只触发基于Java堆占用和分配活动的并发周期,因此在许多情况下它不会返回Java堆内存,除非在外部强制执行此操作。    在使用资源支付的容器环境中,这种行为特别不利。即使在VM由于不活动而仅使用其分配的内存资源的一小部分的阶段,G1也将保留所有Java堆。这导致客户始终为所有资源付费,云提供商无法充分利用其硬件。    如果VM能够检测到Java堆的利用率不足(“空闲”阶段),并在此期间自动减少其堆使用量,则两者都将受益。    Shenandoah和OpenJ9的GenCon收集器已经提供了类似的功能。
9、核心库java.lang中支持Unicode11

    JDK 12版本包括对Unicode 11.0.0的支持。在发布支持Unicode 10.0.0的JDK 11之后,Unicode 11.0.0引入了以下JDK 12中包含的新功能:

1、684个新角色    1.1、66个表情符号字符    1.2、Copyleft符号    1.3、评级系统的半星    1.4、额外的占星符号    1.5、象棋中国象棋符号2、11个新区块    2.1、格鲁吉亚扩展    2.2、玛雅数字    2.3、印度Siyaq数字    2.4、国际象棋符号3、7个新脚本    3.1、Hanifi Rohingya    3.2、Old Sogdian    3.3、Sogdian    3.4、Dogra    3.5、Gunjala Gondi    3.6、Makasar    3.7、Medefaidrin
10、核心库java.text支持压缩数字格式
    NumberFormat添加了对以紧凑形式格式化数字的支持。紧凑数字格式是指以简短或人类可读形式表示的数字。例如,在en_US语言环境中,1000可以格式化为“1K”,1000000可以格式化为“1M”,具体取决于指定的样式NumberFormat.Style。紧凑数字格式由LDML的Compact Number格式规范定义。要获取实例,请使用NumberFormat紧凑数字格式所给出的工厂方法之一。    例如:NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);String result = fmt.format(1000);     上面的例子导致“1K”。
12、安全库java.security

      禁止并允许java.security.manager系统属性的选项 

    新的“disallow”和“allow”令牌选项已添加到java.security.manager系统属性中。在JDK实现中,如果Java虚拟机以系统属性java.security.manager设置为“disallow”开始,则该System.setSecurityManager方法不能用于设置安全管理器并将抛出UnsupportedOperationException。“disallow”选项可以提高从未设置安全管理器的应用程序的运行时性能。

      groupname选项添加到keytool密钥对生成 

-groupname添加了一个新选项,keytool -genkeypair以便用户在生成密钥对时可以指定命名组。例如,keytool -genkeypair -keyalg EC -groupname secp384r1将使用secp384r1曲线生成EC密钥对。由于可能存在多个具有相同大小的曲线,因此使用该-groupname选项优先于该-keysize选项。

      新Java飞行记录器(JFR)安全事件

略过...

      自定义PKCS12密钥库生成 

    添加了新的系统和安全属性,使用户能够自定义PKCS#12密钥库的生成。这包括用于密钥保护,证书保护和MacData的算法和参数。可以在文件的“PKCS12 KeyStore属性”部分中找到这些属性的详细说明和可能的值java.security。
13、安全库javax.net.ssl

      ChaCha20和Poly1305 TLS密码

    JSSE中添加了使用ChaCha20-Poly1305算法的新TLS密码套件。默认情况下启用这些密码套件。TLS_CHACHA20_POLY1305_SHA256密码套件适用于TLS 1.3。
14、安全库/ org.ietf.jgss

      在krb5.conf中支持dns_canonicalize_hostname

    该dns_canonicalize_hostname标志中krb5.conf的配置文件现在是由JDK Kerberos实现支持。设置为“true”时,服务主体名称中的短主机名将被规范化为完全限定的域名(如果可用)。否则,不执行规范化。默认值是true”。这也是JDK 12之前的行为。
15、删除项

      核心库/ java.util.jar中,删除java.util.ZipFile / Inflator / Deflator中的finalize方法 

    该finalize方法在java.util.ZipFile,java.util.Inflator和java.util.Deflator是在JDK9弃用用于移除及其执行了更新,是一个空操作。该finalize在方法java.util.ZipFile,java.util.Inflator以及java.util.Deflator在此版本中被删除。finalize应修改为执行清理而重写的子类,以使用备用清理机制并删除写finalize方法。    finalize方法,去除将暴露Object.finalize到的子类ZipFile,Deflater和Inflater。finalize由于声明的异常发生更改,可能会在覆盖时发生编译错误。Object.finalize现在宣布投掷java.lang.Throwable。以前,只有java.io.IOException宣布。

      核心库/ java.io,从FileInputStream和FileOutputStream中删除finalize方法 

    该finalize方法FileInputStream和FileOutputStream被弃用去除JDK 9.他们已经在此版本中被删除。所述java.lang.ref.Cleaner,自JDK9的主要机制已被实施,以关闭文件描述符不再从可到达的FileInputStream和FileOutputStream。关闭文件的推荐方法是显式调用close或使用try-with-resources。

      工具/ javac的删除javac支持6 / 1.6源,目标和发布值 

javac的6/1.6的参数值的支持-source,-target以及--release标志已被删除。

“JDK12的新特性详解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JDK12的新特性详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JDK12的新特性详解

本篇内容介绍了“JDK12的新特性详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、JDK12之Shenandoah低暂停时间垃圾收集器
2023-06-02

关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明

JDK 9特性说明:1. 模块化系统(Jigsaw):引入了一种新的模块化系统,允许将Java SE平台和应用程序分割成一组互相依赖的模块。2. JShell:引入了一个交互式的Java编程工具,可以在命令行中立即编写和执行Java代码片段
2023-08-08

JDK8的新特性详解

本篇内容介绍了“JDK8的新特性详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、Lambda演变过程@Data@ToString@No
2023-06-02

JDK 新特性篇:JDK 10 新特性详解

JDK 10 是 Java 开发工具包的一个版本,其中包含了一些新的特性和改进。下面是 JDK 10 的一些新特性的详细解释:1. 局部变量类型推断:JDK 10 引入了局部变量类型推断的功能,使得在声明变量时可以使用 var 关键字代替具
2023-09-14

JDK 新特性篇:JDK 9 新特性详解

JDK 9 是 Java 平台的一次重大更新,引入了许多新的特性和改进。以下是 JDK 9 的一些主要新特性的详细解释。模块化系统(Module System):JDK 9 引入了一个全新的模块化系统,它允许将代码和资源以模块的形式组织和封
2023-09-13

Java8新特性详解

陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油。 本文是介绍Java8新特性与常用方法(此篇只做大体介绍了解,之后会把重
2023-08-17

JDK10新特性详解

1、局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为null,因为不能判断具体类型,会报异常。@Testpublic void test1(){ var number = 10
2023-06-02

JDK11新特性详解

1、增强局部变量类型推断varConsumer consumer = t -> System.out.println(t.toUpperCase());Consumer consumer = (var t)
2023-06-02

JDK9新特性详解

1、Java9新特性之目录结构 包含jdk8及以前的jdk版本,所有目录结构以及目录含义如图: jdk9之后,目录结构发生变化如图: 这个新特性只要了解下就可以了,这个目录结构是方便为了接下来新特性做
2023-06-02

Tapestry5新特性详解

Tapestry5是一个轻量级的、开源的Java Web框架,它提供了一种简化Web开发的方式。下面是Tapestry5的一些新特性的详解:1. 组件化:Tapestry5采用组件化的开发模式,将页面划分为多个可复用的组件,每个组件都有自己
2023-09-22

Android 7.0新特性详解

谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息。目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan API来在中低硬件配置设备上实现流 畅.游戏体验以及更多的Emoji表情。不过,A
2022-06-06

Hadoop3.x新特性详解

Hadoop 3.x版本带来了许多新的特性和改进,使其更加强大和高效。以下是Hadoop 3.x的一些主要新特性:HDFS Erasure Coding:Hadoop 3.x引入了HDFS Erasure Coding,这是一种新的数据保护
Hadoop3.x新特性详解
2024-02-29

详解Java中switch的新特性

这篇文章主要介绍了Java中switch的新特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-20

Java8新特性Stream流详解

陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油。 本文是介绍Java8新特性Stream流常用方法超详细教学
2023-08-17

Android5.0新特性详解之全新的动画

在Material Design设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性。Material主题为控件和Activity的过渡提供了一些默认的动画,在android L上,允许自定义这些动画: Touch feed
2022-06-06

Java8新特性StreamAPI实例详解

这篇文章主要为大家介绍了Java8新特性StreamAPI实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录