1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        JVM性能調(diào)優(yōu)實(shí)踐

        共 10540字,需瀏覽 22分鐘

         ·

        2021-02-05 20:54

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

        ? 作者?|? 滴哩哩哩滴哩哩哩噠噠

        來(lái)源 |? urlify.cn/mqMVvu

        76套java從入門到精通實(shí)戰(zhàn)課程分享

        1、JVM調(diào)優(yōu)目標(biāo):

        使用較小的內(nèi)存占用來(lái)獲得較高的吞吐量或者較低的延遲。

        程序在上線前的測(cè)試或運(yùn)行中有時(shí)會(huì)出現(xiàn)一些大大小小的JVM問(wèn)題,比如cpu load過(guò)高、請(qǐng)求延遲、tps降低等,甚至出現(xiàn)內(nèi)存泄漏(每次垃圾收集使用的時(shí)間越來(lái)越長(zhǎng),垃圾收集頻率越來(lái)越高,每次垃圾收集清理掉的垃圾數(shù)據(jù)越來(lái)越少)、內(nèi)存溢出導(dǎo)致系統(tǒng)崩潰,因此需要對(duì)JVM進(jìn)行調(diào)優(yōu),使得程序在正常運(yùn)行的前提下,獲得更高的用戶體驗(yàn)和運(yùn)行效率。

        這里有幾個(gè)比較重要的指標(biāo):

        • 內(nèi)存占用:程序正常運(yùn)行需要的內(nèi)存大小。

        • 延遲:由于垃圾收集而引起的程序停頓時(shí)間。

        • 吞吐量:用戶程序運(yùn)行時(shí)間占用戶程序和垃圾收集占用總時(shí)間的比值。

        當(dāng)然,和CAP原則一樣,同時(shí)滿足一個(gè)程序內(nèi)存占用小、延遲低、高吞吐量是不可能的,程序的目標(biāo)不同,調(diào)優(yōu)時(shí)所考慮的方向也不同,在調(diào)優(yōu)之前,必須要結(jié)合實(shí)際場(chǎng)景,有明確的的優(yōu)化目標(biāo),找到性能瓶頸,對(duì)瓶頸有針對(duì)性的優(yōu)化,最后進(jìn)行測(cè)試,通過(guò)各種監(jiān)控工具確認(rèn)調(diào)優(yōu)后的結(jié)果是否符合目標(biāo)。

        2、JVM調(diào)優(yōu)工具

        (1)調(diào)優(yōu)可以依賴、參考的數(shù)據(jù)有系統(tǒng)運(yùn)行日志、堆棧錯(cuò)誤信息、gc日志、線程快照、堆轉(zhuǎn)儲(chǔ)快照等。

        ①系統(tǒng)運(yùn)行日志:系統(tǒng)運(yùn)行日志就是在程序代碼中打印出的日志,描述了代碼級(jí)別的系統(tǒng)運(yùn)行軌跡(執(zhí)行的方法、入?yún)?、返回值等),一般系統(tǒng)出現(xiàn)問(wèn)題,系統(tǒng)運(yùn)行日志是首先要查看的日志。

        ②堆棧錯(cuò)誤信息:當(dāng)系統(tǒng)出現(xiàn)異常后,可以根據(jù)堆棧信息初步定位問(wèn)題所在,比如根據(jù)“java.lang.OutOfMemoryError: Java heap space”可以判斷是堆內(nèi)存溢出;根據(jù)“java.lang.StackOverflowError”可以判斷是棧溢出;根據(jù)“java.lang.OutOfMemoryError: PermGen space”可以判斷是方法區(qū)溢出等。

        ③GC日志:程序啟動(dòng)時(shí)用 -XX:+PrintGCDetails 和 -Xloggc:/data/jvm/gc.log 可以在程序運(yùn)行時(shí)把gc的詳細(xì)過(guò)程記錄下來(lái),或者直接配置“-verbose:gc”參數(shù)把gc日志打印到控制臺(tái),通過(guò)記錄的gc日志可以分析每塊內(nèi)存區(qū)域gc的頻率、時(shí)間等,從而發(fā)現(xiàn)問(wèn)題,進(jìn)行有針對(duì)性的優(yōu)化。?
        比如如下一段GC日志:

        2018-08-02T14:39:11.560-0800:?10.171:?[GC?[PSYoungGen:?30128K->4091K(30208K)]?51092K->50790K(98816K),?0.0140970?secs]?[Times:?user=0.02?sys=0.03,?real=0.01?secs]?
        2018-08-02T14:39:11.574-0800:?10.185:?[Full?GC?[PSYoungGen:?4091K->0K(30208K)]?[ParOldGen:?46698K->50669K(68608K)]?50790K->50669K(98816K)?[PSPermGen:?2635K->2634K(21504K)],?0.0160030?secs]?[Times:?user=0.03?sys=0.00,?real=0.02?secs]?
        2018-08-02T14:39:14.045-0800:?12.656:?[GC?[PSYoungGen:?14097K->4064K(30208K)]?64766K->64536K(98816K),?0.0117690?secs]?[Times:?user=0.02?sys=0.01,?real=0.01?secs]?
        2018-08-02T14:39:14.057-0800:?12.668:?[Full?GC?[PSYoungGen:?4064K->0K(30208K)]?[ParOldGen:?60471K->401K(68608K)]?64536K->401K(98816K)?[PSPermGen:?2634K->2634K(21504K)],?0.0102020?secs]?[Times:?user=0.01?sys=0.00,?real=0.01?secs]

        上面一共是4條GC日志,來(lái)看第一行日志,“2018-08-02T14:39:11.560-0800”是精確到了毫秒級(jí)別的UTC 通用標(biāo)準(zhǔn)時(shí)間格式,配置了“-XX:+PrintGCDateStamps”這個(gè)參數(shù)可以跟隨gc日志打印出這種時(shí)間戳,“10.171”是從JVM啟動(dòng)到發(fā)生gc經(jīng)過(guò)的秒數(shù)。第一行日志正文開(kāi)頭的“[GC”說(shuō)明這次GC沒(méi)有發(fā)生Stop-The-World(用戶線程停頓),第二行日志正文開(kāi)頭的“[Full GC”說(shuō)明這次GC發(fā)生了Stop-The-World,所以說(shuō),[GC和[Full GC跟新生代和老年代沒(méi)關(guān)系,和垃圾收集器的類型有關(guān)系,如果直接調(diào)用System.gc(),將顯示[Full GC(System)。接下來(lái)的“[PSYoungGen”、“[ParOldGen”表示GC發(fā)生的區(qū)域,具體顯示什么名字也跟垃圾收集器有關(guān),比如這里的“[PSYoungGen”表示Parallel Scavenge收集器,“[ParOldGen”表示Serial Old收集器,此外,Serial收集器顯示“[DefNew”,ParNew收集器顯示“[ParNew”等。再往后的“30128K->4091K(30208K)”表示進(jìn)行了這次gc后,該區(qū)域的內(nèi)存使用空間由30128K減小到4091K,總內(nèi)存大小為30208K。每個(gè)區(qū)域gc描述后面的“51092K->50790K(98816K), 0.0140970 secs”進(jìn)行了這次垃圾收集后,整個(gè)堆內(nèi)存的內(nèi)存使用空間由51092K減小到50790K,整個(gè)堆內(nèi)存總空間為98816K,gc耗時(shí)0.0140970秒。

        ④線程快照:顧名思義,根據(jù)線程快照可以看到線程在某一時(shí)刻的狀態(tài),當(dāng)系統(tǒng)中可能存在請(qǐng)求超時(shí)、死循環(huán)、死鎖等情況是,可以根據(jù)線程快照來(lái)進(jìn)一步確定問(wèn)題。通過(guò)執(zhí)行虛擬機(jī)自帶的“jstack pid”命令,可以dump出當(dāng)前進(jìn)程中線程的快照信息,更詳細(xì)的使用和分析網(wǎng)上有很多例,這篇文章寫到這里已經(jīng)很長(zhǎng)了就不過(guò)多敘述了,貼一篇博客供參考:http://www.cnblogs.com/kongzhongqijing/articles/3630264.html

        ⑤堆轉(zhuǎn)儲(chǔ)快照:程序啟動(dòng)時(shí)可以使用 “-XX:+HeapDumpOnOutOfMemory” 和 “-XX:HeapDumpPath=/data/jvm/dumpfile.hprof”,當(dāng)程序發(fā)生內(nèi)存溢出時(shí),把當(dāng)時(shí)的內(nèi)存快照以文件形式進(jìn)行轉(zhuǎn)儲(chǔ)(也可以直接用jmap命令轉(zhuǎn)儲(chǔ)程序運(yùn)行時(shí)任意時(shí)刻的內(nèi)存快照),事后對(duì)當(dāng)時(shí)的內(nèi)存使用情況進(jìn)行分析。

        (2)JVM調(diào)優(yōu)工具

        ①用 jps(JVM process Status)可以查看虛擬機(jī)啟動(dòng)的所有進(jìn)程、執(zhí)行主類的全名、JVM啟動(dòng)參數(shù),比如當(dāng)執(zhí)行了JPSTest類中的main方法后(main方法持續(xù)執(zhí)行),執(zhí)行 jps -l可看到下面的JPSTest類的pid為31354,加上-v參數(shù)還可以看到JVM啟動(dòng)參數(shù)。

        3265?
        32914?sun.tools.jps.Jps
        31353?org.jetbrains.jps.cmdline.Launcher
        31354?com.danny.test.code.jvm.JPSTest
        380

        ?②用jstat(JVM Statistics Monitoring Tool)監(jiān)視虛擬機(jī)信息?
        jstat -gc pid 500 10 :每500毫秒打印一次Java堆狀況(各個(gè)區(qū)的容量、使用容量、gc時(shí)間等信息),打印10次

        S0C????S1C????S0U????S1U??????EC???????EU????????OC?????????OU???????MC?????MU????CCSC???CCSU???YGC?????YGCT????FGC????FGCT?????GCT???
        11264.0?11264.0?11202.7??0.0???11776.0???1154.3???68608.0????36238.7?????-??????-??????-??????-????????14????0.077???7??????0.049????0.126
        11264.0?11264.0?11202.7??0.0???11776.0???4037.0???68608.0????36238.7?????-??????-??????-??????-????????14????0.077???7??????0.049????0.126
        11264.0?11264.0?11202.7??0.0???11776.0???6604.5???68608.0????36238.7?????-??????-??????-??????-????????14????0.077???7??????0.049????0.126
        11264.0?11264.0?11202.7??0.0???11776.0???9487.2???68608.0????36238.7?????-??????-??????-??????-????????14????0.077???7??????0.049????0.126
        11264.0?11264.0??0.0????0.0???11776.0???258.1????68608.0????58983.4?????-??????-??????-??????-????????15????0.082???8??????0.059????0.141
        11264.0?11264.0??0.0????0.0???11776.0???3076.8???68608.0????58983.4?????-??????-??????-??????-????????15????0.082???8??????0.059????0.141
        11264.0?11264.0??0.0????0.0???11776.0????0.0?????68608.0?????390.0??????-??????-??????-??????-????????16????0.084???9??????0.066????0.149
        11264.0?11264.0??0.0????0.0???11776.0????0.0?????68608.0?????390.0??????-??????-??????-??????-????????16????0.084???9??????0.066????0.149
        11264.0?11264.0??0.0????0.0???11776.0???258.1????68608.0?????390.0??????-??????-??????-??????-????????16????0.084???9??????0.066????0.149
        11264.0?11264.0??0.0????0.0???11776.0???3012.8???68608.0?????390.0??????-??????-??????-??????-????????16????0.084???9??????0.066????0.149

        jstat還可以以其他角度監(jiān)視各區(qū)內(nèi)存大小、監(jiān)視類裝載信息等,具體可以google jstat的詳細(xì)用法。

        ③用jmap(Memory Map for Java)查看堆內(nèi)存信息?
        執(zhí)行jmap -histo pid可以打印出當(dāng)前堆中所有每個(gè)類的實(shí)例數(shù)量和內(nèi)存占用,如下,class name是每個(gè)類的類名([B是byte類型,[C是char類型,[I是int類型),bytes是這個(gè)類的所有示例占用內(nèi)存大小,instances是這個(gè)類的實(shí)例數(shù)量:

        num?????#instances?????????#bytes??class?name
        ----------------------------------------------
        ??1:??????????2291???????29274080??[B
        ??2:?????????15252????????1961040??
        ??3:?????????15252????????1871400??
        ??4:?????????18038?????????721520??java.util.TreeMap$Entry
        ??5:??????????6182?????????530088??[C
        ??6:?????????11391?????????273384??java.lang.Long
        ??7:??????????5576?????????267648??java.util.TreeMap
        ??8:????????????50?????????155872??[I
        ??9:??????????6124?????????146976??java.lang.String
        ?10:??????????3330?????????133200??java.util.LinkedHashMap$Entry
        ?11:??????????5544?????????133056??javax.management.openmbean.CompositeDataSupport

        執(zhí)行 jmap -dump 可以轉(zhuǎn)儲(chǔ)堆內(nèi)存快照到指定文件,比如執(zhí)行 jmap -dump:format=b,file=/data/jvm/dumpfile_jmap.hprof 3361 可以把當(dāng)前堆內(nèi)存的快照轉(zhuǎn)儲(chǔ)到dumpfile_jmap.hprof文件中,然后可以對(duì)內(nèi)存快照進(jìn)行分析。

        ④利用jconsole、jvisualvm分析內(nèi)存信息(各個(gè)區(qū)如Eden、Survivor、Old等內(nèi)存變化情況),如果查看的是遠(yuǎn)程服務(wù)器的JVM,程序啟動(dòng)需要加上如下參數(shù):

        "-Dcom.sun.management.jmxremote=true"?
        "-Djava.rmi.server.hostname=12.34.56.78"?
        "-Dcom.sun.management.jmxremote.port=18181"?
        "-Dcom.sun.management.jmxremote.authenticate=false"?
        "-Dcom.sun.management.jmxremote.ssl=false"

        下圖是jconsole界面,概覽選項(xiàng)可以觀測(cè)堆內(nèi)存使用量、線程數(shù)、類加載數(shù)和CPU占用率;內(nèi)存選項(xiàng)可以查看堆中各個(gè)區(qū)域的內(nèi)存使用量和左下角的詳細(xì)描述(內(nèi)存大小、GC情況等);線程選項(xiàng)可以查看當(dāng)前JVM加載的線程,查看每個(gè)線程的堆棧信息,還可以檢測(cè)死鎖;VM概要描述了虛擬機(jī)的各種詳細(xì)參數(shù)。(jconsole功能演示)?

        下圖是jvisualvm的界面,功能比jconsole略豐富一些,不過(guò)大部分功能都需要安裝插件。概述跟jconsole的VM概要差不多,描述的是jvm的詳細(xì)參數(shù)和程序啟動(dòng)參數(shù);監(jiān)視展示的和jconsole的概覽界面差不多(CPU、堆/方法區(qū)、類加載、線程);線程和jconsole的線程界面差不多;抽樣器可以展示當(dāng)前占用內(nèi)存的類的排行榜及其實(shí)例的個(gè)數(shù);Visual GC可以更豐富地展示當(dāng)前各個(gè)區(qū)域的內(nèi)存占用大小及歷史信息(下圖)。(jvisualvm功能演示)?

        ⑤分析堆轉(zhuǎn)儲(chǔ)快照

        前面說(shuō)到配置了 “-XX:+HeapDumpOnOutOfMemory” 參數(shù)可以在程序發(fā)生內(nèi)存溢出時(shí)dump出當(dāng)前的內(nèi)存快照,也可以用jmap命令隨時(shí)dump出當(dāng)時(shí)內(nèi)存狀態(tài)的快照信息,dump的內(nèi)存快照一般是以.hprof為后綴的二進(jìn)制格式文件。?
        可以直接用 jhat(JVM Heap Analysis Tool) 命令來(lái)分析內(nèi)存快照,它的本質(zhì)實(shí)際上內(nèi)嵌了一個(gè)微型的服務(wù)器,可以通過(guò)瀏覽器來(lái)分析對(duì)應(yīng)的內(nèi)存快照,比如執(zhí)行 jhat -port 9810 -J-Xmx4G /data/jvm/dumpfile_jmap.hprof 表示以9810端口啟動(dòng) jhat 內(nèi)嵌的服務(wù)器:

        Reading?from?/Users/dannyhoo/data/jvm/dumpfile_jmap.hprof...
        Dump?file?created?Fri?Aug?03?15:48:27?CST?2018
        Snapshot?read,?resolving...
        Resolving?276472?objects...
        Chasing?references,?expect?55?dots.......................................................
        Eliminating?duplicate?references.......................................................
        Snapshot?resolved.
        Started?HTTP?server?on?port?9810
        Server?is?ready.

        在控制臺(tái)可以看到服務(wù)器啟動(dòng)了,訪問(wèn) http://127.0.0.1:9810/?可以看到對(duì)快照中的每個(gè)類進(jìn)行分析的結(jié)果(界面略low),下圖是我隨便選擇了一個(gè)類的信息,有這個(gè)類的父類,加載這個(gè)類的類加載器和占用的空間大小,下面還有這個(gè)類的每個(gè)實(shí)例(References)及其內(nèi)存地址和大小,點(diǎn)進(jìn)去會(huì)顯示這個(gè)實(shí)例的一些成員變量等信息:?

        jvisualvm也可以分析內(nèi)存快照,在jvisualvm菜單的“文件”-“裝入”,選擇堆內(nèi)存快照,快照中的信息就以圖形界面展示出來(lái)了,如下,主要可以查看每個(gè)類占用的空間、實(shí)例的數(shù)量和實(shí)例的詳情等:?

        還有很多分析內(nèi)存快照的第三方工具,比如eclipse mat,它比jvisualvm功能更專業(yè),出了查看每個(gè)類及對(duì)應(yīng)實(shí)例占用的空間、數(shù)量,還可以查詢對(duì)象之間的調(diào)用鏈,可以查看某個(gè)實(shí)例到GC Root之間的鏈,等等??梢栽趀clipse中安裝mat插件,也可以下載獨(dú)立的版本(http://www.eclipse.org/mat/downloads.php ),我在mac上安裝后運(yùn)行起來(lái)老卡死~下面是在windows上的截圖(MAT功能演示):

        (3)JVM調(diào)優(yōu)經(jīng)驗(yàn)

        JVM配置方面,一般情況可以先用默認(rèn)配置(基本的一些初始參數(shù)可以保證一般的應(yīng)用跑的比較穩(wěn)定了),在測(cè)試中根據(jù)系統(tǒng)運(yùn)行狀況(會(huì)話并發(fā)情況、會(huì)話時(shí)間等),結(jié)合gc日志、內(nèi)存監(jiān)控、使用的垃圾收集器等進(jìn)行合理的調(diào)整,當(dāng)老年代內(nèi)存過(guò)小時(shí)可能引起頻繁Full GC,當(dāng)內(nèi)存過(guò)大時(shí)Full GC時(shí)間會(huì)特別長(zhǎng)。

        那么JVM的配置比如新生代、老年代應(yīng)該配置多大最合適呢?答案是不一定,調(diào)優(yōu)就是找答案的過(guò)程,物理內(nèi)存一定的情況下,新生代設(shè)置越大,老年代就越小,F(xiàn)ull GC頻率就越高,但Full GC時(shí)間越短;相反新生代設(shè)置越小,老年代就越大,F(xiàn)ull GC頻率就越低,但每次Full GC消耗的時(shí)間越大。建議如下:

        • -Xms和-Xmx的值設(shè)置成相等,堆大小默認(rèn)為-Xms指定的大小,默認(rèn)空閑堆內(nèi)存小于40%時(shí),JVM會(huì)擴(kuò)大堆到-Xmx指定的大?。豢臻e堆內(nèi)存大于70%時(shí),JVM會(huì)減小堆到-Xms指定的大小。如果在Full GC后滿足不了內(nèi)存需求會(huì)動(dòng)態(tài)調(diào)整,這個(gè)階段比較耗費(fèi)資源。

        • 新生代盡量設(shè)置大一些,讓對(duì)象在新生代多存活一段時(shí)間,每次Minor GC 都要盡可能多的收集垃圾對(duì)象,防止或延遲對(duì)象進(jìn)入老年代的機(jī)會(huì),以減少應(yīng)用程序發(fā)生Full GC的頻率。

        • 老年代如果使用CMS收集器,新生代可以不用太大,因?yàn)镃MS的并行收集速度也很快,收集過(guò)程比較耗時(shí)的并發(fā)標(biāo)記和并發(fā)清除階段都可以與用戶線程并發(fā)執(zhí)行。

        • 方法區(qū)大小的設(shè)置,1.6之前的需要考慮系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)增加的常量、靜態(tài)變量等,1.7只要差不多能裝下啟動(dòng)時(shí)和后期動(dòng)態(tài)加載的類信息就行。

        代碼實(shí)現(xiàn)方面,性能出現(xiàn)問(wèn)題比如程序等待、內(nèi)存泄漏除了JVM配置可能存在問(wèn)題,代碼實(shí)現(xiàn)上也有很大關(guān)系:

        • 避免創(chuàng)建過(guò)大的對(duì)象及數(shù)組:過(guò)大的對(duì)象或數(shù)組在新生代沒(méi)有足夠空間容納時(shí)會(huì)直接進(jìn)入老年代,如果是短命的大對(duì)象,會(huì)提前出發(fā)Full GC。

        • 避免同時(shí)加載大量數(shù)據(jù),如一次從數(shù)據(jù)庫(kù)中取出大量數(shù)據(jù),或者一次從Excel中讀取大量記錄,可以分批讀取,用完盡快清空引用。

        • 當(dāng)集合中有對(duì)象的引用,這些對(duì)象使用完之后要盡快把集合中的引用清空,這些無(wú)用對(duì)象盡快回收避免進(jìn)入老年代。

        • 可以在合適的場(chǎng)景(如實(shí)現(xiàn)緩存)采用軟引用、弱引用,比如用軟引用來(lái)為ObjectA分配實(shí)例:SoftReference objectA=new SoftReference(); 在發(fā)生內(nèi)存溢出前,會(huì)將objectA列入回收范圍進(jìn)行二次回收,如果這次回收還沒(méi)有足夠內(nèi)存,才會(huì)拋出內(nèi)存溢出的異常。?
          避免產(chǎn)生死循環(huán),產(chǎn)生死循環(huán)后,循環(huán)體內(nèi)可能重復(fù)產(chǎn)生大量實(shí)例,導(dǎo)致內(nèi)存空間被迅速占滿。

        • 盡量避免長(zhǎng)時(shí)間等待外部資源(數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、設(shè)備資源等)的情況,縮小對(duì)象的生命周期,避免進(jìn)入老年代,如果不能及時(shí)返回結(jié)果可以適當(dāng)采用異步處理的方式等。

        (4)JVM問(wèn)題排查記錄案例

        JVM服務(wù)問(wèn)題排查?https://blog.csdn.net/jacin1/article/details/44837595

        次讓人難以忘懷的排查頻繁Full GC過(guò)程?http://caogen81.iteye.com/blog/1513345

        線上FullGC頻繁的排查?https://blog.csdn.net/wilsonpeng3/article/details/70064336/

        【JVM】線上應(yīng)用故障排查?https://www.cnblogs.com/Dhouse/p/7839810.html

        一次JVM中FullGC問(wèn)題排查過(guò)程?http://iamzhongyong.iteye.com/blog/1830265

        JVM內(nèi)存溢出導(dǎo)致的CPU過(guò)高問(wèn)題排查案例?https://blog.csdn.net/nielinqi520/article/details/78455614

        一個(gè)java內(nèi)存泄漏的排查案例?https://blog.csdn.net/aasgis6u/article/details/54928744

        (5)常用JVM參數(shù)參考:

        參數(shù)說(shuō)明實(shí)例
        -Xms初始堆大小,默認(rèn)物理內(nèi)存的1/64-Xms512M
        -Xmx最大堆大小,默認(rèn)物理內(nèi)存的1/4-Xms2G
        -Xmn新生代內(nèi)存大小,官方推薦為整個(gè)堆的3/8-Xmn512M
        -Xss線程堆棧大小,jdk1.5及之后默認(rèn)1M,之前默認(rèn)256k-Xss512k
        -XX:NewRatio=n設(shè)置新生代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個(gè)年輕代年老代和的1/4-XX:NewRatio=3
        -XX:SurvivorRatio=n年輕代中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。注意Survivor區(qū)有兩個(gè)。如:8,表示Eden:Survivor=8:1:1,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/8-XX:SurvivorRatio=8
        -XX:PermSize=n永久代初始值,默認(rèn)為物理內(nèi)存的1/64-XX:PermSize=128M
        -XX:MaxPermSize=n永久代最大值,默認(rèn)為物理內(nèi)存的1/4-XX:MaxPermSize=256M
        -verbose:class在控制臺(tái)打印類加載信息
        -verbose:gc在控制臺(tái)打印垃圾回收日志
        -XX:+PrintGC打印GC日志,內(nèi)容簡(jiǎn)單
        -XX:+PrintGCDetails打印GC日志,內(nèi)容詳細(xì)
        -XX:+PrintGCDateStamps在GC日志中添加時(shí)間戳
        -Xloggc:filename指定gc日志路徑-Xloggc:/data/jvm/gc.log
        -XX:+UseSerialGC年輕代設(shè)置串行收集器Serial
        -XX:+UseParallelGC年輕代設(shè)置并行收集器Parallel Scavenge
        -XX:ParallelGCThreads=n設(shè)置Parallel Scavenge收集時(shí)使用的CPU數(shù)。并行收集線程數(shù)。-XX:ParallelGCThreads=4
        -XX:MaxGCPauseMillis=n設(shè)置Parallel Scavenge回收的最大時(shí)間(毫秒)-XX:MaxGCPauseMillis=100
        -XX:GCTimeRatio=n設(shè)置Parallel Scavenge垃圾回收時(shí)間占程序運(yùn)行時(shí)間的百分比。公式為1/(1+n)-XX:GCTimeRatio=19
        -XX:+UseParallelOldGC設(shè)置老年代為并行收集器ParallelOld收集器
        -XX:+UseConcMarkSweepGC設(shè)置老年代并發(fā)收集器CMS
        -XX:+CMSIncrementalMode設(shè)置CMS收集器為增量模式,適用于單CPU情況。



        鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

        ??????

        ??長(zhǎng)按上方微信二維碼?2 秒






        感謝點(diǎn)贊支持下哈?

        瀏覽 79
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人精品无码视频A片秀色 | 天天做天天爱天天高潮 | 巨乳女护士 | 波多野结衣无码电影 | 黄片久久久 | 大尺度人体私拍写真 | 逼操逼网 | 超碰在线免费播放 | 天天日夜夜谢 | 极品少妇久久久 |