[英]Glassfish JVM settings for GC
我正在我的glassfish服務器上運行一個應用程序,我有以下JVM設置(我認為這與我的問題相關): - -Xmx512m -XX:NewRatio=2 -XX:+UseParallelOldGC -XX:+UseParallelGC
所有其他設置都是默認設置。 我一直用JMC(Java Mission Control)測試服務器性能過去48小時,我注意到了這一點:PS Old Gen有大約341 MB的堆,PS Eden有大約143MB的堆,PS Surviovor有大約13MB的堆(這是我應該使用不同的SurvivorRatio嗎?)
圖表顯示,一開始java堆有大約200MB的分配空間,但是在每個完整的GC之后它增長所以現在大約是450MB,甚至堆使用(在每個完整GC之后)下降到大約100MB並且慢慢增長直到下一個小GC / full GC ...為什么提交java堆(紅線)增加? 這是正常的行為嗎? 當它達到512MB時會停止嗎? 我應該使用-Xms512m那個提交的java堆從512開始會是512MB嗎?
現在關於垃圾收集:Minor GC(PS Scavenge)大約每1分鍾運行一次,持續時間大約為10-30ms。 全GC(PS MarkSweep)每14-18小時運行一次,首先持續時間為200ms,但最后一次持續時間為20秒(我不知道為什么持續時間有這么大的差異)! 我想知道這是否正常以及如何獲得更好的結果? 我應該使用-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
或者甚至是-XX:+UseG1GC
? 如果我使用這些GC中的任何一個,我將不得不增加最大堆大小(我讀過UseG1GC僅用於更大的堆)? 我是否必須更改除GC類型之外的任何其他設置(如SurvivorRatio,NewRation,...)?
JMC中的GC持續時間是否等於停止世界暫停時間(或暫停時間更短)? 因此,如果我有20秒的GC GC持續時間,這意味着我的服務器沒有響應20秒? 我的服務器上有JAX-RS,我使用ajax每隔10秒調用其中一個(超時為10秒),這意味着至少有2個呼叫不會成功? 在這種情況下,ajax調用的狀態是什么(可能是錯誤)? 我必須警告用戶有關錯誤調用的信息,我不知道在這種情況下如果錯誤是GC暫停的結果....
如果我有-Xmx1024m(比現在大兩倍),那么完整的GC會比較少見,但會持續更長的時間嗎?
我閱讀了很多關於JVM和JVM GC的文章,但我仍然不知道我必須做什么,所有設置對我的應用程序來說都是最佳的(我擔心最后20秒的GC持續時間)......
謝謝您的回答!
全GC(PS MarkSweep)大約每14-18小時運行一次,持續時間為200ms,但最后一次持續時間為20秒
嘗試通過-XX:MaxGCPauseMillis
設置暫停時間目標。
我應該使用-XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC或者甚至是-XX:+ UseG1GC?
那些肯定是一種選擇,但由於並行收集器似乎能夠提供良好的延遲,並且只會隨着舊的增加而變得更糟,您可能不需要
圖表顯示,一開始java堆有大約200MB的分配空間,但是在每個完整的GC之后它增長所以現在大約是450MB,甚至堆使用(在每個完整GC之后)下降到大約100MB並且慢慢增長直到下一個小GC / full GC ...為什么提交java堆(紅線)增加?
因為您正在使用並行收集器,它以吞吐量為主要目標(如果沒有指定限制,可能會損害內存占用或延遲)。 並且它可以通過在積累大量垃圾時很少收集來提供最高的吞吐量。
通過為其提供暫停時間目標,如果它變得太大而無法滿足暫停時間目標,它將停止增長堆。
如果我有-Xmx1024m(比現在大兩倍),那么完整的GC會比較少見,但會持續更長的時間嗎?
可能,但是一旦不能滿足MaxHeapFreeRatio
目標,GC將停止增加堆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.