Java:“终身”记忆与permgen一样吗?

时间:2010-12-02 15:41:58

标签: java tomcat logging jvm permgen

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

我把启用的详细信息: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]

失败困扰着我。

提前完成

2 个答案:

答案 0 :(得分:4)

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

“与终身代密切相关的第三代是永久代。永久代是特殊的,因为它包含虚拟机所需的数据,用于描述在Java语言级别没有等价的对象。例如,描述类和方法的对象存储在永久代中。“

Interned Strings和类详细信息等通常存储在PERM中,而长期存在的Java对象则是TENURED。

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

答案 1 :(得分:1)

您是在实习任何字符串还是加载任何课程?

我吃掉permgen空间的两件事就是当你实习的字符串不应该(因此使各种各样的无法收集的字符串变得很乱),以及在新类中加载引起的旧类定义(通常来自Tomcat)重新部署,十几个左右后,这可能发生在我们身上)。

我似乎记得Tomcat 6在重新部署问题上表现更好,并且7应该修复它,但这不是我的首要任务。

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