小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JVM GC調(diào)優(yōu)

 dongsibei 2014-04-23

1、基本概念

heap=young+old,不包括perm區(qū)

young=eden + from_survivor + to_survivor,實際可用的大小是eden + to_survivor

串行收集器-單cpu使用,相對高效

并行收集器-多cpu,吞吐量優(yōu)先時使用

并發(fā)收集器-多cpu,停頓時間優(yōu)先時使用(web應(yīng)用一般用這個)

2、基本JVM參數(shù)

-Xmx64m 最大heap大小,默認(rèn)物理內(nèi)存的1/4(但是限制<1GB)

-Xms64m 初始heap大小,默認(rèn)物理內(nèi)存的1/64(但是限制<1GB)

-Xmn12m young代大小,sun推薦整個heap的3/8,太大會減少old的大小,引發(fā)較頻繁的major gc

-Xss256k 每個線程的堆棧大小,一般256就ok了

-XX:SurvivorRatio=16 eden與一個survivor的比值,默認(rèn)是8

-XX:+DisableExplicitGC 關(guān)閉System.gc()

3、CMS收集相關(guān)參數(shù)

-XX:+UseConcMarkSweepGC 使用CMS內(nèi)存收集

-XX:+UseCMSCompactAtFullCollection 在full gc的時候,對old區(qū)壓縮

-XX:CMSFullGCsBeforeCompaction=1 多少次full gc后進行old區(qū)壓縮,cms會產(chǎn)生old區(qū)"碎片",要進行整理,避免沒有連續(xù)空間放大對象而引發(fā)cms failure出現(xiàn)

-XX:CMSInitiatingOccupancyFraction=70 old區(qū)使用70%后開始CMS收集,jdk5默認(rèn)68%,jdk6默認(rèn)92%

-XX:CMSInitiatingPermOccupancyFraction=70 perm區(qū)使用70%后開始CMS收集,jdk5默認(rèn)68%,jdk6默認(rèn)92%

-XX:+CMSClassUnloadingEnabled 允許perm區(qū)不夠引發(fā)full gc時perm區(qū)的類卸載

-XX:+UseParNewGC 設(shè)置年輕代為并行收集

-XX:ParallelGCThreads=4 并行收集器的線程數(shù),此值最好配置與處理器數(shù)目相等

-XX:MaxTenuringThreshold=3 垃圾最大年齡,jdk5之前,cms收集器默認(rèn)為0,jdk6默認(rèn)為4

4、GC日志輔助參數(shù)

-XX:+PrintGCDetails 輸出gc詳細(xì)信息

-XX:+PrintGCTimeStamps 輸出gc時間戳,java 6之后使用-XX:+PrintGCDateStamps,閱讀更方便

-Xloggc:filename gc日志文件路徑

-XX:+PrintTenuringDistribution survivor的對象進入old區(qū)之前進行了幾次copy,與設(shè)置的-XX:MaxTenuringThreshold比較,調(diào)整此值和survivor大小

5、各個參數(shù)調(diào)整經(jīng)驗

heap大?。涸诒WCos順暢運轉(zhuǎn)的前提下,heap盡量大。

young區(qū):

盡量大,過小可能引發(fā)頻繁major gc,降低吞吐量,同時可能導(dǎo)致對象直接進入old區(qū),如果old滿了,觸發(fā)full gc;

過大會引起回收耗時過長,導(dǎo)致應(yīng)用停頓,gui程序不要太大的young區(qū)。

old區(qū):

過大會導(dǎo)致old回收過慢,應(yīng)用停頓較長(實際上cms回收是很快的,所以盡量大些,減少cms gc頻率);

過小會導(dǎo)致產(chǎn)生old區(qū)小碎片,放不下大對象,引起頻繁full gc。

如果用了緩存,old區(qū)要適當(dāng)大些,同時緩存不應(yīng)該無限增長。

young與old的調(diào)整原則:要考慮old區(qū)的耗時、頻率,盡可能降低這兩個值。

6、minor gc,回收young區(qū)

當(dāng)young代滿了(即eden區(qū)放不下新創(chuàng)建的對象),觸發(fā)minor gc,只回收young區(qū)的對象,old區(qū)不回收。

young區(qū)被回收的對象越多,gc速度越快,因為young區(qū)采用的是“復(fù)制”的方式,即把enden區(qū)和survivor的from區(qū)存活對象復(fù)制到survivor的to區(qū)。

如果設(shè)置了-XX:MaxTenuringThreshold=N參數(shù),survivor的from區(qū)對象到to的復(fù)制達到了N次,進入old區(qū),如果to區(qū)裝不下,直接進入old區(qū)。

關(guān)于promotion failed:

引發(fā)的兩個原因:

1)survivor太小了,survivor里面的對象還沒有到達進入old的copy次數(shù)

2)進入old區(qū)的對象太多,而old區(qū)已經(jīng)不夠用了

這兩個情況都會引發(fā)full gc,導(dǎo)致停頓較長。

第一個可以調(diào)整survivor的大小,或者直接去掉-XX:MaxTenuringThreshold參數(shù),minor gc回收不掉直接進入old區(qū);

第二個可以調(diào)小young、增大old的大?。ūM早觸發(fā)minor gc,減少每次進入old的對象數(shù)量),或者調(diào)小-XX:CMSInitiatingOccupancyFraction(盡早觸發(fā)old的回收)

7、cms gc,回收old區(qū)

步驟:initial-mark> concurrent-mark> concurrent-preclean> remark> concurrent-sweep> concurrent-reset

除了initial-mark、remark之外,不暫停應(yīng)用。

關(guān)于concurrent mode failure:

引發(fā)的兩個原因

1)年老代變滿之前,old區(qū)垃圾回收還沒有完成

2)新空間分配請求在年老代的剩余空間中無法得到滿足,日志:[GC 90010.628: [ParNew: 261760K->261760K(261952K), 0.0000350secs]90010.628: [CMS (concurrent mode failure)

第一個需要調(diào)小old區(qū),或者調(diào)小參數(shù)-XX:CMSInitiatingOccupancyFraction=70,以盡快回收old區(qū),減少old回收時間;

第二個需要減少young、增加old的大小,或者使用-XX:CMSFullGCsBeforeCompaction并設(shè)置較小的值,提高full gc后壓縮old的頻次,避免young大對象無法晉升到old。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多