您好,登錄后才能下訂單哦!
本篇內容介紹了“如何掌握JVM內存調優”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
會對整個堆進行整理,包括Young、Tenured和Perm。Full GC因為需要對整個堆進行回收,所以比較慢,因此應該盡可能減少Full GC的次數。
調優時盡量讓對象在新生代GC時被回收、讓對象在新生代多存活一段時間和不要創建過大的對象及數組避免直接在舊生代創建對象 。
增大Perm Gen空間,避免太多靜態對象 , 控制好新生代和舊生代的比例
垃圾回收不要手動觸發,盡量依靠JVM自身的機制
在對JVM調優的過程中,很大一部分工作就是對于FullGC的調節,下面詳細介紹對應JVM調優的方法和步驟。
使用各種JVM工具,查看當前日志,分析當前JVM參數設置,并且分析當前堆內存快照和gc日志,根據實際的各區域內存劃分和GC執行時間,覺得是否進行優化。
舉一個例子: 系統崩潰前的一些現象:
每次垃圾回收的時間越來越長,由之前的10ms延長到50ms左右,FullGC的時間也有之前的0.5s延長到4、5s
FullGC的次數越來越多,最頻繁時隔不到1分鐘就進行一次FullGC
年老代的內存越來越大并且每次FullGC后年老代沒有內存被釋放
之后系統會無法響應新的請求,逐漸到達OutOfMemoryError的臨界值,這個時候就需要分析JVM內存快照dump。
通過JMX的MBean生成當前的Heap信息,大小為一個3G(整個堆的大小)的hprof文件,如果沒有啟動JMX可以通過Java的jmap命令來生成該文件。
打開這個3G的堆信息文件,顯然一般的Window系統沒有這么大的內存,必須借助高配置的Linux,幾種工具打開該文件:
Visual VM
IBM HeapAnalyzer
JDK 自帶的Hprof工具
Mat(Eclipse專門的靜態內存分析工具)推薦使用
備注:文件太大,建議使用Eclipse專門的靜態內存分析工具Mat打開分析。
如果各項參數設置合理,系統沒有超時日志出現,GC頻率不高,GC耗時不高,那么沒有必要進行GC優化,如果GC時間超過1-3秒,或者頻繁GC,則必須優化。
注:如果滿足下面的指標,則一般不需要進行GC:
Minor GC執行時間不到50ms;
Minor GC執行不頻繁,約10秒一次;
Full GC執行時間不到1s;
Full GC執行頻率不算頻繁,不低于10分鐘1次;
如果內存分配過大或過小,或者采用的GC收集器比較慢,則應該優先調整這些參數,并且先找1臺或幾臺機器進行beta,然后比較優化過的機器和沒有優化的機器的性能對比,并有針對性的做出最后選擇。
通過不斷的試驗和試錯,分析并找到最合適的參數,如果找到了最合適的參數,則將這些參數應用到所有服務器。
cms參數優化步流程
下面我再繼續介紹下JVM的關鍵參數配置(僅用于參考)。
一般可以通過-Xms -Xmx限定其最小、最大值,為了防止垃圾收集器在最小、最大之間收縮堆而產生額外的時間,通常把最大、最小設置為相同的值;
將根據默認的比例(1:2)分配堆內存, 可以通過調整二者之間的比率NewRadio來調整二者之間的大小,也可以針對回收代。
比如年輕代,通過 -XX:newSize -XX:MaxNewSize來設置其絕對大小。同樣,為了防止年輕代的堆收縮,我們通常會把-XX:newSize -XX:MaxNewSize設置為同樣大小。
1)更大的年輕代必然導致更小的年老代,大的年輕代會延長普通GC的周期,但會增加每次GC的時間;小的年老代會導致更頻繁的Full GC
2)更小的年輕代必然導致更大年老代,小的年輕代會導致普通GC很頻繁,但每次的GC時間會更短;大的年老代會減少Full GC的頻率
如何選擇應該依賴應用程序對象生命周期的分布情況: 如果應用存在大量的臨時對象,應該選擇更大的年輕代;如果存在相對較多的持久對象,年老代應該適當增大。但很多應用都沒有這樣明顯的特性。
(1)本著Full GC盡量少的原則,讓年老代盡量緩存常用對象,JVM的默認比例1:2也是這個道理 。
(2)通過觀察應用一段時間,看其他在峰值時年老代會占多少內存,在不影響Full GC的前提下,根據實際情況加大年輕代,比如可以把比例控制在1:1。但應該給年老代至少預留1/3的增長空間。
4.在配置較好的機器上(比如多核、大內存),可以為年老代選擇并行收集算法: -XX:+UseParallelOldGC 。
5.線程堆棧的設置:每個線程默認會開啟1M的堆棧,用于存放棧幀、調用參數、局部變量等,對大多數應用而言這個默認值太了,一般256K就足用。
理論上,在內存不變的情況下,減少每個線程的堆棧,可以產生更多的線程,但這實際上還受限于操作系統。
“如何掌握JVM內存調優”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。