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 $*


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