`

项目在64位JDK下正常,32位下出现异常

阅读更多

这几天,发现项目在64位JDK下启动,一切正常,但是换到32位的JDK下之后,启动出现java.lang.StackOverflowError异常。

 

关于java.lang.StackOverflowError异常,一般情况下是代码写的有问题,出现了死循环或深层次的递归调用,导致内存溢出。

 

但是我们的项目,除在64位JDK下正常外,部署在公司的服务器上,使用中也一切良好,因此基本排除这个可能。那么就应该是32位和64位的JDK本身的区别,导致了项目运行内存不够从而抛出异常。

 

根本原因,应该是项目太过庞大,纵观我们的项目,maven管理的主项目和模块项目粗略数了下,竟然达到了50个之多,在这之前已经对JVM的各项参数内存进行了加大配置,不然无法运行,配置如下:

 

-Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=512m

 

该配置在64位的JDK下运行一切正常,但是换到32位之下后,出现上面所说的问题,加大上面配置的各项内存后,发现问题依旧。

 

对比32位和64位JDK的各项默认参数配置,发现线程的默认堆栈大小32位JVM,默认堆栈最大是320k 而64位JVM是1024K,看来网上所说JDK 5.0之后已经默认为1M是针对64位而言,将32位JDK的线程堆栈加大,问题解决。

 

配置如下,添加了-Xss1024k

-Xms512m -Xmx1024m -Xss1024k -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=512m

 

这只是权宜之计,关键所在还是项目规划要做好啊!!

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics