Error java.lang.OutOfMemoryError: PermGen space



在我的项目中,我得到如下错误:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path       [/ExamSy                                                                                       stem] threw exception [javax.servlet.ServletException: java.lang.OutOfMemoryErro                                                                      r: PermGen space] with root cause
java.lang.OutOfMemoryError: PermGen space
May 06, 2014 2:44:18 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive /home/anything/public_html/ExamSystemold       .war
May 06, 2014 2:47:08 AM org.apache.tomcat.util.digester.Digester startElement
SEVERE: Begin event threw error
java.lang.OutOfMemoryError: PermGen spaceException in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]"  jav                                                                                            a.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" jav                                                                                            a.lang.OutOfMemoryError: PermGen space

一旦你遇到PermGen Space问题,你需要找出这个问题是由于大量的类你的应用程序正在加载还是由于内存泄漏。如果是由于大量的类,您可以微调以增加分配的PermGen空间,这将解决这个问题。

第一个原因可能是你的应用程序或你的服务器有太多的类,现有的PermGen空间无法容纳所有的类。* * * * - xx: MaxPermSize = XXXM

如果问题是由于类太多导致的PermGen空间不足,可以通过添加-XX:MaxPermSize=XXm参数来增加PermGen空间。这将增加存储类的可用空间,并且应该-XX:MaxPermSize=256m- xx: + CMSClassUnloadingEnabled

该参数表示使用CMS GC时是否启用类卸载。默认设置为false,因此要启用此功能,您需要在java选项中显式设置以下选项。

- xx: + CMSClassUnloadingEnabled

如果你启用CMSClassUnloadingEnabled, GC也会清除PermGen,并删除不再使用的类。这个选项只有在使用下面的选项启用UseConcMarkSweepGC时才会起作用。

- xx: + UseConcMarkSweepGC- xx: + CMSPermGenSweepingEnabled

是否开启扫描perm gen功能。默认情况下,此参数是禁用的,因此需要显式设置此参数以微调PermGen问题。此选项在Java 6中被删除,因此如果您使用Java 6或以上版本,则需要使用-XX:+CMSClassUnloadingEnabled。因此,为解决PermGen Space内存问题而添加的选项将看起来像

-XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC XX:+CMSClassUnloadingEnabled内存泄漏

第二个原因是内存泄漏。

在Java中,类通常是永久的。因此,一旦类被加载,即使应用程序在服务器上停止,它们也会留在内存中。像cglib这样的动态类生成库使用了大量的PermGen空间,因为它们动态地创建了大量的类。大量使用代理类,这些类是在运行时合成创建的。当一个类定义可以被多个实例重用时,创建新的代理类很容易。

Spring和Hibernate经常使用某些类的代理。这样的代理类由类加载器加载。生成的类定义永远不会被丢弃,从而导致永久堆空间很快被填满。

对于PermGen空间问题,您需要确定泄漏的原因并修复它。增加PermGen空间不会有帮助,它只会延迟问题,因为在某些时候PermGen空间仍然会被填满。

你可以通过这个链接:http://wiki.apache.org/tomcat/MemoryLeakProtection

谢谢。

当您有PermGen空间OutOfMemoryError时,您必须检查值XX:MaxPermSize=XXXM。

永久空间是存储VM使用的类、方法、内部化字符串和类似对象的地方,永远不会被释放。

  1. 通常对于web应用来说,由于jsp动态类生成和热重新部署,内存使用将随着同一个类的多个副本而增加。
  2. Max Heap Size (-Xmx)和MaxPermSize应该考虑到应用程序类和实例需要多少内存,服务器或机器的总内存以及应用程序所需的内存来设置。在最大堆大小(-Xmx)和MaxPermSize之间应该有安全空间,以便应用程序执行。
  3. 检查内存泄漏

    从Java 8开始,permgen空间和这个设置都消失了。

引用:

  • http://www.oracle.com/technetwork/java/javase/tech/vmoptions jsp - 140102. - html
  • http://www.oracle.com/technetwork/java/javase/gc -优化- 6 - 140523. - html
  • -XX:MaxPermSize做什么?

在tomcat ->启动配置->参数中设置-Xms1024M -Xmx4096M -XX:MaxPermSize=4096M,然后就可以开始了。上面提到的数字只是举例,你可以使用最适合你需要的数字

相关内容

  • 没有找到相关文章

最新更新