jvisualVM调优案例
一,jvisualVM介紹
jvisualVM是一款jdk自帶的圖像化jvm性能監控工具,可以:
- 實時監控堆內存的變化情況
- 一鍵生成堆轉儲文件并解析并圖形化展示
- dump線程信息(相當于jstack)
- 堆內存profiler(相當于jmap -histo展示堆內對象直方圖)
- CPU、內存、線程、已加載的類統計
二,實時監控堆內存使用情況
很棒的一點是,這個圖是動態變化的,可以動態的看見堆內存各區域的動態變化:
- eden區內存占用逐漸增多
- eden區垃圾回收
- eden區對象復制到幸存區
- 幸存區對象復制到老年代
- full gc
- ygc的統計數據
- fgc的統計數據
使用案例:
生產環境服務器處理業務請求變慢,通過jvisualVM發現ygc的次數非常頻繁,沒發生fgc,老年代的空間非常充足,以上現象說明eden區的空間小,但是這臺機器的內存是32G,不至于缺乏內存,從jvisualVM上看,可用的eden區內存高達3G。那為什么會頻繁的ygc呢?
仔細研究發現,雖然eden區的可用內存也即最大可分配內存高達3G,但實際分配給eden區的內存只有150M,難怪ygc那么頻繁。
那為什么只分配給eden區150M內存呢,繼續觀察發現old區的分配內存也沒有想象中的多,但是old區在不斷的動態調整,不斷擴大,eden區的實際分配內存基本沒有變化。
心里大致有底了,檢查了下jvm參數,發現沒有配置-Xms、-Xmx,在沒有明確指定堆內存的大小的情況下,jvm會根據應用所需要的最小堆內存進行內存規劃,導致了eden區過小。
定位到了這個問題,就知道該怎么辦了,顯式配置-Xms8g、-Xmx8g,重啟應用,ygc明顯減少,應用吞吐量大幅增加,一次成功的jvm優化。
這里需要清楚jvisualVM的visual gc界面的使用,visual gc是jvisualVM的插件,要先安裝,安裝極其簡單,通過jvisualVM即可快速完成。
visual gc界面詳解:
關鍵要理解eden可用大小和實際分配大小,如果不通過-Xms、-Xmx明確指定堆空間大小的話,eden可用大小和實際分配大小可能會有很大差距,導致eden區頻繁發生ygc。
三, 一鍵生成堆轉儲文件并解析并圖形化展示
1,生成dump文件
2,自帶解析并可視化
可以通過實例數找到大對象和大集合對象 ,以及通過“與另一個堆轉儲進行比較”確定不同時間點上對象在堆內存的變化情況,結合實際情況根據這些線索進一步確定問題所在。
MAT是更強大的dump文件分析工具,如果說有必須要掌握的圖形化jvm監控工具的話,jvisualVM和MAT是唯二兩款。
后面再分析MAT的使用。
四,dump線程信息(相當于jstack)
1,生成線程信息
2,查看生成的線程相關信息
查看線程狀態及各狀態持續時間。
可惜的是,不能搜索,生成環境幾十上百個線程,不能搜索就代表著雞肋。
案例:定位C3P0連接池滿導致應用阻塞,響應緩慢
thread2一直被阻塞,直接原因是線程池連接數全部被占用,連接池被用完有如下幾個可能:
- 連接池數設置過少
- sql執行慢,導致連接長時間被占用
- 連接使用完成后未被釋放
- 數據庫異常,如鎖表
解決方案:
1,加大連接池數量;
2,修改代碼,使用完連接后要關閉連接;
3,優化sql,提升sql執行性能;
總結
以上是生活随笔為你收集整理的jvisualVM调优案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2005 Web Applicati
- 下一篇: UVa11137 Ingenuous C