Java GC:PSYoungGen在完全GC后增长4 GB

Java GC:PSYoungGen在完全GC后增长4 GB,java,garbage-collection,jvm,jdk1.6,Java,Garbage Collection,Jvm,Jdk1.6,我正在运行一个应用服务器,它使用了相当多的内存(有相当多的用户)。它运行在一个18GB的EC2实例上 我将这些GC参数传递给VM: -server -XX:GCTimeRatio=19 -Xmx12g -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 服务器可以正常工作一段时间(正如您在没有并发GC的情况下所期望的那样),但几天后,它突然使堆大量增加,并将我们带入交换,这破坏了服务器性能,需要重新启动: 217408.525: [Full GC [PSYou

我正在运行一个应用服务器,它使用了相当多的内存(有相当多的用户)。它运行在一个18GB的EC2实例上

我将这些GC参数传递给VM:

-server -XX:GCTimeRatio=19 -Xmx12g -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
服务器可以正常工作一段时间(正如您在没有并发GC的情况下所期望的那样),但几天后,它突然使堆大量增加,并将我们带入交换,这破坏了服务器性能,需要重新启动:

217408.525: [Full GC [PSYoungGen: 12935K->0K(530944K)] [PSOldGen: 5668446K->4551217K(5431168K)] 5681382K->4551217K(5962112K) [PSPermGen: 50534K->50480K(50816K)], 11.8155060 secs] [Times: user=9.73 sys=2.08, real=11.81 secs] 
217963.521: [Full GC [PSYoungGen: 13247K->0K(635776K)] [PSOldGen: 5422640K->4884067K(5741120K)] 5435887K->4884067K(6376896K) [PSPermGen: 50489K->50489K(50816K)], 8.4219030 secs] [Times: user=8.38 sys=0.05, real=8.43 secs] 
218452.573: [Full GC [PSYoungGen: 20879K->0K(877504K)] [PSOldGen: 5720236K->4873397K(5788544K)] 5741115K->4873397K(6666048K) [PSPermGen: 50502K->50502K(50816K)], 10.9450630 secs] [Times: user=9.13 sys=1.84, real=10.95 secs]
219061.305: [Full GC [PSYoungGen: 73587K->0K(4073600K)] [PSOldGen: 5790501K->5022476K(6031040K)] 5864088K->5022476K(10104640K) [PSPermGen: 50518K->50518K(50816K)], 11.1695740 secs] [Times: user=8.80 sys=1.81, real=11.17 secs] 
最后一行似乎很不协调。为什么PS young gen堆会突然增长到4GB

在Ubuntu上运行此VM:

java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01, mixed mode)
编辑:今晚又发生了一次

101017.205: [Full GC [PSYoungGen: 73185K->0K(4095616K)] [PSOldGen: 6373373K->5318013K(6638016K)] 6446559K->5318013K(10733632K) [PSPermGen: 46183K->46183K(46272K)], 221.1337460 secs] [Times: user=8.13 sys=1.26, real=221.08 secs]
编辑:这是我们生产服务器上最近3小时的图表。

尝试设置
-XX:NewRatio:2
(可能是3)根据旧的in比率检查新的in,或者使用
-XX:MaxNewSize
限制它?请对我上面的问题进行评论,我问你为什么要进行交换?

在最大堆和perm不超过主内存的情况下,你到底是如何进行交换的?其他程序正在运行?不确定。。上图显示,java占用了15g的内存,其他所有的都是标准的系统进程,占用了几个meg。请参阅我编辑的文章,其中再次发生了这种情况,但完成了GC(耗时221秒),额外的GB可能是线程。我们有很多线程。2012年有更新吗?你有决心吗?没有。但是我现在使用并发GC,它工作得更好。还使用Netty避免每个连接创建一个线程。(-XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode-XX:+CMSIncrementalPacing-XX:+UseCompressedOops-Xss128k等)