2

我正在尝试收集有关我们偶尔遇到的问题的信息,在运行几周后,应用程序变慢,工作正常,变慢,工作正常,变慢和正常工作之间的间隔越来越短。我的理论是,随着时间的推移,我们会更频繁地收集垃圾。另一个关键信息是我们偶尔会遇到 OOM PermGen 问题。

我启用了verbose:gc,现在在catalina.out 中看到GC 输出。但是,我想我需要根据此处的信息添加 PrintGCDetails 标志:

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

启用后一个标志将打印出有关“Tenured”内存集合的信息。问题是,是导致 PermGen 错误的内存,还是有什么不同?如果它不同,我如何记录将显示 PermGen 空间的信息?

编辑——不幸的是,我无法在这个环境中附加任何 jvm 监控工具。

编辑——我添加了上述配置选项,以及一个用于打印终身分布的选项,我得到了类似的东西

27.701: [GC 27.701: [ParNew
Desired survivor size 2162688 bytes, new threshold 4 (max 4)
- age   1:    1906560 bytes,    1906560 total
- age   2:       2064 bytes,    1908624 total
- age   3:       5064 bytes,    1913688 total
- age   4:     650368 bytes,    2564056 total
: 35684K->2678K(38336K), 0.0068580 secs] 224179K->191173K(1065664K), 0.0069700 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

ParNew 一代是 permgen 空间吗?

 (concurrent mode failure): 25387K->31940K(1027328K), 0.2983200 secs] 50714K->31940K(1065664K), [CMS Perm : 35273K->35139K(35392K)], 0.2985210 secs] [Times: user=0.30 sys=0.00, real=0.30 secs] 
 (concurrent mode failure): 25356K->31941K(1027328K), 0.3032690 secs] 50861K->31941K(1065664K), [CMS Perm : 35264K->35129K(35392K)], 0.3034800 secs] [Times: user=0.30 sys=0.00, real=0.31 secs]

失败困扰着我。

提前感谢

4

2 回答 2

4

Tenured 和 PermGen 不一样,不是。它们是相关的,但不是一回事。确切的细节取决于您使用的 JVM 中的实现,但是,从您链接的文档中:

“与终身代密切相关的第三代是永久代。永久代的特殊之处在于它保存了虚拟机所需的数据来描述在 Java 语言级别上不具有等价性的对象。例如描述类的对象和方法存储在永久代中。”

内部字符串和类详细信息等通常存储在 PERM 中,而长期存在的 Java 对象是 TENURED。

这是一篇不错的文章,解释了 PermGen(以及如何调整它):http: //blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

于 2010-12-02T16:03:30.227 回答
1

您是否在实习任何字符串或加载任何类?

我吃掉了 permgen 空间的两件事是当你实习不应该的字符串时(因此使各种 ungarbagecollectable 字符串徘徊),以及由加载新类引起的旧类定义(通常来自 Tomcat 重新部署,之后十几个这可能发生在我们身上)。

我似乎记得 Tomcat 6 在重新部署问题上做得更好,而 7 应该可以修复它,但这不是我的想法。

您是否使用任何外部库或本机代码库?如果他们泄漏的资源计入 permgen(只是猜测),我不会感到惊讶。

于 2010-12-02T16:23:00.837 回答