专栏首页Java架构沉思录老表:Java8尽管很香,你想过升级到Java11吗?会踩那些坑?

老表:Java8尽管很香,你想过升级到Java11吗?会踩那些坑?

点击上方“码农沉思录”,选择“设为星标”

优质文章,及时送达

目前最新JDK 11,Oracle会一直维护到2026年。

Java11的新特性

1、更新支持到Unicode 10编码

Unicode 10(version 10.0 of the Unicode Standard),Unicode是一个不断在演进的行业标准,Java一直在与它保持一致兼容。

Java8已经更新了Unicode8.0-9.0,Java10更新后将达到16018个characters、18种blocks和10种scripts。

2、将Http Client作为JDK标准发布、

原来作为jdk补充的http类放在jdk.incubator.http包中,现在统一改到java.net.http包下,核心类有下面4个。

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket
HttpClient client = HttpClient.newBuilder()
        .version(HttpClient.Version.HTTP_1_1)
        .connectTimeout(Duration.ofSeconds(3))
        .build();

HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://www.baidu.com")).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200
System.out.println(response.body()); // 百度页面的html

3、新增优化很多方法

  • java.util.Collection增加新方法toArray(IntFunction),集合转数组的不二之选。
  • String增加lines\stripLeading\stripTrailing等,一般项目都有StringUtils类。
  • java.io.InputStream增加构造方法
  • java.nio包下面很大类扩展了方法Channels\XXXBuffer等

4、支持动态分配 Compiler Threads

JVM启动参数新增-XX:+UseDynamicNumberOfCompilerThreads,动态的控制编程线程的数量,原来的编译线程默认会启动大量造成cpu和memory浪费。

5、GC能力大幅提升

低功耗可扩展GC(ZGC)模块是一个试验性的并发GC,在线程执行是ZGC会做一些重型回收工作,如string表清理等。执行周期在10ms内,处理heaps大小从MB到TB范围,目前只能支持linux和x64系统,除此外还有个处理memory分配的Epsilon GZ,有兴趣的可以自己研究。

6、堆分析能力提升:JVMTI

提供了一个低负载的堆分配采集分析程序:JVMTI,默认启动方案可以持续工作且不造成服务器压力,面向接口编程,能够收集活着和死去的对象信息。

7、Transport Layer Security 1.3更新

简称TLS1.3是网络传输层协议,需要注意的它不兼容历史版本而且官方承认有风险,希望后续能不断优化。

8、嵌套访问控制

嵌套是一种访问控制上下文,它允许多个class同属一个逻辑代码块,但是被编译成多个分散的class文件,它们访问彼此的私有成员无需通过编译器添加访问扩展方法。

例子:

/**
 * @author: Owen Jia
 * @time: 2019/11/7
 */
public class NestBasedTest {

    public static class Nest1 {
        private int varNest1;
        public void f() throws Exception {
            final Nest2 nest2 = new Nest2();
            //这里没问题
            nest2.varNest2 = 2;
            final Field f2 = Nest2.class.getDeclaredField("varNest2");
            //下面代码在java 8环境下会报错,但在java 11中是没问题的
            f2.setInt(nest2, 1);
            System.out.println(nest2.varNest2);
        }
    }

    public static class Nest2 {
        private int varNest2;
    }

    public static void main(String[] args) throws Exception {
        new Nest1().f();
    }
}
这里要提一下Class类新增的方法:
// 获取宿主类。非嵌套类的宿主类是它本身。
public Class<?> getNestHost()
// 判断该类是否是某个类的嵌套类
public boolean isNestmateOf(Class<?> c)
// 返回某个类的嵌套类数组。第 1 个固定是宿主类,之后的是该宿主类的嵌套成员,但不保证顺序,同时也会包含自身

public boolean isNestmateOf(Class<?> c)
9、新增和优化诸多加密算法

对PKCS#1 v2.2内提供更多算法,如RSASSA-PSS签名算法。同时新增ChaCha20和Poly1305密码算法,通过Cipher.getInstance使用。还有 Curve25519和Curve448被添加。AES128和265也支持了Kerberos 5 encryption。

10、本地参数支持Lambda

简单理解就是lambda表达式的变量申明可以用var。

lst.forEach((var x) -> {
  System.out.print(x);
});
11、单java文件加载运行

单个的*.java文件可以直接用java命令来执行,格式:java HelloWorld.java。

12、飞行记录器分析工具

Jvm启动参数:-XX:StartFlightRecording

Java11中将这款原来商用的工具集成到jdk标准中了,它是一种低开销的事件信息收集框架,用来对应用程序和JVM 进行故障检查、分析,收集应用程序、JVM 和 OS的数据并保存在单独的事件记录文件中,故障发生后,能够从事件记录文件中提取出有用信息对故障进行分析。

