2010-09-30 41 views
2

我正在運行使用相當多內存的應用程序服務器(有相當多的用戶)。它運行在18 GB EC2實例上。Java GC:PSYoungGen在Full GC後增長4 GB

我通過這些參數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爲什麼會突然增長到4 GB?

在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小時的圖形。 alt text

+0

隨着你的最大堆和燙髮不超過你的主要記憶,你究竟是如何最終達成交換?其他proggies運行? – Xailor 2010-10-01 15:16:25

+0

不知道..頂部顯示,Java佔用了15g居民,其他一切都是標準的系統進程,佔用了幾兆。看到我編輯的帖子再次發生,但完成了GC(花了221秒) – sehugg 2010-10-02 00:24:05

+0

額外的GB可能是線程。我們有很多線程。 – sehugg 2010-10-02 00:51:12

回答

1

嘗試設置-XX:NewRatio:2(也許3)保持新的檢查與舊的比例,或限制它與-XX:MaxNewSize?請評論我上面的問題,爲什麼你打了交換?