2017-04-11 50 views
0

我們檢查了我們的Java應用程序的gc日誌,發現即使堆中有足夠的空間,整個gc也一次又一次地運行。即使堆中有足夠的空間,整個垃圾收集器也會一次又一次地運行

有些人可以幫助我們瞭解我們這個原因是什麼?當堆足夠空閒時,可能會導致調用Full GC一遍又一遍地運行。

添加樣品GC日誌

157864.497: [GC [PSYoungGen: 54016K->2480K(54592K)] 376436K->327940K(385792K), 0.0237780 secs] [Times: user=0.07 sys=0.01, real=0.03 secs] 
157864.520: [Full GC [PSYoungGen: 2480K->0K(54592K)] [PSOldGen: 325460K->89870K(303168K)] 327940K->89870K(357760K) [PSPermGen: 18527K->18527K(18816K)], 0.7729250 secs] [Times: user=0.75 sys=0.00, real=0.77 secs] 
157865.446: [GC [PSYoungGen: 50944K->1776K(54528K)] 140814K->91646K(357696K), 0.0103750 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
+0

以-XX:+ PrintGCCause運行。它未啓用的事實表明您使用的是Java 7,您可能應該升級,因爲它已編輯了描述,因此它已到達EOL – the8472

回答

0

能爲您提供進一步specifiy你的問題?請詳細介紹如您使用的是什麼語言,您的問題或問題是什麼,以及是否存在您可以顯示的任何代碼片段?

編輯:

Java的GC是不確定的,所以並不能預見什麼時候會發生,如果有足夠的堆空間甚至可能運行。它也是世代的,所以它基本上是基於它們的毀滅的可能性來排列對象。

http://java.ociweb.com/mark/other-presentations/JavaGC.pdf(第7-11頁)服用,GC有四個原因來運行:

  1. 堆的大小大約是得到充分

  2. 有所謂的很多對象被稱爲「年輕的空間」一代

  3. 有所謂的「終身空間」的許多物體產生

總之,你無法知道它何時會運行。

另外,您可以試一試Java - Full GC (Garbage Collector) happening a lot in short interval causing performance hit,看看答案是否可以幫到你。

+0

。我們正在使用java語言。並且還添加了smaple gc日誌。 – Surendra

0

如果你觀察你的GC日誌,它說明:[PSPermGen:18527K-> 18527K(18816K)] 這清楚地表明你的PermGen空間用完了。

因此增加你的PermGenSpace進一步解決這個問題(可能通過減少你的堆空間)。這可以通過使用虛擬機精靈完成:-XX:MaxPermSize = 512m。這裏的樣本量爲512m,您可以根據您的要求進行更改。

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