这几天,发现项目在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
这只是权宜之计,关键所在还是项目规划要做好啊!!