resin4.0启动报错GC overhead limit exceeded

近日由于公司java项目的业务拆分,也为了节约服务器成本,所以在一台测试机(8核32G)的resin4.0里开启了16个实例ps:至今没反应过来我是怎么把这近40个端口号分配下去的。每个实例的jvm:-Xms512M,-Xmx512M。这样算来,16个实例全部开启的话,系统内存也是够用的。但是后来发现,全部实例开启一段时间后,有些就挂掉了。再次启动时抛出异常:java.lang.OutOfMemoryError:GC overhead limit exceeded,导致服务无法启动。错误显示内存溢出,可查看系统内存也只是用了12G左右,便想是否是resin使用的总内存被限制了。在网上搜寻解决方法,大部分给出的是在配置文件里加-XX:-UseGCOverheadLimit的参数和增大jvm的内存,但是改变配置后服务仍然无法启动,报错相同。

之后想配置文件里加参数不行,难道是在执行java命令的时候直接在命令行指定的参数?便到/usr/local/resin/bin目录下,查看启动脚本resinctl和resin.sh。之前单个实例时分别用两个脚本启动都可以,之后配置了多个实例后一直用resin.sh来指定cluster id启动相应的实例:/usr/local/resin/bin/resin.sh start -server app。对比两个脚本发现,最后执行java命令的时候resinctl相比resin.sh多一个$JAVA_ARGS的变量,JAVA_ARGS="-d64"。看到-d64后猜测和系统位数相关,便查询了一下java -d参数的涵义后明白:-d32和-d64指定此java程序运行在32或者64位系统环境,如果没有指定,则默认为-d32。而32位系统程序最大可用内存4G。

解决方法:在resin.sh脚本里启动java程序的命令里添加-d64参数。

exec $JAVA_EXE -d64 -jar ${RESIN_HOME}/lib/resin.jar $*


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章