相信大多数的研发人员都遇到过关于jdk7 升级 jdk8 的情况,对于企业应用在升级的时候需要特别注意:
1- 从jdk7 升级 jdk8 后,机器的JVM内存参数要进行调整,否则会出现报错,原因是JDK7 与JDK8 的内存模型发生了变化。
比如一版jdk7 的jvm参数为如下:
JAVA_OPTIONS=“-Xms2048M -Xmx2048 -XX:MaxNewSize=1024M -XX:MaxNewSize=1024m -XX:PermSize=512M -XX:MaxPermSize= 512M -XX:survivorRetio=8 -XX....”
jdk8:
JAVA_OPTIONS=“-Xms2048M -Xmx2048 -XX:MaxNewSize=1024M -XX:MaxNewSize=1024m -XX:MetaspaceSize=512M -XX:survivorRetio=8 -XX....”
由于jdk7的关于参数区,需要预先指定空间,若超过后会报outOfMemeryError PermGen space ,而jdk8 原本在堆空间中的 常量池与方法区 被转移到了元数据区中去了,这样就不需要指定permSIze 的最小与最大内存空间,而实际当中往往很难精准的判断出这个空间的有效值,因此jdk8废除了这样的模式,把参数与方法区的内测独立到了元数据区,而元数据区默认是与机器剩余的内存空间共享的,若不指定则最大值未机器的剩余内测空间的最大值。但建议还是要设置。
JVM 的演变历史https://blog.csdn.net/tlk20071/article/details/77841841
2- 个别开源工具,在升级jdk8 后,比如cglib,由于本身jdk7、jdk8的反射机制有差异,在非规范的POJO写法,若遇到ibaties 的动态DYNAMIC 化实例化动态类会出现异常,而cglib在遇到异常的情况却未抛出而转用jdk代理方式来初始化属性。
非规范写法如下:
public Object setNameId(String Id) {
this.productId = nameId;
}
public Object setCustId(String Id) {
this.custId = custId;
}
正确的做法:
public void setNameId(String Id) {
this.productId = nameId;
}
public void setCustId(String Id) {
this.custId = custId;
}