【问题标题】:PermGen Space Error永久代空间错误
【发布时间】:2012-02-20 10:33:20
【问题描述】:

我已经部署了一个非常大的应用程序,当我尝试启动服务器时,它给出了

“内存不足错误”:PermGen 空间

由于我使用的是 tomcat 5.5,我在 bin 文件夹中没有“setenv.bat”。所以我设置了“catalina.bat”中的 JAVA_OPTS。我给了赞。

set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m -XX:NewSize=192m -XX:MaxNewSize=384m -Djava.awt.headless=true -Dhttp.agent=Sakai -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dsun.lang.ClassLoader.allowArraySyntax=true

但问题仍然存在。在上面的 sn-p 中我有什么需要指定或需要更改的,以便我的服务器能够正常运行。

谢谢, 杰亚。

【问题讨论】:

  • 首先,将 VisualVM 附加到此进程,并观察堆和非堆内存如何增长。你会知道 512Mo 是否确实被允许进入你的 Tomcat,然后你必须找出原因......
  • 我也有类似的问题。有什么简单的方法可以使用 jvisualvm 或其他工具查看类加载器泄漏?

标签: java web-applications tomcat webserver


【解决方案1】:

如果您使用的是 Sun JVM,最好的办法是下载 Visual VM 1.3.3 并安装所有插件。它会让你看到线程、内存等。

首先启动 Visual VM,然后通过在 Visual VM 中选择其 JRE 来启动 Tomcat。届时您将能够看到发生了什么。

你在那里有很多记忆。你必须在你的代码中做一些事情才能做到这一点。

【讨论】:

    【解决方案2】:

    我建议您使用 Java 的 HotSpot 发行版中包含的工具 JVisualVM 来检查您的 PermGen 空间大小并查看 GC stat

    【讨论】:

      【解决方案3】:

      尝试将 MaxPermSize 与 -XX:MaxPermSize=1024m 加倍。如果问题仍然存在,那么还可以尝试使用 -XX:+HeapDumpOnOutOfMemoryError 标志在 OutOfMemoryError 上启用堆转储,然后使用 Eclipse Memory Analyser 打开内存转储以找出占用所有内存的原因。内存转储需要很长时间,所以请耐心等待。可能是您有需要堵塞的泄漏。例如,无休止地生成类,或者大量字符串被intern'ed。

      我曾经有一次内存泄漏,因为我从动态生成的字符串创建了 Log4J 记录器,结果发现 Log4J 将所有这些字符串都留存了下来。这意味着我们的程序在运行 3 天后在 PermGen 空间中因 OOM 而崩溃。不好。

      【讨论】:

        【解决方案4】:

        由于您正在部署 Sakai,这些 JAVA_OPTS 应该是您进行小型安装所需的全部,因为它们是我多年来一直使用的:

        -server -XX:+UseParallelGC -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dsun.lang .ClassLoader.allowArraySyntax=true -Dhttp.agent=Sakai

        请注意,您希望针对特定问题增加 PermSize 设置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-18
          • 2011-03-01
          • 2011-10-11
          • 1970-01-01
          • 2011-04-17
          • 2013-03-11
          • 1970-01-01
          相关资源
          最近更新 更多