Tomcat PermGen Space上的Spring MVC不断增加

时间:2014-05-29 22:21:05

标签: java tomcat spring-mvc memory-leaks permgen

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

我拿了三个堆转储并运行“ClassLoader Loaded Classes Histo”分析并找到了这些结果:

9:44 pm转储:

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

9:55 pm转储:

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”并没有给我太多信息,因为我被埋没在这些信息中: enter image description here

任何人都有分析这类问题的经验吗?

使用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 args:

-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

1 个答案:

答案 0 :(得分:4)

  • PermGen基本上是应该保存系统对象的堆,应用程序对象的堆是常规堆空间..

一般问题是每个类都持有对Class定义的引用以及创建他的每个类加载器,并且每个类加载器都包含对他创建的所有类的引用。所以当垃圾收集器移动所有对象时,因为它们总是引用它们继续增长...并且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

希望更有帮助