在perm gen被垃圾收集之前,需要连续三次“完全GC”,原因是什么?
第一个GC将堆从2.4 GC降至761mb,但未能实质上GC perm gen,尽管它似乎确实恢复了6K。
我们将忽略年轻一代的集合。
正如预期的那样,第二个完整的GC对堆的作用很小,因为服务器当时负载很轻。奇怪的是,它对perm gen没有任何作用。
第三个完整的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]
因此,看起来年轻一代意义重大。在我们的特定设置中,可能需要两个连续的完整GC,中间没有其他GC (年轻一代GC)来垃圾收集perm gen。我调查了很多,但我还没有找到任何关于这种行为的讨论。
转载请注明出处:http://www.jubohx.com/article/20230505/2240354.html