导读
本文记录了作者从JDK8升级到11的实践过程和升级后的效果以及JDK11新玩法。
一、背景
为什么要升级JDK11
必然趋势
二、升级前你要知道的点
三、升级过程
本地升级,让你的JDK11跑起来
这里不过多阐述,需要注意区分JDK的arm版本与x64版本。
修改pom文件
11
11
11
2.1.6.RELEASE
1.18.12
软件
最低版本
spring-boot
2.1.x 开始支持jdk11
spring
5.1.x
idea
2018.2
maven
3.5.0
lombok
1.18.x
netty
需要升级到 4.1.33.Final 或之后的版本,否则会引起堆外内存增长
apache common lang3
3.12.0
jdk11已移除,需手工依赖二方库
javax.xml.soap
javax.xml.soap-api
1.4.0
com.sun.xml.ws
jaxws-ri
2.3.3
pom
com.sun.xml.bind
jaxb-impl
2.3.0
javax.xml.bind
jaxb-api
2.3.0
javax.annotation
javax.annotation-api
1.3.2
com.sun.activation
javax.activation
1.2.0
com.sun.xml.bind
jaxb-core
2.3.0
com.alibaba.jvm
java-migration-jdk-patch
0.3.1
pom
javax.transaction
javax.transaction-api
1.2
Deprecated: A global security auto-configuration is now provided
在Spring Boot 2.0及以上版本中,这个配置项已经被废弃并移除。如果你要关闭端点的安全性,需要在Spring Security的配置中对Actuator端点进行配置。该配置项是默认开启安全检测。
Dependency 'org.hibernate:hibernate-validator:' not found
需要指定版本号
org.hibernate
hibernate-validator
6.2.4.Final
应用不能进行远程调试
原因分析
JDK 8 中 jdwp 默认绑定的 host/ip 是 0.0.0.0,初于安全考虑在 JDK 9 后改成了 localhost(127.0.0.1),导出如果开发者在配置调试选项时只指定端口时,在升级后无法进行远程调试。
解决方案
指定调试选项时设置 host/ip 为 *,如:
agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
或者 0.0.0.0,如:
agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8000
其他问题
1、maven-compiler-plugin:此插件建议直接升级到最新版,同时在父Pom和每个你需要额外确定版本的包(比如说打给别人用的JDK8版本的包)里的Pom,指定版本:
11 11
2、Springboot和Spring版本:Spring从5.1开始支持11,Springboot从2.1.X开始支持11,我们的推荐是支持升级到当前的最新版;
3、Netty因为堆外内存的释放问题,请升级到4.1.33以上的版本;
4、lombok因为会在编译期插入自己的编译逻辑,所以升级到11之后,需要将lombok升级到最新版,(编辑文档时的最新版本是1.18.24);
5、可能大部分应用都需要进行Spring或者Springboot升级,请务必做好回归;
6、security-spring-boot-starter分为1.x.x和2.x.x版本,对应springboot1和springboot2,请升级到2.x.x版本;
应用部署发布
去除
#SERVICE_OPTS="${SERVICE_OPTS} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5000"
#SERVICE_OPTS="${SERVICE_OPTS} -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly"
#SERVICE_OPTS="${SERVICE_OPTS} -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000"
#SERVICE_OPTS="${SERVICE_OPTS} -XX:ParallelGCThreads=4"
#SERVICE_OPTS="${SERVICE_OPTS} -Xloggc:${MIDDLEWARE_LOGS}/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
SERVICE_OPTS="${SERVICE_OPTS} -XX:+UseG1GC -XX:+UseVtableBasedCHA -XX:+UseCompactObjectHeaders"
SERVICE_OPTS="${SERVICE_OPTS} -XX:G1HeapRegionSize=8m"
SERVICE_OPTS="${SERVICE_OPTS} -XX:+G1BarrierSkipDCQ"
SERVICE_OPTS="${SERVICE_OPTS} -Xlog:gc*:/home/admin/logs/gc.log:time"
SERVICE_OPTS="${SERVICE_OPTS} -XX:G1HeapWastePercent=2"
SERVICE_OPTS="${SERVICE_OPTS} -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000"
if [ -n "$AJDK_MAX_PROCESSORS_LIMIT" ]; then
SERVICE_OPTS="${SERVICE_OPTS} -XX:ActiveProcessorCount=$AJDK_MAX_PROCESSORS_LIMIT"
fi
GC调优的注意事项(数据来源JVM团队)
通常G1 GC是一个免调参的GC,并不需要额外的参数调整。老的一些的八股文Java GC调参经验并不适用。
-Xmn参数一般不需要设置
G1预设了-XX:NewSize和-XX:MaxNewSize的值(不一致),会根据实际运行来计算设置每次GC的young区的size,实现GC暂停的软可控。
-XX:NewRatio同理不需要设置-XX:SurvivorRatio一般也不设置
通常绝大部分使用者并不清楚这个参数的含义以及对GC带来的影响,G1会自适应处理这个参数相关的GC行为。
升级G1后可能需要关注的参数-XX:MaxGCPauseMillis=N,G1暂停的目标时间(毫秒)
默认为200,很多用户会刻意设小,通常情况下意义不大。G1实际的GC暂停任务,并不会随着暂停时间缩小而变少,可以设小会导致更频繁的GC影响吞吐。一般不需要设置,如果需要更好的吞吐,通常是设置更大,保持young区不会缩减的太小。也可以咨询JVM答疑专家考虑调整-XX:NewSize和-XX:MaxNewSize,来保持young 区的Size,维持合适的吞吐性能。
-XX:InitiatingHeapOccupancyPercent=N -XX:-G1UseAdaptiveIHOP (电商核心使用)
这两个参数通常同时使用。JDK11引入了G1UseAdaptiveIHOP来提升老区的利用率(大堆,通常大几十G,或者100G以上)。在我们容器规格中等规模的heap(通常5-20g)的size中,有时会出现old gc过于频繁或者young gc过于频繁的现象。因此考虑一个合适的静态IHOP(老区使用占全堆比例触发GC的阈值),会更加合适。
-XX:G1HeapRegionSize,(电商核心通常使用8m-32m)
设置G1 region的大小,应对humongous对象(超过heap region size一半独占一个或多个region)引起的GC异常。Heap region size默认为Heap size/2048,如果默认值过小,humongous对象分配过多,容易引起To-space exhausted的异常暂停时间:
本网站每日更新互联网创业教程,一年会员只需98,全站资源免费下载点击查看会员权益