一、VM 內(nèi)存的系統(tǒng)級(jí)調(diào)優(yōu)。
首先注意在對(duì) JVM 內(nèi)存調(diào)優(yōu)的時(shí)候不能只看操作系統(tǒng)級(jí)別 java 進(jìn)程所占用的內(nèi)存,這個(gè)數(shù)值不能準(zhǔn)確的反應(yīng)堆內(nèi)存的真實(shí)占用情況,因?yàn)?GC 過(guò)后這個(gè)值是不會(huì)變化的,因此內(nèi)存調(diào)優(yōu)的時(shí)候要更多地使用 JDK 提供的內(nèi)存查看工具,比如 JConsole 和 java VisualVM。
對(duì) JVM 內(nèi)存的系統(tǒng)級(jí)的調(diào)優(yōu)主要目的是減少 GC 的頻率和 Full GC 的次數(shù),過(guò)多的 GC 和 Full GC 是會(huì)占用很多的系統(tǒng)資源(主要是 CPU),影響系統(tǒng)的吞吐量。特別要關(guān)注 Full GC,因?yàn)樗鼤?huì)對(duì)整個(gè)堆進(jìn)行整理,F(xiàn)ull GC 一般由以下幾個(gè)原因?qū)е拢?/p>
1、老年代空間不足。
調(diào)優(yōu)時(shí)盡量讓對(duì)象在新生代 GC 時(shí)被回收、讓對(duì)象在新生代多存活一段時(shí)間和不要?jiǎng)?chuàng)建過(guò)大的對(duì)象及數(shù)組避免直接在老年代創(chuàng)建對(duì)象。
2、持久代;空間不足。
增大持久代空間,避免太多靜態(tài)對(duì)象。
垃圾回收不要手動(dòng)觸發(fā),盡量依靠 JVM 自身的機(jī)制。
二、調(diào)優(yōu)手段
調(diào)優(yōu)手段主要是通過(guò)控制堆內(nèi)存的各個(gè)部分的比例和 GC 策略來(lái)實(shí)現(xiàn),下面來(lái)看看各部分比例不良設(shè)置會(huì)導(dǎo)致什么后果:
1、新生代設(shè)置過(guò)小。
- 新生代 GC 次數(shù)非常頻繁,增大系統(tǒng)消耗。
- 導(dǎo)致大對(duì)象直接進(jìn)入老年代,占據(jù)了老年代剩余空間,誘發(fā) Full GC。
2、新生代設(shè)置過(guò)大。
- 新生代設(shè)置過(guò)大會(huì)導(dǎo)致老年代過(guò)小,從而誘發(fā) Full GC。
- 新生代 GC 耗時(shí)大幅度增加。
一般來(lái)說(shuō)新生代占整個(gè)堆 1/3 比較合適。
3、保留空間 Survivor 設(shè)置過(guò)小。
導(dǎo)致對(duì)象從使用空間 eden 直接到達(dá)老年代,降低了在新生代的存活時(shí)間。
4、保留空間 Survivor 設(shè)置過(guò)大。
導(dǎo)致 eden 過(guò)小,增加了 GC 頻率。
另外,通過(guò) - XX:MaxTenuringThreshold=n 來(lái)控制新生代存活時(shí)間,盡量讓對(duì)象在新生代被回收。
JVM 提供兩種較為簡(jiǎn)單的 GC 策略的設(shè)置方式。
(1)吞吐量?jī)?yōu)先。
JVM 以吞吐量為指標(biāo),自行選擇相應(yīng)的 GC 策略及控制新生代與老年代的大小比例,來(lái)達(dá)到吞吐量指標(biāo)。這個(gè)值可由 - XX:GCTimeRatio=n 來(lái)設(shè)置。
(2)暫停時(shí)間優(yōu)先。
JVM 以暫停時(shí)間為指標(biāo),自行選擇相應(yīng)的 GC 策略及控制新生代和老年代的大小比例,盡量保證每次 GC 造成的應(yīng)用停止時(shí)間都在指定的數(shù)值范圍內(nèi)完成,這個(gè)值可由 - XX:MaxGCPauseRatio=n 來(lái)設(shè)置。
三、JVM 參數(shù)設(shè)置、分析。
不管是 YGC 還是 Full GC,GC 過(guò)程中都會(huì)對(duì)導(dǎo)致程序運(yùn)行中中斷,正確的選擇HotSpot VM GC 的種類,調(diào)整 JVM、GC 的參數(shù),可以極大的減少由于 GC 工作,而導(dǎo)致的程序運(yùn)行中斷方面的問(wèn)題,進(jìn)而適當(dāng)?shù)奶岣?Java 程序的工作效率。但是調(diào)整 GC 是一個(gè)極為復(fù)雜的過(guò)程,由于各個(gè)程序具備不同的特點(diǎn),如:web 和 GUI 程序就有很大區(qū)別(Web 可以適當(dāng)?shù)耐nD,但 GUI 停頓是客戶無(wú)法接受的),而且由于跑在各個(gè)機(jī)器上的配置不同(主要 cup 個(gè)數(shù),內(nèi)存不同),所以使用的 GC 種類也會(huì)不同 (如何選擇見HotSpot VM GC 的種類)。本文將注重介紹 JVM、GC 的一些重要參數(shù)的設(shè)置來(lái)提高系統(tǒng)的性能。

熱門跟貼