谈谈你的GC调优思路?
基本的調優思路可以總結為:
- 理解應用需求和問題,確定調優目標。假設,我們開發了一個應用服務,但發現偶爾會出現性能抖動,出現較長的服務停頓。
- 評估用戶可接受的響應時間和業務量,將目標簡化為,希望GC暫停盡量控制在200ms以內,并且保證一定標準的吞吐量。
- 掌握JVM和GC的狀態,定位具體的問題,確定真的有GC調優的必要。具體有很多方法,比如,通過jstat等工具查看GC等相關狀態,可以開啟GC日志,或者是利用操作系統提供 的診斷工具等。例如,通過追蹤GC日志,就可以查找是不是GC在特定時間發生了長時間的暫停,進而導致了應用響應不及時。
- 這里需要思考,選擇的GC類型是否符合我們的應用特征,如果是,具體問題表現在哪里,是Minor GC過長,還是Mixed GC等出現異常停頓情況;如果不是,考慮切換到什么類型,如CMS和G1都是更側重于低延遲的GC選項。
- 通過分析確定具體調整的參數或者軟硬件配置。
- 驗證是否達到調優目標,如果達到目標,即可以考慮結束調優;否則,重復完成分析、調整、驗證這個過程。
具體操作:
吞吐量優先的并行收集器
并行收集器主要以到達一定的吞吐量為目標,適用于后臺處理
響應時間優先的并發收集器
并發收集器主要是保證系統的響應時間,減少垃圾收集時的停頓時間。適用于應用服務器、電信領域等。
年輕代大小選擇
響應時間優先的應用:盡可能設置大,直到接近系統的最低響應時間限制(根據實際情況選擇)。在此種情況下,年輕代收集發生的頻率也是最小的。同時減少到達年老代的對象。
吞吐量優先的應用:盡可能的設置大,可能到達Gbit的程度,因為對響應時間沒有要求,垃圾收集可以并行進行,一般適合8核CPU以上應用。
年老代大小選擇
響應時間優先的應用:年老代使用并發收集器,所以其大小需要小心設置,一般要考慮并發會話率和會話持續時間等一些參數。如果堆設置小了,可能會造成內存碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。最優化的方案,一般需要參考一下數據獲得:
1、并發垃圾收集信息
2、持久代并發收集次數
3、傳統GC信息
4、花在年輕代和年老代回收上的時間比例減少年輕代和年老代花費的時間,一般會提高應用的效率
吞吐量優先的應用
一般吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以盡可能回收掉大部分短期對象,減少中期對象,而年老代盡存放長期存活的對象
較小堆引起的碎片問題
因為年老代的并發收集器使用標記、清除算法,所以不會對堆進行壓縮。當收集器回收時,他會把相鄰的空間進行合并,這樣可以分配給較大的對象。但是當堆空間較小時,運行一段時間以后,就會出現“碎片”,如果并發收集器找不到足夠的空間,那么并發收集器將會停止,然后使用傳統的標記、清除方式進行回收。
總結
以上是生活随笔為你收集整理的谈谈你的GC调优思路?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC容器和Spring容器
- 下一篇: Tomcat内部结构