最近在把在 tomcat 5.5 上开发的项目 deploy 到 JBoss 4.2 上时,在操作一段时间就会出现 java.lang.OutOfMemoryError: PermGen space,开始以为是代码中存在死循环的地方造成这样的问题,但是后来发现,出问题的地方都是随机的,并不是某一处造成这样的问题出现,怀疑是内存泄露,通过增大 heap 内存的方法来尝试,依然不行,但是同样的问题却并没有在 tomcat 中出现过,难道是 JBoss 的问题?
在网上做了一番搜索得到一些相关的内容。
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的时候。
改正方法,在 run.bat 中加入:-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
因为项目中引用了很多的 jar 包,而这些 jar 包中的 class 信息会被 JBoss 的 class loader 加载到 PermGen space 区域,在 JVM 默认的情况下,该部分空间的大小只有 4M,在 jar 包非常多的情况下,显然是不够用的,所以通过 -XX:MaxPermSize=256m 指定最大值后即可解决问题。
另外,如果 heap 内存不足出现 java.lang.OutOfMemoryError: Java heap space 时,可以通过 -Xmx512m 指定最大 heap 内存来解决这样的问题。
分享到:
相关推荐
OutOfMemoryError: PermGen space异常是由于 PermGen space 内存溢出引起的。解决方法是手动设置MaxPermSize大小。在Tomcat以bat方式启动时,需要修改TOMCAT_HOME/bin/catalina.sh文件,加入以下行:`JAVA_OPTS="-...
1. **PermGen Space(永久代)内存溢出**:当JVM的永久代空间不足时,会抛出`java.lang.OutOfMemoryError: PermGen space`异常。 2. **Heap Space(堆空间)内存溢出**:当JVM的堆空间不足时,会抛出`java.lang....
在JBoss部署过程中,可能会遇到`OutOfMemoryError: PermGen space`的错误。这主要是由于永久代(Permanent Generation space)内存不足导致的。在Java虚拟机(JVM)中,PermGen space用于存储类元数据信息,例如类的...
尤其是在Web服务器进行JSP预编译时,若WEBAPP下使用的第三方jar包数量超过了JVM默认大小(默认是4MB),则会产生OutOfMemoryError: PermGen space错误。解决此问题的方法是通过设置MaxPermSize参数,来手动增加Perm...
另外,JVM还有其他内存区域,如栈内存(`-Xss`)和持久代(PermGen space)。栈内存用于存储每个线程的局部变量,可以通过`-Xss`参数调整其大小,例如设置为`-Xss128k`,表示每个线程的栈大小为128KB。持久代是JVM...
内存溢出通常有两类:`PermGen space`(永久代溢出)和`Java heap space`(堆溢出)。前者可能是因为类加载过多或JVM版本问题,后者则可能是因为分配给堆的空间不足。合理设置JVM内存参数可以有效地避免这些问题。 ...