Permgen和Garbage收集Java,打破permgen神话

时间:2014-02-19 20:12:13

标签: java garbage-collection permgen

我知道在JVM中,permgen区域用于存储类定义。在我的Tomcat中,我看到permgen的当前内存使用量接近100MB,它似乎只是随着时间的推移而增长,即使没有人在Tomcat中使用这些应用程序 我的问题是:

permgen永远不会被垃圾收集,我的意思是那里使用的内存不断增长和增长吗?

当permgem被垃圾收集?

什么意思是“CMSPermGenSweepingEnabled”和“CMSClassUnloadingEnabled”?

我的permgem最大大小为256,我不希望下周出现OutMemoryException。

请仅提供准确且有记录的答案。

我使用Tomcat 7,Java 7,我使用很多并行部署tecnique而且我没有使用,每周重新部署几次。 我从不使用Strings的intern()方法

1 个答案:

答案 0 :(得分:2)

实际上,Permgen永远不会收集垃圾。它包含由应用程序加载的类,并在classloaders get garbage collected时收集,通常在重新部署方案中。

您可以使用这些JVM标志来查看何时从permgen加载和卸载类:

-XX:+TraceClassLoading -XX:+TraceClassUnloading

要查看要加载的类,请使用此标志:

-verbose:class

如果应用程序是反射密集型的,那也可能是一个原因,请查看此answer,尝试使用visualvm来获取堆转储,查找名为lie {{1}的类}。

对于垃圾收集标志,请参阅此answer,但修复permgen泄漏的最佳方法是查看正在创建的类以及使用某些工具/日志的原因。