2013-07-18 53 views
2

我在我們的產品環境中看到一些異常行爲,導致運行Tomcat的服務器上出現高線程數。堆棧大小10,092,544K在新一代和終身職位之間劃分爲2,752,512K + 7,340,032K = 10,092,544K。Java - 完整的GC(垃圾收集器)在很短的時間間隔內發生,導致性能下降

我很困惑,爲什麼GC在堆棧中有足夠的可用內存(新舊兩種版本)時會多次運行本身(完全GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen:2748534K- > 2748529K(7340032K)])

正如你可以看到0K-> 0K爲年輕的gen和.27G - > .27G爲舊gen意味着幾乎沒有任何對象獲得gc'd和有這麼多的內存可用。 (堆大小是10G)。

由於完整GC在短時間間隔內運行多次,它導致性能降低,因此應用程序無法處理傳入的用戶請求,因此無法處理服務器上的高線程,最終我們必須重新啓動服務器才能出現這種情況。

你能解釋一下這裏發生了什麼。

這裏輸出在gc.log上。


。 。

更多...... 。 。

7月18日14時52分三十八秒fwprodcontent03 gc.log:3172.122:[GC [PSYoungGen: 0K-> 0K(2752512K)] 2750855K-> 2750855K(10092544K),0.0515920秒] [時間:用戶= 0.32 SYS = 0.01,真= 0.06秒]

7月18日14時52分42秒fwprodcontent03 gc.log:3172.174:[全GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen: 2750855K- > 2749937K(7340032K)] 2750855K-> 2749937K(10092544K) [PSPermGen:262143K-> 262115K(262144K)],4.1571260秒] [時間: 用戶= 44.29 SYS = 0.06,真= 4.15秒]

7月18日14點52分42秒fwprodcontent03 gc.log:3176.361:[GC [PSYoungGen: 9071K-> 1280K(2752512K)] 2759008K-> 2751217K(10092544K),0.0989600秒] [時間:用戶= 0.64 SYS = 0.01,實= 0.10秒]

7月18日14時52分46秒fwprodcontent03 gc.log:3176.461:[全GC [PSYoungGen:1280K-> 0K(2752512K)] [ParOldGen: 2749937K-> 2748847K(7340032K )] 2751217K-> 2748847K(10092544K) [PSPermGen:262143K-> 262121K(262144K)],3.1331910秒] [添ES: 用戶= 31.25 SYS = 0.01,真= 3.14秒]

14年7月18日: 52:46 fwprodcontent03 gc.log:3179.616:[GC [PSYoun gGen: 2161K-> 288K(2752512K)] 2751008K-> 2749135K(10092544K),0.0688890秒] [時間:用戶= 0.42 SYS = 0.02,真= 0.07秒]

7月18日14時52分49秒fwprodcontent03 gc.log:3179.686:[全GC [PSYoungGen:288K-> 0K(2752512K)] [ParOldGen: 2748847K-> 2748930K(7340032K)] 2749135K-> 2748930K(10092544K) [PSPermGen:262143K-> 262143K(262144K )],3.2369940秒] [時間s: user = 32.23 sys = 0.02,real = 3。23秒]

7月18日14點52分49秒fwprodcontent03 gc.log:3182.923:[GC [PSYoungGen: 0K-> 0K(2752512K)] 2748930K-> 2748930K(10092544K),0.0607190秒] [時間:用戶= 0.39 SYS = 0.01,真= 0.06秒]

7月18日14時52分57秒fwprodcontent03 gc.log:3182.984:[全GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen: 2748930K - > 2748528K(7340032K)] 2748930K-> 2748528K(10092544K) [PSPermGen:262143K-> 262141K(262144K)],8.5377730秒] [時間: 用戶= 98.30 SYS = 0.57,真= 8.54秒]

Jul 18 14:52:58 fwprodcontent03 gc.log:3191.533:[GC [PSYoungGen: 202K-> 128K(2752512K)] 2748731K-> 2748656K(10092544K),0.1088430 secs] [Times:user = 0.67 sys = 0.00 ,實際= 0.11秒]

7月18日14時53分02秒fwprodcontent03 gc.log:3191.642:[全GC [PSYoungGen:128K-> 0K(2752512K)] [ParOldGen: 2748528K-> 2748534K(7340032K) ] 2748656K-> 2748534K(10092544K) [PSPermGen:262143K-> 262143K(262144K)],3.1761780秒] [時間S: 用戶= 31.11 SYS = 0.02,真= 3.18秒]

7月18日14點53分:02 fwprodcontent03 gc.log:3194.820:[GC [PSYoungGen: 0K-> 0K(275251 2K)] 2748534K-> 2748534K(10092544K),0.0589010秒] [時間:用戶= 0.38 SYS = 0.01,真= 0.06秒]

7月18日14時53分05秒fwprodcontent03 gc.log:3194.879:全部GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen: 2748534K-> 2748529K(7340032K)] 2748534K-> 2748529K(10092544K) [PSPermGen:262143K-> 262143K(262144K)],3.0554520secs] [Times : user = 30.72 sys = 0.03,real = 3.05 secs]。 。更多.....


在此先感謝。

+0

您可以選擇使用併發標記掃描GC嗎? – fge

+0

@fge - 使用CMS不太可能減少完整GC的數量。如果有的話,它可能會讓事情變得更糟。 –

回答

10

你看過你的gc統計數據嗎?

[Full GC [PSYoungGen: 0K->0K(2752512K)] [ParOldGen: 2748534K->2748529K(7340032K)] 2748534K->2748529K(10092544K) [PSPermGen: 262143K->262143K(262144K)], 3.0554520 secs] 

重要的部分是[PSPermGen:262143K-> 262143K(262144K)]。您PermGenSpace已耗盡,因此完成了一次GC。因此,爲了解決這個問題,可以進一步增加PermGenSpace(可能通過減少堆空間)。

也不要經常部署到生產系統上,而不重新啓動Tomcat,因爲這會耗盡您的PermGenSpace非常快。

+0

+1 - 證據非常清楚。 –

+0

謝謝Uwe。我忽略了PermGen參數。感謝幫助。這回答了我的問題。 –