JVM内存分配导致服务无法启动问题
昨天忙了一天找问题,最终被惊呆了,记录一下。
现象: 配置对外系统的预发布环境,部署在2个服务器,都是resin5,发布成功,代码都上传到了相应机器上,但是无法通过域名访问。
分析:
现象一:发现8094端口没有被监听,
但是进程里面有resin5的进程:
所以我就被引入了误区,诡异一:resin起来了,但是相应端口没被监听。
于是去bin目录下重启resin,显示启动成功,但是端口8094还未被监听。
和运营的同事一起郁闷了好久-------------
步骤一:请教leader,告知先删掉我发布上去的代码,尝试最小启动。于是rm -rf unicorn* 再重启一下resin5,netstat时候发现8094端口被监听了。
分析可得:1. 之前虽然./mqq_start.sh显示running success,但是事实上没启动成功(不能信脚本的输出)
2. 可能是代码问题,因为删掉代码之后就可以成功启动了。
于是又有了 诡异二:为什么同样的代码在测试环境上发布,resin就能成功启动,在预发布环境上就不可以?
步骤二: 既然在测试环境上ok,那肯定就不是代码的问题,那就应该是resin的配置了。于是对比一下resin的start.sh,发现问题了。
预发布环境resin下的start.sh
测试环境resin下的start.sh:
一目了然,顿时恍然大悟,是JVM内存分配的问题,预发布环境装的resin初始内存和最大分配的内存都太小了,不够用,所以没起来--
-XX:PermSize=64M JVM初始分配的非堆内存
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配
记录一下,希望遇到此类问题的朋友们能少走弯路,这么小个事情我话费了大半天时间查找和郁闷----