欢迎大家来到IT世界,在知识的湖畔探索吧!
背景
最近我推动将生产环境JDK版本从8升到11,虽然产生了一些小波折,但是总体来说还是很顺滑的,感觉在企业应用级开发层面,JDK的跨版本兼容是做的不错的。
既然升级了JDK,我也又重新回顾了一下 9 / 10 / 11 的一些变化,并把一些感觉能用到的变化总结在这里。
新的Class Loader实现
JDK9开始,ClassLoader做出了一些变化,官方文档上的相关描述是这样的
我升级过程中暂时没有感知到这些变化带来的问题,网上有同学在parallelStream中有踩坑经历。
移除Java EE和CORBA模块
JDK9的模块化改造,同时将一些包从JDK中分离了出去,主要包有下面这些
- java.xml.ws: Java API for XML Web Services (JAX-WS), Web Services Metadata for the Java Platform, and SOAP with Attachments for Java (SAAJ)
- java.xml.bind: Java Architecture for XML Binding (JAXB)
- java.xml.ws.annotation: The subset of the JSR-250 Common Annotations defined by Java SE to support web services
- java.corba: CORBA
- java.transaction: The subset of the Java Transaction API defined by Java SE to support CORBA Object Transaction Services
- java.activation: JavaBeans Activation Framework
- java.se.ee: Aggregator module for the six modules above
- jdk.xml.ws: Tools for JAX-WS
- jdk.xml.bind: Tools for JAXB
我们项目中在对JWT做处理的时候,有引用到 java.xml.bind,升级JDK版本后,增加了显式的依赖,解决了问题。
删除或更改API
- javax.security.auth.Policy
- java.lang.Runtime.runFinalizersOnExit(boolean)
- java.lang.SecurityManager.checkAwtEventQueueAccess()
- java.lang.SecurityManager.checkMemberAccess(java.lang.Class,int)
- java.lang.SecurityManager.checkSystemClipboardAccess()
- java.lang.SecurityManager.checkTopLevelWindow(java.lang.Object)
- java.lang.System.runFinalizersOnExit(boolean)
- java.lang.Thread.destroy()
- java.lang.Thread.stop(java.lang.Throwable)
Jshell
Python的命令行工具比较好用,甚至有些同学喜欢把它当做计算器使用。Java也引入了命令行工具,不过个人感觉并没有什么亮点。
String 类中新的 API
String s1 = " Testing ";System.out.println(s1.strip()); //TestingString s2 = " Testing ";System.out.println(s1.stripLeading()); //Testing空格String s3 = " Testing ";System.out.println(s1.stripTrailing()); //空格TestingSystem.out.println(" ".isBlank()); //trueString s4 = "A\nB\nC";Stream<String> ss = s4.lines();ss.forEach(s -> System.out.println(s));System.out.println("A".repeat(3)); //AAA
欢迎大家来到IT世界,在知识的湖畔探索吧!
集合工厂方法
借鉴Guava提供了以下的集合工厂方法,不过Guava还是香。
- List.of()
- Set.of()
- Map.of()
- Map.ofEntries()
- List.copyOf()
- Set.copyOf()
- Map.copyOf()
局部变量的类型推断
Java是强类型语言,不过鉴于大家都说JavaScript用起来方便,Java也提供了var关键字。
实质上来说var只是一个语法糖,实际编译时还是会用确认的类型替换掉。
垃圾收集器
JDK8: 默认Parallel GC(高吞吐方向),可选G1(Garbage-first GC)
JDK11: 默认G1(低延迟方向),可选ZGC(The Z Garbage Collector)
总体来说,G1适合大内存(>6GB),低延迟(<0.5S),也就是对延迟敏感的场景,并非所有场景都合适。
之前也曾跟一个甲骨文的同学聊过,由于公司原因他们都会使用比较新的JDK版本。在升级JDK11之后他们发现服务内存使用明显增大,所以又手动将GC调整为Parallel GC。
而ZGC是在低延迟的路上又往前走了一步,它的设计目标是
- 停顿时间不超过10ms
- 停顿时间不会随着堆的大小,或者活跃对象的大小而增加
- 支持8MB~4TB级别的堆(未来支持16TB)
ZGC经历了一段时间的优化,新版本据说可以控制在1ms内,对严苛的延迟需求有价值。
我曾经读到过2020年美团技术团队的一篇文章,记述了他们在低延迟高需求的风控业务中选用ZGC的使用及调优实践,比较有参考价值。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/48378.html