为什么需要进行三次Full GC来垃圾回收PermGen空间?

3
什么原因会导致需要三次连续的“Full GC”才能对perm gen进行垃圾回收呢?
第一次GC将堆大小从2.4GB降至761MB,但是对于perm gen的GC几乎没有起到实质性作用,尽管它似乎恢复了6K。
我们将忽略young generation的回收。
第二个Full GC对堆几乎没有产生任何作用,这是预期的,因为服务器在此时负载很轻。奇怪的是,它对于perm gen什么都没有做。
第三个Full GC最终将perm gen从其524MB的最大值降至141MB。
以下是未编辑的GC日志片段:
2012-12-07T19:46:40.731-0600: [Full GC [CMS: 2474402K->761372K(2804992K), 4.6386780 secs]     2606228K->761372K(3111680K), [CMS Perm : 524286K->524280K(524288K)], 4.6387670 secs] [Times: user=4.68 sys=0.00, real=4.63 secs] 
2012-12-07T19:46:45.374-0600: [GC [ParNew
Desired survivor size 17432576 bytes, new threshold 6 (max 6)
- age   1:      65976 bytes,      65976 total
: 1552K->8827K(306688K), 0.0199700 secs] 762925K->770200K(3111680K), 0.0200340 secs]  [Times: user=0.08 sys=0.00, real=0.02 secs] 
2012-12-07T19:46:45.395-0600: [Full GC [CMS: 761372K->752917K(2804992K), 3.7379280 secs]  770212K->752917K(3111680K), [CMS Perm : 524287K->524287K(524288K)], 3.7380180 secs] [Times: user=3.77 sys=0.00, real=3.74 secs] 
2012-12-07T19:46:49.135-0600: [Full GC [CMS: 752917K->693347K(2804992K), 3.2845870 secs] 752917K->693347K(3111680K), [CMS Perm : 524287K->141759K(524288K)], 3.2846780 secs] [Times: user=3.32 sys=0.00, real=3.29 secs] 

系统信息和GC标志:

Java 1.7.0_07, 64-Bit Server, Ubuntu 12.04 
-Xms3g -Xmx3g -XX:PermSize=512m -XX:MaxPermSize=512m
-XX:+UseConcMarkSweepGC 

编辑:我们有两个应用程序服务器; 第二个显示了略有不同的行为:只有两个完整的GC条目。
2012-12-07T20:36:31.097-0600: [Full GC [CMS: 2307424K->753901K(2804992K), 5.0783720 secs] 2394279K->753901K(3111680K), [CMS Perm : 524280K->524121K(524288K)], 5.0784780 secs] [Times: user=5.12 sys=0.00, real=5.08 secs] 
2012-12-07T20:36:36.178-0600: [Full GC [CMS: 753901K->695698K(2804992K), 3.4488560 secs] 755266K->695698K(3111680K), [CMS Perm : 524121K->140568K(524288K)], 3.4489690 secs] [Times: user=3.48 sys=0.00, real=3.45 secs] 

看起来年轻一代很重要。也许在我们特定的设置中需要进行两次连续的Full GC,没有其他垃圾回收(年轻一代GC)在其间用于垃圾回收Perm Gen。我已经深入研究了很多,但没有找到任何有关这种行为的讨论。

1个回答

0

堆和永久代的并发收集不会相互影响,这并不让我感到惊讶,特别是堆收集本身已经是一个复杂的操作;这就解释了为什么永久代只在第二次收集时被收集。虽然我主要是猜测。

了解更多有关永久代实际收集的细节可能会很有趣(卸载的类、字符串?)。-XX:+PrintGCDetails 可以帮助,也可以使用 -verbose:class。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接