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文件,它们访问彼此的私有成员无需通过编译器添加访问扩展方法。
例子:
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 Class<?>[] getNestMembers()
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技术和业内最佳实践,大部分都是务实的、能看懂的、可复现的
Java8尽管很香,你想过升级到Java11吗?会踩那些坑?的更多相关文章
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- java8实战一------解决冗杂,java8真的很便利(抛砖)
你的代码很容易因为需求而变化,对自己代码改来改去的你一定会觉得烦的.在我看来,java8很容易的解决了这个问题. 先来看看例子!在一堆苹果里,筛选绿色的苹果.当然,Apple类是这样子. class ...
- Windows 的这款工具,有时让我觉得 Mac 不是很香
上次写了个 cheat.sh 在手,天下我有,小伙伴们热情高涨,觉得这是一个没有杂质的好工具:也有小伙伴抱怨说对 Windows 用户不是特别友好 (其实用 curl API 是没啥问题的).为了「雨 ...
- 别再面向 for 循环编程了,Spring 自带的观察者模式就很香!
上一篇:JDK 自带的观察者模式就很香! 前段时间栈长给大家分享了什么是观察者模式,以及在 JDK 中如何实现观察者模式,现在都是 Spring 的天下了,今天就再分享下如何在 Spring/ Spr ...
- Spring Cloud 升级最新 Finchley 版本,踩坑指南!
https://blog.csdn.net/youanyyou/article/details/81530240 Spring Cloud 升级最新 Finchley 版本,踩了所有的坑! 2018年 ...
- 升级openssh踩得坑
升级背景: 项目中使用的系统为CentOS6.8,经过漏洞扫描后发现openssh高危漏洞,具体描述如下:OpenSSH 7.2p2之前版本, sshd/ session.c/ do_setup_en ...
- 升级10.11.6后CocoaPods的坑,之前10.11.4已经安装好的,居然没了Failed to locate Homebrew!
升级10.11.6后CocoaPods的坑,之前10.11.4已经安装好的,居然没了,用命令 sudo gem install cocoapod 装不上,换 sudo gem install -n/u ...
- 升级cocoapods1.1.0版本遇到的坑
先容我吐槽两句, 最近写Swfit3.0, 要用到一些框架, 然后就用cocoapods嘛, 结果说要cocoapods1.1.0版本才行, 而自己的是cocoapods1.0.1版本的, 所以就想着 ...
- 真香系列之 Golang 升级
Golang 以前的依赖管理一直饱受诟病,社区的方案也层出不穷,比如 vendor, glide, godep 等.之前的依赖管理一直是依靠 GOPATH 或者将依赖代码下载到本地,这种方式都有劣势. ...
随机推荐
- scala基本语法
scala基本语法scala函数1 def定义方法2 方法的返回值类型可以省略3 方法体重最后一行计算结果可以返回 return 如果省略方法类型4 方法参数 要指定类型5 如果方法体可以一步搞定 方 ...
- django count(*) 慢查询优化
分页显示是web开发常见需求,随着表数据增加,200万以上时,翻页越到后面越慢,这个时候慢查询成为一个痛点,关于count(*)慢的原因,简单说会进行全表扫描,再排序,导致查询变慢.这里介绍postg ...
- electron教程(番外篇二): 使用TypeScript版本的electron, VSCode调试TypeScript, TS版本的ESLint
我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...
- java 运行和编译
一.编译->运行 1.编译 javac 文件名.java 生成 文件名.class 2.运行 java 文件名 注意:正在运行的是 文件名.class 因此:修改源文件后,要先编译,再运行 ...
- spring cloud-config的client中/refresh的端点报错401
post访问/refresh端口报错如下 { "timestamp": 1537865395040, "status": 401, "error&qu ...
- 【VBA】EXCEL通过VBA生成SQL,自动生成创建表结构SQL
原文:https://blog.csdn.net/zutsoft/article/details/45441343 编程往往与数据库密不可分,一个项目往往有很多的表,很多时候通过excel来维护表结构 ...
- 生成URL(而不是链接) Generating URLs (and Not Links) | 在视图中生成输出URL |高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
结果呢:
- Dynamics email的subject标题出现 CRM:0000xxxx
怎样移除email subject标题中出现的CRM:0000xxxx Settings->Administration->System Settings->Email->Un ...
- 自定义BeanDefinitionRegistryPostProcessor
自定义BeanDefinitionRegistryPostProcessor 概述 BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProce ...
- 自定义BeanDefinitionRegistryPostProcessor注册bean
自定义BeanDefinitionRegistryPostProcessor 概述 BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProce ...