【问题标题】:java.lang.OutOfMemory:PermGen exception in Apache tomcatApache tomcat 中的 java.lang.OutOfMemory:PermGen 异常
【发布时间】:2012-07-03 00:48:17
【问题描述】:

几天前,我注意到当我的 Java 网站在 Tomcat 下运行时,我偶尔会看到 java.lang.OutOfMemory: PermGen 异常。

我在网上阅读了有关此错误的信息,并了解为什么会发生此异常。我按照教程增加了我的MaxPermSize,并由catalina.sh 编辑以包含以下内容:

    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
    -server -Xms1536m -Xmx1536m
    -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
    -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

不过,我想进一步了解我的 PermGen 能力:

  1. 谁能告诉我如何理解我的服务器功能以提供适当的新大小?

  2. 此外,有谁知道我如何在 Apache tomcat 上进行内存测量?

【问题讨论】:

标签: java apache


【解决方案1】:

PermGen 是不由垃圾收集器管理的内存空间。它包含加载的类、它们的方法、静态、字符串等......

使用 1536Mo 的 Xmx,您可以尝试将 MaxPermSize 设置为 384M。 如果该值太高,则 JVM 将无法启动,因此很容易找到最大大小。

但真正的问题是为什么你的 PermGen 这么满。 你加载了很多类吗?

【讨论】:

  • 是的,我加载了很多类。它的项目很大,而且我不是经验丰富的 Java 开发人员,所以我处理错了
  • 好的,它解释了你的问题。所以试着放更多的 Xmx 和更多的 MaxPermGenSize。还要确保为非开发服务器禁用 Tomcat 中的热重载。
  • 也许,添加 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  • 你说的“禁用非开发服务器在Tomcat中的热重载”是什么意思?
  • 热部署(将war文件放入webapps文件夹时重新部署webapp)已知在大量重新部署后会出现问题。好的过程是禁用此功能并通过停止服务器、放置 war 文件并重新启动 Tomcat 服务器来部署应用程序。您可以在 web.xml 中使用此参数阻止 Tomcat 重新部署您的 webapp:autoDeploy="false"
【解决方案2】:

这是一个普遍的问题,没有好的解决办法。

当您对正在运行的 Tomcat 实例进行热重新部署时,存储泄漏通常会导致 Permgen 问题。它通常是在某些东西保留对某个对象的引用时引起的,该对象是您重新部署的类之一的实例。这会导致旧的类加载器和它加载的所有类泄漏......

有三种方法可以解决这个问题:

  • 追踪并修复 Permgen 内存泄漏。
  • 定期重启 Tomcat。
  • 不要进行热重新部署。

增加 Permgen 并不能解决问题。它只是把它推迟......这样你的 Tomcat 就不会经常死了。

【讨论】:

  • +1 @Stephen C 值得注意的是,OP 可能有一个包含数千个类的应用程序,由于 Permagen 问题,初始启动可能会失败,而不是类加载器泄漏的产物。在这种情况下,增加 PermaGen 将解决手头的问题,但如果存在泄漏并且正在进行热重新部署,则不会。
【解决方案3】:

您可以尝试使用 JConsole 来监控内存使用情况:

http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

【讨论】:

    【解决方案4】:

    内存不足是因为您的JVM doesnt have enough memory allocated to it

    为了更好地了解正在发生的事情,尝试使用探查器可能是有意义的。我以前用过the lambda probeNew Relic(现在免费赠送一件衬衫试穿),但还有很多其他的。

    【讨论】:

      【解决方案5】:

      为了跟踪垃圾收集器的性能并观察堆大小,我建议打开 GC 日志记录。

      -Xloggc: -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

      这将生成日志文件,您将能够获得更适合调整堆大小的设置。

      【讨论】:

        【解决方案6】:

        1) PermGen 存储类定义等元数据。因此它的大小与应用程序的大小直接相关。主要是班级的数量和班级的规模。要调整和监控 permgen 的大小,您可以使用随 JDK 一起分发的可视化 vm。它位于 bin 目录中,是非常强大的应用程序。 2)您可以使用Visual VM来监控JVM的每个内存区域。您甚至可以在单个班级级别进行监控。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-19
          • 2017-12-25
          • 2015-10-07
          • 2016-08-20
          • 2016-01-14
          • 1970-01-01
          • 1970-01-01
          • 2015-02-25
          相关资源
          最近更新 更多