一个关于jvm堆溢出引发的思考

在本地测试无误的程序,放上正式服时,出现了堆溢出,本地是Windows系统下的,服务器是linux系统,后来经过测试发现是我在本地跑程序时,在eclipse中添加了如下参数:


此处先解释下上面各参数的的含义:
-Xms512m 堆的最小值
-Xmx1024m 堆的最大值
另外jvm垃圾回收采用分代搜集的方法,把堆分为三个部 分,新域,旧域和永久域。Jvm生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使用期并进入旧域。在永久域中jvm则存储 class和method对象。就配置而言,永久域是一个独立域并且不认为是堆的一部分
-XX:MaxPermSize=512 设置永久域的最大值,
-XX:ReservedCodeCacheSiz e=64m 缓存,可以自己改,超过也溢出,不过,溢出也无所谓,忽略即可

我猜想是不是因为tomcat没有设置上述参数导致的;因为一开始我都是依赖eclipse来启动tomcat的,所以tomcat在启动时就会去加载eclipse中配置的环境,而正式服服务器启动是脱离ide的,所以并没有这些参数设置?
为了验证我的猜想;
我特地去我本地拿tomcat跑程序,不依赖eclipse去启动,此时本地tomcat并未设置上述参数;结果如下:
一个关于jvm堆溢出引发的思考_第1张图片

果然本地的tomcat不依赖eclipse也出现了堆溢出

找到tomcat的配置文件:tomcat的安装目录下的bin下面
一个关于jvm堆溢出引发的思考_第2张图片

此处解释下,为什么会有2个Catalina文件,后缀名为.bat的是windows下的配置文件,后缀名为.sh的为Linux下的配置文件,话不多说
打开Catalina.bat文件,找到如下位置:
一个关于jvm堆溢出引发的思考_第3张图片

JAVA_OPTS:java相关运行参数

此处应该是配置了tomcat默认的JAVA_OPTS参数
在此处前面添加:(具体添加位置我还没有弄清楚,我是加在此处也有效,就暂时加在这了)
set JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=64m
一个关于jvm堆溢出引发的思考_第4张图片

添加完成后,保存,重新启动tomcat:结果ok了

一个关于jvm堆溢出引发的思考_第5张图片

ok,下面我来讲下如何在Linux环境下,配置tomcat的Java运行环境:

首先同样的找到,tomcat的安装目录下的bin,然后打开 Catalina.sh文件;

找到如下位置:
一个关于jvm堆溢出引发的思考_第6张图片

在此处添加:
JAVA_OPTS="-Xms512m-Xmx1024m-XX:ReservedCodeCacheSize=64m-XX:MaxPermSize=512m"

保存,ok!!!
以上参数的具体大小,和需要配置的参数,根据自己的实际情况更改

下面我将附上jvm参数大全:

一个关于jvm堆溢出引发的思考_第7张图片

一个关于jvm堆溢出引发的思考_第8张图片


一个关于jvm堆溢出引发的思考_第9张图片

一个关于jvm堆溢出引发的思考_第10张图片

一个关于jvm堆溢出引发的思考_第11张图片一个关于jvm堆溢出引发的思考_第12张图片

一个关于jvm堆溢出引发的思考_第13张图片

版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(一个关于jvm堆溢出引发的思考)