SSH部署到Tomcat内存溢出-OutOfMemoryError 的解决办法

使用ssh集成项目后,部署几回后会就会出现OutOfMemoryError PermGen space系统错误,经过在网上查阅资料,发现这个错误并非Tomcat的问题,而JVM设计自身的一个缺陷,JVM把内存分了不一样的区, PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,类加载的时候就存放在这个区域中。原本SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到如今动态会用得这么普遍。并且这个区域有特殊的垃圾收回机制,如今的问题是动态加载类到这个区域后,gc根本没办法回收!

没想到至今这个问题还没未能解决,有人给出最好的解决方法是不使用JDK,使用BEA的JRokit,固然如今Oracle,BEA,SU已经成为一家人了,我想这个问题应该会更快有更好的解决方案。linux

好了仍是说说如何解决问题吧,网上大量的资料说在tomcat这样设置:SET JAVA_OPTS= -Xms64m -Xmx512m,但通过本人的测试,没有一点做用,详细看了JVM内存的分配机制后才知道,-Xms和--Xmx是调整Java heap space(即堆内存)的大小,ava heap space区域中存放对象,GC会收集这块区域。tomcat

若是出现的异常类型是:OutOfMemoryError: Java heap space,那应该设置 SET JAVA_OPTS= -Xms64m -Xmx512m。eclipse

若是出现的异常类型是:OutOfMemoryError  PermGen space,那应该设置set JAVA_OPTS=-Xms128m -Xmx512m  -XX:PermSize=128M -XX:MaxPermSize=256mssh

常见的有两种设置方法:测试

若是在开发环境中启动tomcat,以eclipse为例:选择window->Preferences->MyEclipse-servers-Tomcat->JDK 在右侧框Optional Java  VM arguments中加入:-Xms128m -Xmx512m  -XX:PermSize=128M -XX:PermSize=256Mspa

若是独立启动tomcat,修改tomcat/bin/catalina.bat文件,查找set JAVA_OPTS,找到后把这一行修改成:设计

set JAVA_OPTS=-Xms128m -Xmx512m  -XX:PermSize=128M -XX:MaxPermSize=256M,设置的时候要注意:-Xms+X:PermSize不能大于系统支持的最大JVM的大小。具体大小根据本身内存大小调整吧。server