我知道在JVM中,permgen区域用于存储类定义。在我的Tomcat中,我看到permgen的当前内存使用量接近100MB,它似乎只是随着时间的推移而增长,即使没有人使用Tomcat中的应用程序,我的问题是:
permgen从来不会被垃圾回收,我的意思是那里使用的内存一直在增长,这是真的吗?
当permgem被垃圾回收的时候?
"CMSPermGenSweepingEnabled“和"CMSClassUnloadingEnabled”是什么意思?
我的permgem的最大尺寸是256,我不想在下周有一个OutMemoryException。
请只提供准确和有记录的答案。
我使用Tomcat 7,Java 7,我使用了很多并行部署技术,我每周都会取消部署,重新部署几次。我从不使用字符串的intern()方法
发布于 2014-02-20 04:34:20
实际上,Permgen从来没有被垃圾回收的说法是不正确的。它包含由应用程序加载的类,并在classloaders get garbage collected时收集,通常是在重新部署场景中。
您可以使用这些JVM标志来查看何时将类加载到permgen或从permgen卸载:
-XX:+TraceClassLoading -XX:+TraceClassUnloading要查看加载了哪些类,请使用此标志:
-verbose:class如果应用程序是反射密集型的,这也可能是一个原因,看看这个answer,尝试使用visualvm进行堆转储,查找名为lie sun.reflect.GeneratedMethodAccessor11的类。
因为垃圾收集标志引用这个answer,但是修复permgen泄漏的最好方法是查看正在创建哪些类,以及为什么要使用一些工具/日志。
https://stackoverflow.com/questions/21891366
复制相似问题