溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何掌握J(rèn)VM內(nèi)存調(diào)優(yōu)

發(fā)布時間:2021-10-21 09:19:34 來源:億速云 閱讀:92 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“如何掌握J(rèn)VM內(nèi)存調(diào)優(yōu)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.Full GC

會對整個堆進(jìn)行整理,包括Young、Tenured和Perm。Full GC因為需要對整個堆進(jìn)行回收,所以比較慢,因此應(yīng)該盡可能減少Full GC的次數(shù)。

2.導(dǎo)致Full GC的原因

1)年老代(Tenured)被寫滿

調(diào)優(yōu)時盡量讓對象在新生代GC時被回收、讓對象在新生代多存活一段時間和不要創(chuàng)建過大的對象及數(shù)組避免直接在舊生代創(chuàng)建對象 。

2)持久代Pemanet Generation空間不足

增大Perm Gen空間,避免太多靜態(tài)對象 , 控制好新生代和舊生代的比例

3)System.gc()被顯示調(diào)用

垃圾回收不要手動觸發(fā),盡量依靠JVM自身的機(jī)制

在對JVM調(diào)優(yōu)的過程中,很大一部分工作就是對于FullGC的調(diào)節(jié),下面詳細(xì)介紹對應(yīng)JVM調(diào)優(yōu)的方法和步驟。

JVM性能調(diào)優(yōu)方法和步驟

1.監(jiān)控GC的狀態(tài)

使用各種JVM工具,查看當(dāng)前日志,分析當(dāng)前JVM參數(shù)設(shè)置,并且分析當(dāng)前堆內(nèi)存快照和gc日志,根據(jù)實際的各區(qū)域內(nèi)存劃分和GC執(zhí)行時間,覺得是否進(jìn)行優(yōu)化。

舉一個例子: 系統(tǒng)崩潰前的一些現(xiàn)象:

每次垃圾回收的時間越來越長,由之前的10ms延長到50ms左右,F(xiàn)ullGC的時間也有之前的0.5s延長到4、5s

FullGC的次數(shù)越來越多,最頻繁時隔不到1分鐘就進(jìn)行一次FullGC

年老代的內(nèi)存越來越大并且每次FullGC后年老代沒有內(nèi)存被釋放

之后系統(tǒng)會無法響應(yīng)新的請求,逐漸到達(dá)OutOfMemoryError的臨界值,這個時候就需要分析JVM內(nèi)存快照dump。

2.生成堆的dump文件

通過JMX的MBean生成當(dāng)前的Heap信息,大小為一個3G(整個堆的大小)的hprof文件,如果沒有啟動JMX可以通過Java的jmap命令來生成該文件。

3.分析dump文件

打開這個3G的堆信息文件,顯然一般的Window系統(tǒng)沒有這么大的內(nèi)存,必須借助高配置的Linux,幾種工具打開該文件:

Visual VM

IBM HeapAnalyzer

JDK 自帶的Hprof工具

Mat(Eclipse專門的靜態(tài)內(nèi)存分析工具)推薦使用

備注:文件太大,建議使用Eclipse專門的靜態(tài)內(nèi)存分析工具M(jìn)at打開分析。

4.分析結(jié)果,判斷是否需要優(yōu)化

如果各項參數(shù)設(shè)置合理,系統(tǒng)沒有超時日志出現(xiàn),GC頻率不高,GC耗時不高,那么沒有必要進(jìn)行GC優(yōu)化,如果GC時間超過1-3秒,或者頻繁GC,則必須優(yōu)化。

注:如果滿足下面的指標(biāo),則一般不需要進(jìn)行GC:

Minor GC執(zhí)行時間不到50ms;

Minor GC執(zhí)行不頻繁,約10秒一次;

Full GC執(zhí)行時間不到1s;

Full GC執(zhí)行頻率不算頻繁,不低于10分鐘1次;

5.調(diào)整GC類型和內(nèi)存分配

如果內(nèi)存分配過大或過小,或者采用的GC收集器比較慢,則應(yīng)該優(yōu)先調(diào)整這些參數(shù),并且先找1臺或幾臺機(jī)器進(jìn)行beta,然后比較優(yōu)化過的機(jī)器和沒有優(yōu)化的機(jī)器的性能對比,并有針對性的做出最后選擇。

6.不斷的分析和調(diào)整

通過不斷的試驗和試錯,分析并找到最合適的參數(shù),如果找到了最合適的參數(shù),則將這些參數(shù)應(yīng)用到所有服務(wù)器。

cms參數(shù)優(yōu)化步流程

下面我再繼續(xù)介紹下JVM的關(guān)鍵參數(shù)配置(僅用于參考)。

JVM調(diào)優(yōu)參數(shù)參考

1.針對JVM堆的設(shè)置

一般可以通過-Xms -Xmx限定其最小、最大值,為了防止垃圾收集器在最小、最大之間收縮堆而產(chǎn)生額外的時間,通常把最大、最小設(shè)置為相同的值;

2.年輕代和年老代

將根據(jù)默認(rèn)的比例(1:2)分配堆內(nèi)存, 可以通過調(diào)整二者之間的比率NewRadio來調(diào)整二者之間的大小,也可以針對回收代。

比如年輕代,通過 -XX:newSize -XX:MaxNewSize來設(shè)置其絕對大小。同樣,為了防止年輕代的堆收縮,我們通常會把-XX:newSize -XX:MaxNewSize設(shè)置為同樣大小。

3.年輕代和年老代設(shè)置多大才算合理

1)更大的年輕代必然導(dǎo)致更小的年老代,大的年輕代會延長普通GC的周期,但會增加每次GC的時間;小的年老代會導(dǎo)致更頻繁的Full GC

2)更小的年輕代必然導(dǎo)致更大年老代,小的年輕代會導(dǎo)致普通GC很頻繁,但每次的GC時間會更短;大的年老代會減少Full GC的頻率

如何選擇應(yīng)該依賴應(yīng)用程序?qū)ο笊芷诘姆植记闆r: 如果應(yīng)用存在大量的臨時對象,應(yīng)該選擇更大的年輕代;如果存在相對較多的持久對象,年老代應(yīng)該適當(dāng)增大。但很多應(yīng)用都沒有這樣明顯的特性。

在抉擇時應(yīng)該根 據(jù)以下兩點:

(1)本著Full GC盡量少的原則,讓年老代盡量緩存常用對象,JVM的默認(rèn)比例1:2也是這個道理 。

(2)通過觀察應(yīng)用一段時間,看其他在峰值時年老代會占多少內(nèi)存,在不影響Full GC的前提下,根據(jù)實際情況加大年輕代,比如可以把比例控制在1:1。但應(yīng)該給年老代至少預(yù)留1/3的增長空間。

4.在配置較好的機(jī)器上(比如多核、大內(nèi)存),可以為年老代選擇并行收集算法: -XX:+UseParallelOldGC 。

5.線程堆棧的設(shè)置:每個線程默認(rèn)會開啟1M的堆棧,用于存放棧幀、調(diào)用參數(shù)、局部變量等,對大多數(shù)應(yīng)用而言這個默認(rèn)值太了,一般256K就足用。

理論上,在內(nèi)存不變的情況下,減少每個線程的堆棧,可以產(chǎn)生更多的線程,但這實際上還受限于操作系統(tǒng)。

“如何掌握J(rèn)VM內(nèi)存調(diào)優(yōu)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI