簡體   English   中英

java全gc花了太長時間

[英]java full gc taking too long

我有一個Java客戶端,它從服務器消耗大量數據。 如果客戶端無法以足夠快的速率跟上數據流,則服務器會斷開套接字連接。 我的客戶每天斷開連接幾次。 我運行jconsole來查看內存使用情況,堆空間圖看起來像一個相當明確的鋸齒模式,在大約0.5GB和1.8GB之間振盪(分配2GB的堆空間)。 但每次斷開連接都是在完整的GC期間(但不是每個完整的GC)。 我看到完整的GC平均需要1秒多一點。 根據一天中的時間,完整的GC會在繁忙時每5分鍾發生一次,或者在慢速期間可以在完整的GC之間進行30分鍾。

我懷疑如果我可以減少完整的GC時間,客戶端將能夠更好地跟上傳入的數據,但我沒有太多的GC調整經驗。 有沒有人知道這是否是一個好主意,以及如何做到這一點? 或者是否有其他可能也有效的想法?

**更新**我使用-XX:+ UseConcMarkSweepGC並且它有所改進,但我仍然在非常繁忙的時刻斷開連接。 因此,我將堆分配增加到3GB,以幫助度過忙碌的時刻,現在看起來好像很好,但它只有1天沒有斷開連接。 也許如果我得到一些時間,我會經歷並嘗試減少創建的垃圾量,我相信也會有所幫助。 感謝所有的建議。

完整的GC可能需要很長時間才能完成,並且不容易調整。

(輕松)調整它的一種方法是增加堆空間 - 一般來說,堆空間的兩倍可以使兩個GC之間的間隔加倍,但會使GC消耗的時間加倍。 如果您運行的程序具有非常明確的使用模式,也許您可​​以考慮增加堆空間以使間隔如此之大,以至於您可以保證有一些空閑時間來嘗試使系統執行GC。 另一方面,遵循這個邏輯,如果堆很小,一個完整的垃圾收集將立即完成,但這似乎比幫助更多的麻煩。

此外, -XX:+UseConcMarkSweepGC可能會有所幫助,因為它會嘗試同時執行G​​C操作(不停止程序;請參閱此處 )。

以下是 Til Gene(Azul系統的CTO,高性能JVM的制造商,並發布了幾個GC算法) 一個非常好的演講,關於JVM中的GC。

調整Full GC並不容易。 更好的方法是減少垃圾產生。 減少垃圾產生的壓力減少了集合上的壓力,使物體進入終身空間,收集成本更高。

我建議你使用內存分析器

  • 減少產生的垃圾量。 在許多應用中,這可以相對容易地減少2-10倍。
  • 減少正在創建的對象的大小,例如使用原始和較小的數據類型,如double而不是BigDecimal。
  • 回收可變對象而不是丟棄它們。
  • 如果可以的話,在客戶端上保留較少的數據。

通過減少您創建的垃圾量,對象更有可能在伊甸園或幸存者空間中死亡,這意味着您擁有的集合少得多,也可以更短。

不要認為你必須忍受大量的收藏品,在極端情況下,你幾乎可以完全避免它.http://vanillajava.blogspot.ro/2011/06/how-to-avoid-garbage-collection.html

取出對Runtime.getRuntime()的調用.gc() - 當手動觸發垃圾收集時,它或者什么也不做,或者它完成一個完整的世界垃圾收集。 您希望增量GC發生。

您是否嘗試過使用jdk安裝的服務器jvm? 它改變了一堆默認配置設置(包括垃圾收集)並且很容易嘗試 - 只需在您的java命令中添加-server即可。

java -server

什么是創造的垃圾? 你能少生產嗎? 盡可能嘗試使用valueOf方法。 通過使用更少的內存,您將節省自己在gc和內存分配中的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM