【问题标题】:Permgen and Garbage collection Java, Busting permgen mythsPermgen 和垃圾收集 Java,打破 permgen 神话
【发布时间】:2014-03-20 10:12:54
【问题描述】:

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

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

permgem 何时被垃圾回收?

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

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

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

我使用 Tomcat 7、Java 7,我使用了很多并行部署技术,我每周进行几次取消部署、重新部署。 我从不使用Strings的方法intern()

【问题讨论】:

  • 你用的是什么版本的tomcat?
  • 可能值得检查列出的内容in this document
  • 我也曾经遇到过永久泄漏。我在使用 xpath 查询 Java 应用程序中的 XML 对象时。文档构建器在将 XML 解析到 permagen 时添加了它创建的类。每次更改时,它都会解析此 XML。泄漏缓慢,但确实会引起问题。
  • 应用程序是否经常{un,re}部署?
  • 你是否内化了太多的 String 对象?

标签: java garbage-collection permgen


【解决方案1】:

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

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

-XX:+TraceClassLoading -XX:+TraceClassUnloading

要查看正在加载哪些类,请使用此标志:

-verbose:class

如果应用程序是反射密集型的,这也可能是一个原因,请查看此answer,尝试使用visualvm 进行堆转储并查找名为 lie sun.reflect.GeneratedMethodAccessor11 的类。

有关垃圾回收标志,请参阅此answer,但修复 permgen 泄漏的最佳方法是查看正在创建哪些类以及为什么使用一些工具/日志。

【讨论】:

  • 应该注意的是,根据您询问的对象以及您所谈论的 JVM 版本,“permgen”可能包括在启动时分配一次并且不可能被收集的内容。根据 JVM/收集器的版本,这可能与“permgen”中的类对象一起被抛出,或者可能在物理或“道德”上单独处理。
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 2011-02-18
  • 2023-04-03
  • 2015-05-01
  • 2012-11-26
  • 2013-06-02
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多