最近项目要做jdk升级
最开始以为只要把版本号一改,看下如果编译没有报错的地方就可以了
后来听了下前辈的经验,这样是远远不够的;
首先,只看本地的业务代码是否报错,肯定是不行的。因为你的框架有很多依赖,不说其他的,spring肯定有吧。spring的版本和JDK是有严格的兼容跨度的;你想绕过spring升级jdk肯定不现实;
而且不止spring,什么netty,连接池(Hikari/Druid),字节码工具这些都对jdk有要求的;
所以第一步不是升级jdk,而是把依赖先升到最新的jdk版本;
其次,要考虑到GC的问题,jdk升级后默认的GC就不一样了。开始觉得生产上都是指定GC的,所以没事;但实际上换了jdk后参数也是发生变化的,之前的调优参数肯定不能再用了,需要重新设置;(cms-G1的参数变化有多大,调过的都懂)
还有一个要注意的点,就是关于云原生;
在容器里和虚拟机jvm的表现不一致;
JDK8u91+以后都支持
java
-XX:+UseContainerSupport
它可以让JVM不再读宿主机资源,改从cgroup读取容器memory limit 和CPU quota
这个关系到JVM 感知到CPU核数,设置的不好可能会出现0.5核的情况;
因为JVM 并不是读取"CPU核数",而是在读 Linux cgroup 的配额
JVM 必须遵守cgroup的限制
看下面的ymal
bash
resource:
limits:
cpu: "500m"
这里的本质是
500/1000 = 0.5个CPU