Myeclipse 2017 Tomcat中运行报 java.lang.OutOfMemoryError: PermGen smpace错误 配置服务器虚拟机的大小

把项目放到Tomcat中运行报 java.lang.OutOfMemoryError: PermGen smpace错误

PermGen space的全称是Permanent Generation space(永生带),是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。

总结:项目中class文件太多,Java虚拟机中的静态空间无法将所有class文件装入,所以要增大内存。

Myeclipse 2017较新,所以配置的方法是

window->perference->java->installs jres->edit->default VM arguments填入以下配置:

-Xms512m -Xmx512m

-Xms512m 设置JVM Heap(堆内存)最小允许分配的堆内存为512m,(数字可以按需设置)

-Xmx512m 设置JVM Heap(堆内存)最大允许分配的堆内存为512m,(数字可以按需设置)
说明:如果-Xmx不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM不是Throwable的,无法用try...catch捕捉。

-XX:PermSize=512m -XX:MaxPermSize=512m

说明:PermSize和MaxPermSize指明虚拟机为java永久生成对象(Permanate generation)的大小,如,class对象、方法对象这些可反射(reflective)对象分配内存限制,这些内存不包括在Heap(堆内存)区之中。


MaxPermSize缺省值和-server -client选项相关。
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m
****************************************************************************************************

如果不是在IDE中开发项目,则需要更改tomcat的配置文件:

Windows环境下:%tomcat_home%/bin/catalina.bat文件:
在最开始的位置加上:

1

set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=512M -XX:MaxPermSize=512m -XX:-UseGCOverheadLimit %JAVA_OPTS%

  这样就搞定了。

注意:如果只更改catalina.bat文件,而是通过IDE启动tomcat,则IDE会忽略掉catalina.bat文件中设置的参数,所以最好就是在2处都进行更改。

******************************************************************************************************************** 
Linux环境下:修改catalina.sh文件,在
cygwin=false
之前添加

1

JAVA_OPTS="-server -Xmx256m -Xms256m -XX:PermSize=512M -XX:MaxPermSize=512m"

 

其他例子:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

 

 

更详细的配置可以参考:JVM调优总结 -Xms -Xmx -Xmn -Xss

-vmargs:说明后面是VM的参数

-Xms40m:虚拟机占用系统的最小内存

-Xmx256m:虚拟机占用系统的最大内存

-XX:PermSize:最小堆大小。一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置

-XX:MaxPermSize:最大堆大小。这个也适当大些所以若出现问题,首先请调整 -Xms40m:将其设置的小一些,就ok了,1g内存推荐设置为:

 

官方推荐新生代占堆的3/8

幸存代占新生代的1/10

-Xms4:初始时堆内存

-Xmx4:最大堆内存

-Xmn2g:年轻代内存

-Xss1024K:一个线程的堆栈大小(1M)

-XX:PermSize=256m:初始永久代内存

-XX:MaxPermSize=512m:最大永久代内存

-XX:ParallelGCThreads=8:并行收集器的线程数

-XX:+UseConcMarkSweepGC:并发标记清除(CMS)收集器

-XX:+UseParNewGC:并行收集

-XX:+UseCMSCompactAtFullCollection://在FULL GC的时候对年老代的压缩

-XX:NewRatio:新生代与老年代比值,例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5

-XX:SurvivorRatio=4:设置两个Survivor区和eden的比值,例如:4,表示两个Survivor:eden=2:4,即一个Survivor占年轻代的1/6

-XX:MaxTenuringThreshold=10:垃圾最大年龄

-XX:CMSInitiatingOccupancyFraction=80://使用80%后開始CMS收集

Java 堆分为新生代和老年代,新生代一般划分为三块区域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的内存比为8:1,每次只使用一个Eden 和一个 Survivor 区域,另一个 Survivor 用于复制收集算法回收内存。

对象一般尽量分配到新生代中,而对于大对象(长字符串和大数组)直接分配在老年代中,同时“年龄”长的的对象会从新生代自动晋升到老年代中。

Java 方法区称为永久代,只有 HotSpot 虚拟机才存在永久代。

当 Eden 区域分配不足时,自动发生一次 Minor GC。

当发生 Minor GC 时,虚拟机会自动检测(比较)新生代晋升到老年代的对象内存大小和老年代剩余内存大小,如果晋升>剩余,则发生一次Full GC;如果晋升<剩余,则去检测老年代的内存担保 HandlePromotionFailure 是否允许担保失败,如果不允许担保失败,则发生一次Full GC,如果允许失败,则进行一次Minor GC。

引用:https://www.cnblogs.com/orientsun/archive/2012/07/25/2608545.html

深入理解JVM模型https://www.cnblogs.com/winby/p/6627838.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值