1

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

我在线阅读了此错误并了解为什么会发生此异常。我按照教程来增加我的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 上进行内存测量?

4

6 回答 6

1

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

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

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

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

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

于 2012-07-02T15:28:07.023 回答
1

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

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

于 2012-07-02T15:30:08.053 回答
1

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

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

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

于 2012-07-02T15:30:49.707 回答
0

内存不足的发生是因为您的JVM 没有分配足够的内存

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

于 2012-07-02T15:27:47.713 回答
0

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

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

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

于 2012-07-02T15:32:30.103 回答
0

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

于 2012-07-02T15:58:15.407 回答