【问题标题】:Error java.lang.OutOfMemoryError: PermGen space [duplicate]错误 java.lang.OutOfMemoryError:PermGen 空间 [重复]
【发布时间】:2014-06-22 16:15:23
【问题描述】:

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

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

【问题讨论】:

  • 这种类型的永久空间错误可以通过重新启动服务器来解决。通过重新启动服务器进行检查。
  • 当我的项目在实时服务器上运行时出现此错误
  • 如果回答有帮助,最好接受。这让新用户更容易知道它到底是什么。

标签: java servlets netbeans


【解决方案1】:

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

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

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

    从 Java 8 开始,permgen 空间和这个设置都没有了。用户不会出现此错误。

参考资料:

【讨论】:

    【解决方案2】:

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

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

    如果问题是由于类数量过多导致 PermGen Space 不足,则可以通过添加 –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

    谢谢。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 2012-08-05
        • 2014-04-17
        • 2011-03-07
        • 2015-03-06
        • 2013-09-01
        • 2011-04-14
        • 2012-10-21
        • 2011-07-28
        相关资源
        最近更新 更多