jdk7 升级 jdk8 的情况实际发生的问题总结

阅读更多

相信大多数的研发人员都遇到过关于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;
}

 

你可能感兴趣的:(java,jvm,cglib)