qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          JVM(Java虛擬機(jī))優(yōu)化大全和案例實(shí)戰(zhàn)

            堆內(nèi)存設(shè)置
            原理
            JVM堆內(nèi)存分為2塊:Permanent Space 和 Heap Space。
            Permanent 即 持久代(Permanent Generation),主要存放的是Java類(lèi)定義信息,與垃圾收集器要收集的Java對(duì)象關(guān)系不大。
            Heap = { Old + NEW = {Eden, from, to} },Old 即 年老代(Old Generation),New 即 年輕代(Young Generation)。年老代和年輕代的劃分對(duì)垃圾收集影響比較大。
            年輕代
            所有新生成的對(duì)象首先都是放在年輕代。年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對(duì)象。年輕代一般分3個(gè)區(qū),1個(gè)Eden區(qū),2個(gè)Survivor區(qū)(from 和 to)。
            大部分對(duì)象在Eden區(qū)中生成。當(dāng)Eden區(qū)滿時(shí),還存活的對(duì)象將被復(fù)制到Survivor區(qū)(兩個(gè)中的一個(gè)),當(dāng)一個(gè)Survivor區(qū)滿時(shí),此區(qū)的存活對(duì)象將被復(fù)制到另外一個(gè)Survivor區(qū),當(dāng)另一個(gè)Survivor區(qū)也滿了的時(shí)候,從前一個(gè)Survivor區(qū)復(fù)制過(guò)來(lái)的并且此時(shí)還存活的對(duì)象,將可能被復(fù)制到年老代。
            2個(gè)Survivor區(qū)是對(duì)稱(chēng)的,沒(méi)有先后關(guān)系,所以同一個(gè)Survivor區(qū)中可能同時(shí)存在從Eden區(qū)復(fù)制過(guò)來(lái)對(duì)象,和從另一個(gè)Survivor區(qū)復(fù)制過(guò)來(lái)的對(duì)象;而復(fù)制到年老區(qū)的只有從另一個(gè)Survivor區(qū)過(guò)來(lái)的對(duì)象。而且,因?yàn)樾枰粨Q的原因,Survivor區(qū)至少有一個(gè)是空的。特殊的情況下,根據(jù)程序需要,Survivor區(qū)是可以配置為多個(gè)的(多于2個(gè)),這樣可以增加對(duì)象在年輕代中的存在時(shí)間,減少被放到年老代的可能。
            針對(duì)年輕代的垃圾回收即 Young GC。
            年老代
            在年輕代中經(jīng)歷了N次(可配置)垃圾回收后仍然存活的對(duì)象,就會(huì)被復(fù)制到年老代中。因此,可以認(rèn)為年老代中存放的都是一些生命周期較長(zhǎng)的對(duì)象。
            針對(duì)年老代的垃圾回收即 Full GC。
            持久代
            用于存放靜態(tài)類(lèi)型數(shù)據(jù),如 Java Class, Method 等。持久代對(duì)垃圾回收沒(méi)有顯著影響。但是有些應(yīng)用可能動(dòng)態(tài)生成或調(diào)用一些Class,例如 Hibernate CGLib 等,在這種時(shí)候往往需要設(shè)置一個(gè)比較大的持久代空間來(lái)存放這些運(yùn)行過(guò)程中動(dòng)態(tài)增加的類(lèi)型。
            所以,當(dāng)一組對(duì)象生成時(shí),內(nèi)存申請(qǐng)過(guò)程如下:
            JVM會(huì)試圖為相關(guān)Java對(duì)象在年輕代的Eden區(qū)中初始化一塊內(nèi)存區(qū)域。
            當(dāng)Eden區(qū)空間足夠時(shí),內(nèi)存申請(qǐng)結(jié)束。否則執(zhí)行下一步。
            JVM試圖釋放在Eden區(qū)中所有不活躍的對(duì)象(Young GC)。釋放后若Eden空間仍然不足以放入新對(duì)象,JVM則試圖將部分Eden區(qū)中活躍對(duì)象放入Survivor區(qū)。
            Survivor區(qū)被用來(lái)作為Eden區(qū)及年老代的中間交換區(qū)域。當(dāng)年老代空間足夠時(shí),Survivor區(qū)中存活了一定次數(shù)的對(duì)象會(huì)被移到年老代。
            當(dāng)年老代空間不夠時(shí),JVM會(huì)在年老代進(jìn)行完全的垃圾回收(Full GC)。
            Full GC后,若Survivor區(qū)及年老代仍然無(wú)法存放從Eden區(qū)復(fù)制過(guò)來(lái)的對(duì)象,則會(huì)導(dǎo)致JVM無(wú)法在Eden區(qū)為新生成的對(duì)象申請(qǐng)內(nèi)存,即出現(xiàn)“Out of Memory”。
            OOM(“Out of Memory”)異常一般主要有如下2種原因:
            1. 年老代溢出,表現(xiàn)為:java.lang.OutOfMemoryError:Javaheapspace
            這是最常見(jiàn)的情況,產(chǎn)生的原因可能是:設(shè)置的內(nèi)存參數(shù)Xmx過(guò)小或程序的內(nèi)存泄露及使用不當(dāng)問(wèn)題。
            例如循環(huán)上萬(wàn)次的字符串處理、創(chuàng)建上千萬(wàn)個(gè)對(duì)象、在一段代碼內(nèi)申請(qǐng)上百M(fèi)甚至上G的內(nèi)存。還有的時(shí)候雖然不會(huì)報(bào)內(nèi)存溢出,卻會(huì)使系統(tǒng)不間斷的垃圾回收,也無(wú)法處理其它請(qǐng)求。這種情況下除了檢查程序、打印堆內(nèi)存等方法排查,還可以借助一些內(nèi)存分析工具,比如MAT就很不錯(cuò)。
            2. 持久代溢出,表現(xiàn)為:java.lang.OutOfMemoryError:PermGenspace
            通常由于持久代設(shè)置過(guò)小,動(dòng)態(tài)加載了大量Java類(lèi)而導(dǎo)致溢出,解決辦法唯有將參數(shù) -XX:MaxPermSize 調(diào)大(一般256m能滿足絕大多數(shù)應(yīng)用程序需求)。將部分Java類(lèi)放到容器共享區(qū)(例如Tomcat share lib)去加載的辦法也是一個(gè)思路,但前提是容器里部署了多個(gè)應(yīng)用,且這些應(yīng)用有大量的共享類(lèi)庫(kù)。  參數(shù)說(shuō)明
            -Xmx3550m:設(shè)置JVM最大堆內(nèi)存為3550M。
            -Xms3550m:設(shè)置JVM初始堆內(nèi)存為3550M。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
            -Xss128k:設(shè)置每個(gè)線程的棧大小。JDK5.0以后每個(gè)線程棧大小為1M,之前每個(gè)線程棧大小為256K。應(yīng)當(dāng)根據(jù)應(yīng)用的線程所需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無(wú)限生成,經(jīng)驗(yàn)值在3000~5000左右。需要注意的是:當(dāng)這個(gè)值被設(shè)置的較大(例如>2MB)時(shí)將會(huì)在很大程度上降低系統(tǒng)的性能。
            -Xmn2g:設(shè)置年輕代大小為2G。在整個(gè)堆內(nèi)存大小確定的情況下,增大年輕代將會(huì)減小年老代,反之亦然。此值關(guān)系到JVM垃圾回收,對(duì)系統(tǒng)性能影響較大,官方推薦配置為整個(gè)堆大小的3/8。
            -XX:NewSize=1024m:設(shè)置年輕代初始值為1024M。
            -XX:MaxNewSize=1024m:設(shè)置年輕代最大值為1024M。
            -XX:PermSize=256m:設(shè)置持久代初始值為256M。
            -XX:MaxPermSize=256m:設(shè)置持久代最大值為256M。
            -XX:NewRatio=4:設(shè)置年輕代(包括1個(gè)Eden和2個(gè)Survivor區(qū))與年老代的比值。表示年輕代比年老代為1:4。
            -XX:SurvivorRatio=4:設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的比值。表示2個(gè)Survivor區(qū)(JVM堆內(nèi)存年輕代中默認(rèn)有2個(gè)大小相等的Survivor區(qū))與1個(gè)Eden區(qū)的比值為2:4,即1個(gè)Survivor區(qū)占整個(gè)年輕代大小的1/6。
            -XX:MaxTenuringThreshold=7:表示一個(gè)對(duì)象如果在Survivor區(qū)(救助空間)移動(dòng)了7次還沒(méi)有被垃圾回收就進(jìn)入年老代。如果設(shè)置為0的話,則年輕代對(duì)象不經(jīng)過(guò)Survivor區(qū),直接進(jìn)入年老代,對(duì)于需要大量常駐內(nèi)存的應(yīng)用,這樣做可以提高效率。如果將此值設(shè)置為一個(gè)較大值,則年輕代對(duì)象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象在年輕代存活時(shí)間,增加對(duì)象在年輕代被垃圾回收的概率,減少Full GC的頻率,這樣做可以在某種程度上提高服務(wù)穩(wěn)定性。
            疑問(wèn)解答
            -Xmn,-XX:NewSize/-XX:MaxNewSize,-XX:NewRatio 3組參數(shù)都可以影響年輕代的大小,混合使用的情況下,優(yōu)先級(jí)是什么?
            如下:
            高優(yōu)先級(jí):-XX:NewSize/-XX:MaxNewSize
            中優(yōu)先級(jí):-Xmn(默認(rèn)等效  -Xmn=-XX:NewSize=-XX:MaxNewSize=?)
            低優(yōu)先級(jí):-XX:NewRatio
            推薦使用-Xmn參數(shù),原因是這個(gè)參數(shù)簡(jiǎn)潔,相當(dāng)于一次設(shè)定 NewSize/MaxNewSIze,而且兩者相等,適用于生產(chǎn)環(huán)境。-Xmn 配合 -Xms/-Xmx,即可將堆內(nèi)存布局完成。
            -Xmn參數(shù)是在JDK 1.4 開(kāi)始支持。
            垃圾回收器選擇
            JVM給出了3種選擇:串行收集器、并行收集器、并發(fā)收集器。串行收集器只適用于小數(shù)據(jù)量的情況,所以生產(chǎn)環(huán)境的選擇主要是并行收集器和并發(fā)收集器。
            默認(rèn)情況下JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在啟動(dòng)時(shí)加入相應(yīng)參數(shù)。JDK5.0以后,JVM會(huì)根據(jù)當(dāng)前系統(tǒng)配置進(jìn)行智能判斷。
            串行收集器
            -XX:+UseSerialGC:設(shè)置串行收集器。
            并行收集器(吞吐量?jī)?yōu)先)
            -XX:+UseParallelGC:設(shè)置為并行收集器。此配置僅對(duì)年輕代有效。即年輕代使用并行收集,而年老代仍使用串行收集。
            -XX:ParallelGCThreads=20:配置并行收集器的線程數(shù),即:同時(shí)有多少個(gè)線程一起進(jìn)行垃圾回收。此值建議配置與CPU數(shù)目相等。
            -XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集。JDK6.0開(kāi)始支持對(duì)年老代并行收集。
            -XX:MaxGCPauseMillis=100:設(shè)置每次年輕代垃圾回收的最長(zhǎng)時(shí)間(單位毫秒)。如果無(wú)法滿足此時(shí)間,JVM會(huì)自動(dòng)調(diào)整年輕代大小,以滿足此時(shí)間。
            -XX:+UseAdaptiveSizePolicy:設(shè)置此選項(xiàng)后,并行收集器會(huì)自動(dòng)調(diào)整年輕代Eden區(qū)大小和Survivor區(qū)大小的比例,以達(dá)成目標(biāo)系統(tǒng)規(guī)定的最低響應(yīng)時(shí)間或者收集頻率等指標(biāo)。此參數(shù)建議在使用并行收集器時(shí),一直打開(kāi)。
            并發(fā)收集器(響應(yīng)時(shí)間優(yōu)先)
            -XX:+UseConcMarkSweepGC:即CMS收集,設(shè)置年老代為并發(fā)收集。CMS收集是JDK1.4后期版本開(kāi)始引入的新GC算法。它的主要適合場(chǎng)景是對(duì)響應(yīng)時(shí)間的重要性需求大于對(duì)吞吐量的需求,能夠承受垃圾回收線程和應(yīng)用線程共享CPU資源,并且應(yīng)用中存在比較多的長(zhǎng)生命周期對(duì)象。CMS收集的目標(biāo)是盡量減少應(yīng)用的暫停時(shí)間,減少Full GC發(fā)生的幾率,利用和應(yīng)用程序線程并發(fā)的垃圾回收線程來(lái)標(biāo)記清除年老代內(nèi)存。
            -XX:+UseParNewGC:設(shè)置年輕代為并發(fā)收集。可與CMS收集同時(shí)使用。JDK5.0以上,JVM會(huì)根據(jù)系統(tǒng)配置自行設(shè)置,所以無(wú)需再設(shè)置此參數(shù)。
            -XX:CMSFullGCsBeforeCompaction=0:由于并發(fā)收集器不對(duì)內(nèi)存空間進(jìn)行壓縮和整理,所以運(yùn)行一段時(shí)間并行收集以后會(huì)產(chǎn)生內(nèi)存碎片,內(nèi)存使用效率降低。此參數(shù)設(shè)置運(yùn)行0次Full GC后對(duì)內(nèi)存空間進(jìn)行壓縮和整理,即每次Full GC后立刻開(kāi)始?jí)嚎s和整理內(nèi)存。
            -XX:+UseCMSCompactAtFullCollection:打開(kāi)內(nèi)存空間的壓縮和整理,在Full GC后執(zhí)行。可能會(huì)影響性能,但可以消除內(nèi)存碎片。
            -XX:+CMSIncrementalMode:設(shè)置為增量收集模式。一般適用于單CPU情況。
            -XX:CMSInitiatingOccupancyFraction=70:表示年老代內(nèi)存空間使用到70%時(shí)就開(kāi)始執(zhí)行CMS收集,以確保年老代有足夠的空間接納來(lái)自年輕代的對(duì)象,避免Full GC的發(fā)生。
            其它垃圾回收參數(shù)
          -XX:+ScavengeBeforeFullGC:年輕代GC優(yōu)于Full GC執(zhí)行。
          -XX:-DisableExplicitGC:不響應(yīng) System.gc() 代碼。
          -XX:+UseThreadPriorities:?jiǎn)⒂帽镜鼐€程優(yōu)先級(jí)API。即使 java.lang.Thread.setPriority() 生效,不啟用則無(wú)效。
          -XX:SoftRefLRUPolicyMSPerMB=0:軟引用對(duì)象在最后一次被訪問(wèn)后能存活0毫秒(JVM默認(rèn)為1000毫秒)。
          -XX:TargetSurvivorRatio=90:允許90%的Survivor區(qū)被占用(JVM默認(rèn)為50%)。提高對(duì)于Survivor區(qū)的使用率。
            輔助信息參數(shù)設(shè)置
          -XX:-CITime:打印消耗在JIT編譯的時(shí)間。
          -XX:ErrorFile=./hs_err_pid.log:保存錯(cuò)誤日志或數(shù)據(jù)到指定文件中。
          -XX:HeapDumpPath=./java_pid.hprof:指定Dump堆內(nèi)存時(shí)的路徑。
          -XX:-HeapDumpOnOutOfMemoryError:當(dāng)首次遭遇內(nèi)存溢出時(shí)Dump出此時(shí)的堆內(nèi)存。
          -XX:OnError=";":出現(xiàn)致命ERROR后運(yùn)行自定義命令。
          -XX:OnOutOfMemoryError=";":當(dāng)首次遭遇內(nèi)存溢出時(shí)執(zhí)行自定義命令。
          -XX:-PrintClassHistogram:按下 Ctrl+Break 后打印堆內(nèi)存中類(lèi)實(shí)例的柱狀信息,同JDK的 jmap -histo 命令。
          -XX:-PrintConcurrentLocks:按下 Ctrl+Break 后打印線程棧中并發(fā)鎖的相關(guān)信息,同JDK的 jstack -l 命令。
          -XX:-PrintCompilation:當(dāng)一個(gè)方法被編譯時(shí)打印相關(guān)信息。
          -XX:-PrintGC:每次GC時(shí)打印相關(guān)信息。
          -XX:-PrintGCDetails:每次GC時(shí)打印詳細(xì)信息。
          -XX:-PrintGCTimeStamps:打印每次GC的時(shí)間戳。
          -XX:-TraceClassLoading:跟蹤類(lèi)的加載信息。
          -XX:-TraceClassLoadingPreorder:跟蹤被引用到的所有類(lèi)的加載信息。
          -XX:-TraceClassResolution:跟蹤常量池。
          -XX:-TraceClassUnloading:跟蹤類(lèi)的卸載信息。
            關(guān)于參數(shù)名稱(chēng)等
            標(biāo)準(zhǔn)參數(shù)(-),所有JVM都必須支持這些參數(shù)的功能,而且向后兼容;例如:
            -client——設(shè)置JVM使用Client模式,特點(diǎn)是啟動(dòng)速度比較快,但運(yùn)行時(shí)性能和內(nèi)存管理效率不高,通常用于客戶端應(yīng)用程序或開(kāi)發(fā)調(diào)試;在32位環(huán)境下直接運(yùn)行Java程序默認(rèn)啟用該模式。
            -server——設(shè)置JVM使Server模式,特點(diǎn)是啟動(dòng)速度比較慢,但運(yùn)行時(shí)性能和內(nèi)存管理效率很高,適用于生產(chǎn)環(huán)境。在具有64位能力的JDK環(huán)境下默認(rèn)啟用該模式。
            非標(biāo)準(zhǔn)參數(shù)(-X),默認(rèn)JVM實(shí)現(xiàn)這些參數(shù)的功能,但是并不保證所有JVM實(shí)現(xiàn)都滿足,且不保證向后兼容;
            非穩(wěn)定參數(shù)(-XX),此類(lèi)參數(shù)各個(gè)JVM實(shí)現(xiàn)會(huì)有所不同,將來(lái)可能會(huì)不被支持,需要慎重使用;  參數(shù)說(shuō)明
            -Xmx3550m:設(shè)置JVM最大堆內(nèi)存為3550M。
            -Xms3550m:設(shè)置JVM初始堆內(nèi)存為3550M。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
            -Xss128k:設(shè)置每個(gè)線程的棧大小。JDK5.0以后每個(gè)線程棧大小為1M,之前每個(gè)線程棧大小為256K。應(yīng)當(dāng)根據(jù)應(yīng)用的線程所需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無(wú)限生成,經(jīng)驗(yàn)值在3000~5000左右。需要注意的是:當(dāng)這個(gè)值被設(shè)置的較大(例如>2MB)時(shí)將會(huì)在很大程度上降低系統(tǒng)的性能。
            -Xmn2g:設(shè)置年輕代大小為2G。在整個(gè)堆內(nèi)存大小確定的情況下,增大年輕代將會(huì)減小年老代,反之亦然。此值關(guān)系到JVM垃圾回收,對(duì)系統(tǒng)性能影響較大,官方推薦配置為整個(gè)堆大小的3/8。
            -XX:NewSize=1024m:設(shè)置年輕代初始值為1024M。
            -XX:MaxNewSize=1024m:設(shè)置年輕代最大值為1024M。
            -XX:PermSize=256m:設(shè)置持久代初始值為256M。
            -XX:MaxPermSize=256m:設(shè)置持久代最大值為256M。
            -XX:NewRatio=4:設(shè)置年輕代(包括1個(gè)Eden和2個(gè)Survivor區(qū))與年老代的比值。表示年輕代比年老代為1:4。
            -XX:SurvivorRatio=4:設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的比值。表示2個(gè)Survivor區(qū)(JVM堆內(nèi)存年輕代中默認(rèn)有2個(gè)大小相等的Survivor區(qū))與1個(gè)Eden區(qū)的比值為2:4,即1個(gè)Survivor區(qū)占整個(gè)年輕代大小的1/6。
            -XX:MaxTenuringThreshold=7:表示一個(gè)對(duì)象如果在Survivor區(qū)(救助空間)移動(dòng)了7次還沒(méi)有被垃圾回收就進(jìn)入年老代。如果設(shè)置為0的話,則年輕代對(duì)象不經(jīng)過(guò)Survivor區(qū),直接進(jìn)入年老代,對(duì)于需要大量常駐內(nèi)存的應(yīng)用,這樣做可以提高效率。如果將此值設(shè)置為一個(gè)較大值,則年輕代對(duì)象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象在年輕代存活時(shí)間,增加對(duì)象在年輕代被垃圾回收的概率,減少Full GC的頻率,這樣做可以在某種程度上提高服務(wù)穩(wěn)定性。
            疑問(wèn)解答
            -Xmn,-XX:NewSize/-XX:MaxNewSize,-XX:NewRatio 3組參數(shù)都可以影響年輕代的大小,混合使用的情況下,優(yōu)先級(jí)是什么?
            如下:
            高優(yōu)先級(jí):-XX:NewSize/-XX:MaxNewSize
            中優(yōu)先級(jí):-Xmn(默認(rèn)等效  -Xmn=-XX:NewSize=-XX:MaxNewSize=?)
            低優(yōu)先級(jí):-XX:NewRatio
            推薦使用-Xmn參數(shù),原因是這個(gè)參數(shù)簡(jiǎn)潔,相當(dāng)于一次設(shè)定 NewSize/MaxNewSIze,而且兩者相等,適用于生產(chǎn)環(huán)境。-Xmn 配合 -Xms/-Xmx,即可將堆內(nèi)存布局完成。
            -Xmn參數(shù)是在JDK 1.4 開(kāi)始支持。
            垃圾回收器選擇
            JVM給出了3種選擇:串行收集器、并行收集器、并發(fā)收集器。串行收集器只適用于小數(shù)據(jù)量的情況,所以生產(chǎn)環(huán)境的選擇主要是并行收集器和并發(fā)收集器。
            默認(rèn)情況下JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在啟動(dòng)時(shí)加入相應(yīng)參數(shù)。JDK5.0以后,JVM會(huì)根據(jù)當(dāng)前系統(tǒng)配置進(jìn)行智能判斷。
            串行收集器
            -XX:+UseSerialGC:設(shè)置串行收集器。
            并行收集器(吞吐量?jī)?yōu)先)
            -XX:+UseParallelGC:設(shè)置為并行收集器。此配置僅對(duì)年輕代有效。即年輕代使用并行收集,而年老代仍使用串行收集。
            -XX:ParallelGCThreads=20:配置并行收集器的線程數(shù),即:同時(shí)有多少個(gè)線程一起進(jìn)行垃圾回收。此值建議配置與CPU數(shù)目相等。
            -XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集。JDK6.0開(kāi)始支持對(duì)年老代并行收集。
            -XX:MaxGCPauseMillis=100:設(shè)置每次年輕代垃圾回收的最長(zhǎng)時(shí)間(單位毫秒)。如果無(wú)法滿足此時(shí)間,JVM會(huì)自動(dòng)調(diào)整年輕代大小,以滿足此時(shí)間。
            -XX:+UseAdaptiveSizePolicy:設(shè)置此選項(xiàng)后,并行收集器會(huì)自動(dòng)調(diào)整年輕代Eden區(qū)大小和Survivor區(qū)大小的比例,以達(dá)成目標(biāo)系統(tǒng)規(guī)定的最低響應(yīng)時(shí)間或者收集頻率等指標(biāo)。此參數(shù)建議在使用并行收集器時(shí),一直打開(kāi)。
            并發(fā)收集器(響應(yīng)時(shí)間優(yōu)先)
            -XX:+UseConcMarkSweepGC:即CMS收集,設(shè)置年老代為并發(fā)收集。CMS收集是JDK1.4后期版本開(kāi)始引入的新GC算法。它的主要適合場(chǎng)景是對(duì)響應(yīng)時(shí)間的重要性需求大于對(duì)吞吐量的需求,能夠承受垃圾回收線程和應(yīng)用線程共享CPU資源,并且應(yīng)用中存在比較多的長(zhǎng)生命周期對(duì)象。CMS收集的目標(biāo)是盡量減少應(yīng)用的暫停時(shí)間,減少Full GC發(fā)生的幾率,利用和應(yīng)用程序線程并發(fā)的垃圾回收線程來(lái)標(biāo)記清除年老代內(nèi)存。
            -XX:+UseParNewGC:設(shè)置年輕代為并發(fā)收集。可與CMS收集同時(shí)使用。JDK5.0以上,JVM會(huì)根據(jù)系統(tǒng)配置自行設(shè)置,所以無(wú)需再設(shè)置此參數(shù)。
            -XX:CMSFullGCsBeforeCompaction=0:由于并發(fā)收集器不對(duì)內(nèi)存空間進(jìn)行壓縮和整理,所以運(yùn)行一段時(shí)間并行收集以后會(huì)產(chǎn)生內(nèi)存碎片,內(nèi)存使用效率降低。此參數(shù)設(shè)置運(yùn)行0次Full GC后對(duì)內(nèi)存空間進(jìn)行壓縮和整理,即每次Full GC后立刻開(kāi)始?jí)嚎s和整理內(nèi)存。
            -XX:+UseCMSCompactAtFullCollection:打開(kāi)內(nèi)存空間的壓縮和整理,在Full GC后執(zhí)行。可能會(huì)影響性能,但可以消除內(nèi)存碎片。
            -XX:+CMSIncrementalMode:設(shè)置為增量收集模式。一般適用于單CPU情況。
            -XX:CMSInitiatingOccupancyFraction=70:表示年老代內(nèi)存空間使用到70%時(shí)就開(kāi)始執(zhí)行CMS收集,以確保年老代有足夠的空間接納來(lái)自年輕代的對(duì)象,避免Full GC的發(fā)生。
            其它垃圾回收參數(shù)
          -XX:+ScavengeBeforeFullGC:年輕代GC優(yōu)于Full GC執(zhí)行。
          -XX:-DisableExplicitGC:不響應(yīng) System.gc() 代碼。
          -XX:+UseThreadPriorities:?jiǎn)⒂帽镜鼐€程優(yōu)先級(jí)API。即使 java.lang.Thread.setPriority() 生效,不啟用則無(wú)效。
          -XX:SoftRefLRUPolicyMSPerMB=0:軟引用對(duì)象在最后一次被訪問(wèn)后能存活0毫秒(JVM默認(rèn)為1000毫秒)。
          -XX:TargetSurvivorRatio=90:允許90%的Survivor區(qū)被占用(JVM默認(rèn)為50%)。提高對(duì)于Survivor區(qū)的使用率。
            輔助信息參數(shù)設(shè)置
          -XX:-CITime:打印消耗在JIT編譯的時(shí)間。
          -XX:ErrorFile=./hs_err_pid.log:保存錯(cuò)誤日志或數(shù)據(jù)到指定文件中。
          -XX:HeapDumpPath=./java_pid.hprof:指定Dump堆內(nèi)存時(shí)的路徑。
          -XX:-HeapDumpOnOutOfMemoryError:當(dāng)首次遭遇內(nèi)存溢出時(shí)Dump出此時(shí)的堆內(nèi)存。
          -XX:OnError=";":出現(xiàn)致命ERROR后運(yùn)行自定義命令。
          -XX:OnOutOfMemoryError=";":當(dāng)首次遭遇內(nèi)存溢出時(shí)執(zhí)行自定義命令。
          -XX:-PrintClassHistogram:按下 Ctrl+Break 后打印堆內(nèi)存中類(lèi)實(shí)例的柱狀信息,同JDK的 jmap -histo 命令。
          -XX:-PrintConcurrentLocks:按下 Ctrl+Break 后打印線程棧中并發(fā)鎖的相關(guān)信息,同JDK的 jstack -l 命令。
          -XX:-PrintCompilation:當(dāng)一個(gè)方法被編譯時(shí)打印相關(guān)信息。
          -XX:-PrintGC:每次GC時(shí)打印相關(guān)信息。
          -XX:-PrintGCDetails:每次GC時(shí)打印詳細(xì)信息。
          -XX:-PrintGCTimeStamps:打印每次GC的時(shí)間戳。
          -XX:-TraceClassLoading:跟蹤類(lèi)的加載信息。
          -XX:-TraceClassLoadingPreorder:跟蹤被引用到的所有類(lèi)的加載信息。
          -XX:-TraceClassResolution:跟蹤常量池。
          -XX:-TraceClassUnloading:跟蹤類(lèi)的卸載信息。
            關(guān)于參數(shù)名稱(chēng)等
            標(biāo)準(zhǔn)參數(shù)(-),所有JVM都必須支持這些參數(shù)的功能,而且向后兼容;例如:
            -client——設(shè)置JVM使用Client模式,特點(diǎn)是啟動(dòng)速度比較快,但運(yùn)行時(shí)性能和內(nèi)存管理效率不高,通常用于客戶端應(yīng)用程序或開(kāi)發(fā)調(diào)試;在32位環(huán)境下直接運(yùn)行Java程序默認(rèn)啟用該模式。
            -server——設(shè)置JVM使Server模式,特點(diǎn)是啟動(dòng)速度比較慢,但運(yùn)行時(shí)性能和內(nèi)存管理效率很高,適用于生產(chǎn)環(huán)境。在具有64位能力的JDK環(huán)境下默認(rèn)啟用該模式。
            非標(biāo)準(zhǔn)參數(shù)(-X),默認(rèn)JVM實(shí)現(xiàn)這些參數(shù)的功能,但是并不保證所有JVM實(shí)現(xiàn)都滿足,且不保證向后兼容;
            非穩(wěn)定參數(shù)(-XX),此類(lèi)參數(shù)各個(gè)JVM實(shí)現(xiàn)會(huì)有所不同,將來(lái)可能會(huì)不被支持,需要慎重使用;

          posted on 2014-03-31 11:43 順其自然EVO 閱讀(663) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 測(cè)試學(xué)習(xí)專(zhuān)欄

          <2014年3月>
          2324252627281
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 将乐县| 临沭县| 信宜市| 稷山县| 闽侯县| 顺平县| 贵南县| 衡山县| 佛教| 邹平县| 长顺县| 腾冲县| 什邡市| 册亨县| 朔州市| 信丰县| 灵石县| 关岭| 化隆| 永登县| 临洮县| 万盛区| 徐闻县| 洛宁县| 东至县| 巴林左旗| 曲周县| 奇台县| 彭州市| 涿鹿县| 黔江区| 花莲市| 花垣县| 栾城县| 沙洋县| 华安县| 德保县| 博湖县| 滦平县| 教育| 盐山县|