更多其他能力

还有很多其他更新就不一一介绍了,这些都是JDK标准包支持的基础能力,得感谢Oracle持续对JDK发布的支持。完整的jdk11变化清单可以去官网查看;

从11开始移除的模块清单

  • Removal of com.sun.awt.AWTUtilities Class
  • Removal of Lucida Fonts from Oracle JDK
  • Removal of appletviewer Launcher
  • Oracle JDK's javax.imageio JPEG Plugin No Longer Supports Images with alpha
  • Removal of sun.misc.Unsafe.defineClass
  • Removal of Thread.destroy() and Thread.stop(Throwable) Methods
  • Removal of sun.nio.ch.disableSystemWideOverlappingFileLockCheck Property
  • Removal of sun.locale.formatasdefault Property
  • Removal of JVM-MANAGEMENT-MIB.mib
  • Removal of SNMP Agent
  • Remove the Java EE and CORBA Modules
  • Removal of JavaFX from the Oracle JDK
  • Removal of JMC from the Oracle JDK
  • Removal of Java Deployment Technologies

更多请查看官网

升级建议(重要)

从Java 11后Oracle不再单独发布JRE和Server JRE了,并统一JDK名称为:Oracle JDK。

另外Java 11及之后的版本,将不会再发布对32位操作系统支持的版本。

新旧项目不同策略

新启的Java项目建议直接从Oracle JDK 11开始搭建,千万不要犹豫,因为技术都是越新越强的。Java8就像晚期的大众,而Java11却是新兴的特斯拉。

历史的项目如果只是维护的话,干脆就放着运行不要动好了,等哪天决定重构了再考虑升级到Java11。因为最大的问题不是自己公司开发的Code不能迁移到高版本,而是项目中引入的第三方Jar,这个东西搞起来十分头疼。

JDK升级分析工具

升级最担心的就是被删除的模块!

推荐IBM公司Liberty团队提供了一个十分好用的检测Toolkit程序,可以扫描应用程序二进制文件(.war),发现的任何潜在的Java 11问题并生成Html报告。绝对的大利器,详细内容直接查看IBM官方介绍:Scanner Kit。

直接运行java -jar binaryAppScannerInstaller.jar,按步骤安装有个lisence声明和目录指定,默认目录名wamt

参考文档中会有使用详细介绍,也可以参考下面测试例子(扫描很慢,要些耐心等):

java -jar binaryAppScanner.jar Root.war --analyzeJavaSE --sourceJava=oracle8 --targetJava=java11 --output=./java11/RootReport.html

查看帮助命令:

java -jar binaryAppScanner.jar Root.war --help --all

报告结果如下:

JDK不同于OpenJDK

推荐Oracle JDK,因为更加稳定可靠。

  • 只有Oracle JDK支持Solaris系统;
  • 只有Oracle JDK才支持msi这样的安装程序;
  • Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
  • OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是 OpenJDK的一个实现,并不是完全开源的;
  • Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但建议您选择Oracle JDK,因为它经过了彻底的测试和稳定修复;
  • 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;
  • Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
  • Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。Oracle公司很善于打官司,所以这点很重要。

本文分享自微信公众号 - Java架构沉思录(code-thinker),作者:黄哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何优雅地根治null值引起的Bug!

    在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系。但它会让你很头疼。

    黄泽杰
  • Netty高性能之道

    最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调...

    黄泽杰
  • 如何设计实现一个轻量的开放API网关

    随着业务的发展, 所对接的第三方越来越多, 各个业务系统面临着同样一个问题: 如何让第三方安全快速接入. 此时有一个集验签、鉴权、限流、降级等功能于一身的API...

    黄泽杰
  • 来,教你从 Java 8 升级到 Java 11

    Unicode 10(version 10.0 of the Unicode Standard),Unicode是一个不断在演进的行业标准,Java一直在与它保...

    Java技术栈
  • 聊聊腾讯云TStack上云Oracle的应用

    能否利用TStack的计算、网络和存储能力,将Oracle运行在X86服务器,IP网络,云存储的“云化”架构上,去掉IOE架构中的I和E呢?

    腾讯云TStack
  • Spring Boot企业微信点餐系统教程视频

    七月半夏
  • Error response from daemon: rpc error: code = Unknown desc = name conflicts with

    docker service create --mode global --name logspout gliderlabs/logspout

    周小董
  • SELECT basics | SQL刷题

    本系列文章的主要目的在于记录本人的刷题过程,尽量在文章中展示本人所想到的答案,或者是别人的参考答案。

    数据医生
  • 共享汽车初体验:惊喜很多,槽点也不少

    镁客网
  • Linux Deploy:使用Repository部署Linux系统

    美丽应用

扫码关注云+社区

领取腾讯云代金券