目录
- 👍Java 微信社区添加方式👍
- 👍1.JDK 15的新增功能-新功能和增强功能
- 👍1.1 Char 在CharSequence中添加了isEmpty默认方法
- 👍1.2 支持Unicode 13.0
- 👍1.3 JEP 371 隐藏类
- 👍1.4 添加了对SO_INCOMING_NAPI_ID支持的支持
- 👍1.5 TreeMap方法的专用实现
- 👍1.6 增加了为远程JMX配置第三个端口的能力
- 👍1.7 jstatd中添加了用于指定RMI连接器端口号的新选项
- 👍1.8 jcmd中添加了用于编写gzip压缩堆转储的新选项
- 👍1.9 JEP 378 Text Blocks
- 👍1.10 为调试模式向jhsdb添加了新选项
- 👍1.11 适用于Windows的Oracle JDK Installer在任何命令提示符均可到达的路径中提供可执行文件(javac等)
- 👍1.12 向jarsigner添加了吊销检查
- 👍1.13 警告限制以前使用弱算法
- 👍1.14 SunJCE Provider支持基于SHA-3的Hmac算法
- 👍1.15 用于配置TLS签名方案的新系统属性
- 👍1.16 支持certificate_authorities扩展
- 👍 👍2. 删除的功能和选项
- 👍 👍 👍3. Hotspot改进
👍Java 微信社区添加方式👍
👍 小编微信:372787553 备注csdn
👍1.JDK 15的新增功能-新功能和增强功能
👍1.1 Char 在CharSequence中添加了isEmpty默认方法
/**
* Returns {@code true} if this character sequence is empty.
* @implSpec
* The default implementation returns the result of calling {@code length() == 0}.
* @return {@code true} if {@link #length()} is {@code 0}, otherwise
* {@code false}
*
* @since 15
*/
default boolean isEmpty() {
return this.length() == 0;
}
此版本中对java.lang.CharSequence进行了更新,以定义一个默认的isEmpty方法,该方法测试字符序列是否为空。测试和过滤空字符串和其他CharSequences是代码中的常见现象,并且CharSequence :: isEmpty可以用作方法引用。实现java.lang.CharSequence的类和定义isEmpty方法的另一个接口的类应注意此添加,因为可能需要修改它们以覆盖isEmpty方法。
👍1.2 支持Unicode 13.0
此版本将Unicode支持升级到13.0,其中包括:
- java.lang.Character类支持13.0级的Unicode字符数据库,其中13.0增加了5,930个字符,总共143,859个字符。这些新增功能包括4个新脚本,总共154个脚本,以及55个新表情符号字符。
- java.text.Bidi和java.text.Normalizer类分别支持13.0级Unicode标准附件#9和#15。
- java.util.regex程序包支持基于Unicode标准附件#29的13.0级的扩展字素集群。
👍1.3 JEP 371 隐藏类
JEP 371在Java 15中引入了隐藏类。隐藏类对现有代码具有以下含义:
传统上,Class :: getName返回一个二进制名称,但是对于一个隐藏的类,它返回一个包含ASCII正斜杠(/)的字符串,因此不是二进制名称。假定返回的字符串是二进制名称的程序可能需要更新以处理隐藏的类。也就是说,Unsafe :: defineAnonymousClass的长期实践是定义名称不是二进制名称的类,因此某些程序可能已经成功处理了此类名称。
Class :: descriptorString和MethodType :: descriptorString返回包含隐藏类的ASCII点(.)的字符串,因此它不是符合JVMS 4.3的类型描述符。假定返回的字符串是符合JVMS 4.3的类型描述符的程序可能需要更新以处理隐藏的类。
Class :: getNestMembers更改为在无法验证NestMembers属性中列出的任何成员的嵌套成员身份时不引发异常。而是,Class :: getNestMembers返回嵌套主机和主机的NestMembers属性中列出的成员,这些成员已成功解析并确定为与此类具有相同的嵌套主机。 (这意味着它返回的嵌套成员数可能少于NestMembers属性中列出的成员。)当嵌套成员资格错误时,预期存在LinkageError的现有代码可能会受到影响。
当嵌套成员资格无效时,JVM中的嵌套伙伴测试已更改为仅引发IllegalAccessError。有一定的历史了解是必要的:
在Java 8中,每个访问控制失败都通过IllegalAccessError(IAE)发出信号。而且,如果一次给定的访问检查因IAE一次失败,则同一检查每次均因IAE而失败。
在Java 11中,嵌套伙伴(JEP 181)的引入意味着可以通过IllegalAccessError或(如果嵌套成员资格无效)LinkageError来指示访问控制失败。但是,如果给定的访问检查因特定的异常而失败,则相同的检查将始终因相同的异常而失败。
在Java 15中,引入Lookup :: defineHiddenClass意味着当将隐藏类定义为lookup类的嵌套对象时,必须急切地确定lookup类的嵌套宿主。 Lookup :: defineHiddenClass和Class :: getNestHost都以比Java 11中的JVM更灵活的方式确定类的嵌套主机。也就是说,如果声称的嵌套成员资格无效,则该API仅将类视为自托管类。为了与API保持一致,当类的嵌套成员资格无效时,JVM不再引发LinkageError,而是将类视为自托管类。这意味着JVM仅从访问控制中抛出IAE(因为自托管类将不允许任何其他类访问其私有成员)。这是绝大多数用户代码所期望的行为。
JVM TI GetClassSignature返回一个字符串,该字符串包含用于隐藏类的ASCII点(.)。如果JVM TI代理假定GetClassSignature返回的字符串是符合JVMS 4.3的类型描述符,则它们可能需要更新隐藏类。
👍1.4 添加了对SO_INCOMING_NAPI_ID支持的支持
在此发行版中,新的特定于JDK的套接字选项SO_INCOMING_NAPI_ID已添加到jdk.net.ExtendedSocketOptions。套接字选项特定于Linux,它允许应用程序查询与其套接字连接相关联的基础设备队列的NAPI(新API)ID,并利用高性能网络接口卡(NIC)设备的应用程序队列(ADQ)功能。
👍1.5 TreeMap方法的专用实现
TreeMap类现在提供putIfAbsent,computeIfAbsent,computeIfPresent,compute和merge方法的重写实现。新的实现提供了性能改进。但是,如果提供给计算或合并方法的函数修改了映射,则可能会抛出ConcurrentModificationException,因为禁止提供给这些方法的函数修改映射。如果发生ConcurrentModificationException,则必须更改函数以避免修改地图,或者应该重写周围的代码,以将计算和合并方法的使用替换为常规Map方法(如get和put)。
👍1.6 增加了为远程JMX配置第三个端口的能力
通过设置以下属性,JMX通过配置两个网络端口(从命令行或在属性文件中)支持(显式)远程网络访问:
java com.sun.management.jmxremote.port=<port#> com.sun.management.jmxremote.rmi.port=<port#>
注意:如果未指定,则第二个端口将默认为第一个。
还打开了第三个本地端口以接受(本地)JMX连接。该端口以前曾随机选择其编号,这可能会导致端口冲突。
但是,现在可以使用以下命令配置第三个JMX端口(仅本地):
java com.sun.management.jmxremote.local.port=<port#>
👍1.7 jstatd中添加了用于指定RMI连接器端口号的新选项
新的-r <端口>选项已添加到jstatd命令中,以指定RMI连接器端口号。如果未指定端口号,则使用随机可用端口。
👍1.8 jcmd中添加了用于编写gzip压缩堆转储的新选项
新的整数选项gz已添加到GC.heap_dump诊断命令。如果指定,它将启用写入堆转储的gzip压缩。提供的值是压缩级别。它的范围可以从1(最快)到9(最慢,但最佳压缩)。推荐级别为1
👍1.9 JEP 378 Text Blocks
Text Blocks已添加到Java语言中。Text Blocks是多行字符串文字,它避免了大多数转义序列的需要,以一种可预测的方式自动设置字符串的格式,并在需要时使开发人员可以控制格式
👍1.10 为调试模式向jhsdb添加了新选项
在调试模式下,已向jhsdb命令添加了三个新选项:
- –rmiport <端口>用于指定RMI连接器端口号。如果未指定端口号,则使用随机可用端口。
- –registryport <端口>用于指定RMI注册表端口号。该选项将覆盖系统属性sun.jvm.hotspot.rmi.port。如果未指定端口号,则使用系统属性。如果未设置系统属性,则使用默认端口1099。
- –hostname <主机名>用于指定RMI连接器主机名。该值可以是主机名或IPv4 / IPv6地址。此选项将覆盖系统属性java.rmi.server.hostname。如果未指定主机名,则使用系统属性。如果未设置系统属性,则使用系统主机名。
👍1.11 适用于Windows的Oracle JDK Installer在任何命令提示符均可到达的路径中提供可执行文件(javac等)
用于Windows的Oracle JDK安装程序在系统位置提供java.exe,javaw.exe,javac.exe和jshell.exe命令,以便用户无需提供Oracle JDK安装文件夹的路径即可运行Java应用程序
👍1.12 向jarsigner添加了吊销检查
已将新的-revCheck选项添加到jarsigner命令中,以启用证书的吊销检查。
👍1.13 警告限制以前使用弱算法
该keytool和jarsigner工具已经更新,以警告弱密码算法的用户,他们被禁止之前被使用。在此版本中,这些工具针对SHA-1哈希算法和1024位RSA / DSA密钥发出警告
👍1.14 SunJCE Provider支持基于SHA-3的Hmac算法
SunJCE提供程序已得到增强,可以支持HmacSHA3-224,HmacSHA3-256,HmacSHA3-384和HmacSHA3-512。这些算法的实现在Mac和KeyGenerator服务下可用。 Mac服务生成密钥哈希,而KeyGenerator服务生成Mac密钥
👍1.15 用于配置TLS签名方案的新系统属性
添加了两个新的系统属性,以自定义JDK中的TLS签名方案。为TLS客户端添加了jdk.tls.client.SignatureSchemes,并为服务器端添加了jdk.tls.server.SignatureSchemes。
每个系统属性均包含一个逗号分隔的受支持签名方案名称列表,这些列表指定了可用于TLS连接的签名方案。
👍1.16 支持certificate_authorities扩展
“ certificate_authorities”扩展是TLS 1.3中引入的可选扩展。它用于指示端点支持的证书颁发机构(CA),接收端点应使用它来指导证书选择。
使用此JDK版本,客户端和服务器端的TLS 1.3都支持“ certificate_authorities”扩展。此扩展名始终用于客户端证书选择,而对于服务器证书选择则是可选的。
应用程序可以通过将jdk.tls.client.enableCAExtension系统属性设置为true来启用此扩展以选择服务器证书。该属性的默认值为false。
请注意,如果客户端信任的CA多于扩展名的大小限制(小于2 ^ 16字节),则不会启用扩展名。同样,某些服务器实现不允许握手消息超过2 ^ 14字节。因此,如果将jdk.tls.client.enableCAExtension设置为true,并且客户端信任的CA数量超过服务器实现限制,则可能存在互操作性问题。
👍 👍2. 删除的功能和选项
本节描述了Java SE 15和JDK 15中删除的API,功能和选项。此处介绍的API是Oracle JDK随附的API。它包括Java SE 15平台的完整实现以及其他Java API,以支持开发,调试和监视Java应用程序。有关Java SE 15和JDK 15中重要增强功能和新功能的另一个信息来源是Java SE 15(JSR 390)平台规范,该文档记录了对Java SE 14和Java SE 15之间的规范所做的更改。此处未描述的已删除API和功能。下面的描述还可能标识在迁移到JDK 15时可能遇到的潜在兼容性问题
👍2.1 删除终端弃用的特定于Solaris的SO_FLOW_SLA套接字选项
在此发行版中,与在JEP381(JDK-8241787)中删除Solaris端口一起,特定于JDK的套接字选项jdk.net.ExtendedSocketOptions.SO_FLOW_SLA(仅与Solaris上的套接字相关)及其支持类SocketFlow和SocketFlow.Status,已被删除。
👍2.2 删除RMI静态存根编译器(Rmic)
RMI静态存根编译器rmic已被删除。 Rmic工具已过时,自JDK 13起已弃用该工具。
👍2.3 删除不推荐使用的常量RMIConnectorServer.CREDENTIAL_TYPES
终端弃用的常量javax.management.remote.rmi.RMIConnectorServer.CREDENTIAL_TYPE已删除。可以使用RMIConnectorServer.CREDENTIALS_FILTER_PATTERN来指定过滤器模式
👍2.4 -XXUseAdaptiveGCBoundary
VM选项UseAdaptiveGCBoundary已过时。使用此选项将生成一个过时的选项警告,否则将被忽略
这个选项以前是默认禁用的,只有在同时使用-XX:+UseParallelGC时启用它才有效果。启用它的目的是为某些应用程序提供性能优势。但是,由于崩溃和性能下降,它已经被默认禁用了很长时间。
👍2.5 已弃用SSLSession.getPeerCertificateChain()方法实现
已弃用的SSLSession.getPeerCertificateChain()方法已从SunJSSE提供程序和HTTP客户端实现中的JDK中删除。此方法的默认实现已更改为引发UnsupportedOperationException。
SSLSession.getPeerCertificateChain()是不推荐使用的方法,将在将来的版本中删除。为了减轻删除兼容性的影响,应用程序应该使用SSLSession.getPeerCertificates()方法。对于服务提供商,请从现有实现中删除此方法,并且不要在任何新实现中支持此方法。
👍2.5 删除com.sun.net.ssl.internal.ssl.Provider名称
遗留的SunJSSE提供程序名称“com.sun.net.ssl.internal.ssl.Provider”已经被删除,不应该再使用。应该使用“SunJSSE”名称。例如,SSLContext。getInstance(“TLS”、“SunJSSE”)。
其实这里还是有很多的,就不一一列举了
👍 👍 👍3. Hotspot改进
这里值得一说的就是对GC算法的优化,并且已经上线了ZGC;
关于更多JVM的知识请阅读:https://github.com/yanghaiji/Advanced-books
👍3.1 改进了G1堆区域大小以提高效率
默认的堆区域大小计算已更改为默认情况下返回较大的区域。计算的目标仍然是2048个区域,但是有两个方面发生了变化:
-
只考虑最大堆大小。旧的计算还考虑了初始堆大小,但是当没有设置堆大小时,这可能会导致意外行为。
-
区域大小四舍五入到最接近2的幂次,而不是向下。在最大堆大小不是2的幂次时,这会返回更大的区域大小。
这些更改提高了启动和运行时性能。
👍3.2 ZGC一个可伸缩的低延迟垃圾收集器以上线
ZGC最早在JDK11已经出现,但那时还是一个实验性的阶段,现在可以在生产中使用了,不再被标记为一个实验特性。ZGC通过使用-XX:+UseZGC命令行选项启用(不再需要使用-XX:+UnlockExperimentalVMOptions)。当然JEP不建议更改默认GC,该默认GC仍为G1。
👍3.3 默认情况下,在“异常消息”中启用“显示代码详细信息
在异常消息中显示代码详细信息标志的默认值已更改为“ true”。 现在,默认情况下会打印JEP 358的有用的NullPointerException消息。 消息包含引发NullPointerException的代码片段。
应用程序部署人员应仔细检查其Web应用程序的输出和类似的使用场景。 NullPointerException消息可以包含在应用程序错误消息中,也可以通过其他方式在应用程序中显示。 这可以为远程攻击者提供有关正在使用的软件组件的潜在易受攻击状态的有价值的提示。
例如,赋值语句中的NPE a.i = 99;将生成此消息:
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
如果更复杂的陈述a.b.c.i = 99;抛出一个NPE,该消息将剖析该语句并通过显示导致空值的完整访问路径来查明原因:
Exception in thread "main" java.lang.NullPointerException:
Cannot read field "c" because "a.b" is null
at Prog.main(Prog.java:5)
给出完整的访问路径比仅给出null字段的名称更有用,因为它可以帮助开发人员浏览一行复杂的源代码,尤其是当该行代码多次使用相同的名称时。
同样,如果数组访问和赋值语句a [i] [j] [k] = 99;引发NPE:
Exception in thread "main" java.lang.NullPointerException:
Cannot load from object array because "a[i][j]" is null
at Prog.main(Prog.java:5)
同样如果a.i = b.j;引发NPE:
Exception in thread "main" java.lang.NullPointerException:
Cannot read field "j" because "b" is null
at Prog.main(Prog.java:5)
- 👍 SpringCloud 自定义封装架构https://github.com/yanghaiji/javayh-platform
- 👍 Java 设计模式学习代码 https://github.com/yanghaiji/design-pattern
- 👍 SpringCloud学习代码: https://github.com/yanghaiji/javayh-cloud
- 👍 AlibabaCloud学习代码:https://github.com/yanghaiji/javayh-cloud-nacos
- 👍 SpringBoot+Mybatis 多数据源切换:https://github.com/yanghaiji/javayh-boot-data-soure
- 👍 Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/yanghaiji/javayh-middleware
- 👍 SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/yanghaiji/javayh-distribution