Tomcat PermGen 上的 Spring MVC 空间不断增加

Posted

技术标签:

【中文标题】Tomcat PermGen 上的 Spring MVC 空间不断增加【英文标题】:Spring MVC on Tomcat PermGen Space increase constantly 【发布时间】:2014-05-29 22:21:04 【问题描述】:

我有一个基于 SpringMVC 3.2 构建并在 Tomcat 上运行的 Web 应用程序。我使用 VisualVM 监控 permgen 空间,发现它不断增加:

我取了三个堆转储并运行“ClassLoader Loaded Classes Histo”分析,发现这些结果:

晚上 9:44 转储:

loader:org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader#1,
count:3285

晚上 9:55 转储:

loader:org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader#1,
count:3286

早上 7:40 转储:

loader:org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader#1,
count:3855

我的应用程序在此期间非常安静。然而,看起来加载的类的数量在不断增加。我想了解这些堆转储中新加载了哪些类。运行“ClassLoader Loaded Classes”并没有给我太多信息,因为我沉浸在这些信息中:

谁有分析这类问题的经验?

更新 JVM 信息

JVM: Java HotSpot(TM) 64-Bit Server VM (20.45-b01, mixed mode)
Java: version 1.6.0_45, vendor Sun Microsystems Inc.

JVM 参数:

-Dvisualvm.id=4226015013703
-Xdebug
-Xrunjdwp:transport=dt_shmem,address=javadebug,suspend=y,server=n
-Dvisualvm.id=4214057282541
-Denv=dev-no-mas
-Dorg.slf4j.simpleLogger.defaultLogLevel=debug
-Dssgateway.disabled=true
-Dcom.sun.management.jmxremote=
-Dcom.sun.management.jmxremote.port=1299
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=127.0.0.1
-Djava.util.logging.config.file=C:\Users\luog.IKARI\.IntelliJIdea13\system\tomcat\Unnamed_rythm_2\conf\logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.endorsed.dirs=C:\l\j\apache-tomcat-6.0.29\endorsed
-Dcatalina.base=C:\Users\luog.IKARI\.IntelliJIdea13\system\tomcat\Unnamed_rythm_2
-Dcatalina.home=C:\l\j\apache-tomcat-6.0.29
-Djava.io.tmpdir=C:\l\j\apache-tomcat-6.0.29\temp

【问题讨论】:

您是否尝试开启 perm gen gc - XX:+CMSClassUnloadingEnabled 你用的是什么JVM? JVM信息已添加 @BoristheSpider,根据这个 SO:***.com/questions/3717937/… 你在使用 Hibernate 吗?根据我的经验,这是导致 permgen 内存泄漏的常见嫌疑人。 【参考方案1】: PermGen 基本上是应该保存系统对象的堆,应用程序对象的堆是常规堆空间..

一般的问题是每个类都持有对类定义和创建他的每个类加载器的引用,并且每个类加载器都持有对他创建的所有类的引用。因此,当垃圾收集器在所有对象上移动时,因为它们总是引用它们,它们会不断增长......并且 GC 不会释放它们。在他们使用的示例中:

$JAVA_HOME/bin/jvisualvm

哪个工具可以帮助你,解决方案很长,链接提供图像帮助。这个工具可以帮助你找到导致泄漏的类加载器(类加载器适用于服务器下的每个应用程序,以便 ley多个应用程序在同一台服务器下一起运行)

然后你会找到问题类。一旦你知道是什么导致了问题,你就可以解决它。

此链接将解释为什么会发生这种情况以及如何处理:

cdivilly.wordpress.com/2012/04/23/permgen-memory-leak/

您可以阅读这篇精彩的演示文稿。从第 11 页您可以看到如何识别泄漏和解决方案。非常非常有用http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

希望对你有帮助

【讨论】:

以上是关于Tomcat PermGen 上的 Spring MVC 空间不断增加的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.OutOfMemoryError: PermGen 空间

tomcat启动出现PermGen space错误

如何在 Tomcat 中部署之前监控 PermGen 空间使用情况

tomcat 开启时,或者访问网页后PermGen space错误解决方法 java.lang.OutOfMemoryError: PermGen space

如何清除tomcat中的PermGen空间错误

tomcat内存溢出之PermGen space