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最大允许分配的非堆内存,按需分配

              记录一下,希望遇到此类问题的朋友们能少走弯路,这么小个事情我话费了大半天时间查找和郁闷----

原文地址:https://www.cnblogs.com/annyliu/p/3688081.html