溫馨提示×

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

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

JVM快速調(diào)優(yōu)手冊(cè)之五: ParNew收集器+CMS收集器的產(chǎn)品案例分析(響應(yīng)時(shí)間優(yōu)先)

發(fā)布時(shí)間:2020-04-04 10:49:51 來(lái)源:網(wǎng)絡(luò) 閱讀:546 作者:Stitch_x 欄目:編程語(yǔ)言

服務(wù)器

雙核,4個(gè)cores; 16G memory

[root@alish3-cassandra-01 ~]# cat /proc/cpuinfo | grep "cpu cores"
cpu cores       : 2
cpu cores       : 2

公式簡(jiǎn)述

響應(yīng)時(shí)間優(yōu)先的并發(fā)收集器,主要是保證系統(tǒng)的響應(yīng)時(shí)間,減少垃圾收集時(shí)的停頓時(shí)間。適用于應(yīng)用服務(wù)器、電信領(lǐng)域等。

  1. ParNew收集器

    ParNew收集器是Serial收集器的多線程版本,許多運(yùn)行在Server模式下的虛擬機(jī)中首選的新生代收集器,除Serial外,只有它能與CMS收集器配合工作。

  2. CMS收集器

    CMS, 全稱Concurrent Low Pause Collector,是jdk1.4后期版本開(kāi)始引入的新gc算法,在jdk5和jdk6中得到了進(jìn)一步改進(jìn),它的主要適合場(chǎng)景是對(duì)響應(yīng)時(shí)間的重要性需求 大于對(duì)吞吐量的要求,能夠承受垃圾回收線程和應(yīng)用線程共享處理器資源,并且應(yīng)用中存在比較多的長(zhǎng)生命周期的對(duì)象的應(yīng)用。CMS是用于對(duì)tenured generation的回收,也就是年老代的回收,目標(biāo)是盡量減少應(yīng)用的暫停時(shí)間,減少FullGC發(fā)生的幾率,利用和應(yīng)用程序線程并發(fā)的垃圾回收線程來(lái) 標(biāo)記清除年老代。
    CMS并非沒(méi)有暫停,而是用兩次短暫停來(lái)替代串行標(biāo)記整理算法的長(zhǎng)暫停,它的收集周期是這樣:
    初始標(biāo)記(CMS-initial-mark) -> 并發(fā)標(biāo)記(CMS-concurrent-mark) -> 重新標(biāo)記(CMS-remark) -> 并發(fā)清除(CMS-concurrent-sweep) ->并發(fā)重設(shè)狀態(tài)等待下次CMS的觸發(fā)(CMS-concurrent-reset)
    其中的1,3兩個(gè)步驟需要暫停所有的應(yīng)用程序線程的。第一次暫停從root對(duì)象開(kāi)始標(biāo)記存活的對(duì)象,這個(gè)階段稱為初始標(biāo)記;第二次暫停是在并發(fā)標(biāo)記之后,暫停所有應(yīng)用程序線程,重新標(biāo)記并發(fā)標(biāo)記階段遺漏的對(duì)象(在并發(fā)標(biāo)記階段結(jié)束后對(duì)象狀態(tài)的更新導(dǎo)致)。第一次暫停會(huì)比較短,第二次暫停通常會(huì)比較長(zhǎng),并且remark這個(gè)階段可以并行標(biāo)記。
    而并發(fā)標(biāo)記、并發(fā)清除、并發(fā)重設(shè)階段的所謂并發(fā),是指一個(gè)或者多個(gè)垃圾回收線程和應(yīng)用程序線程并發(fā)地運(yùn)行,垃圾回收線程不會(huì)暫停應(yīng)用程序的執(zhí)行,如果你有多于一個(gè)處理器,那么并發(fā)收集線程將與應(yīng)用線程在不同的處理器上運(yùn)行,顯然,這樣的開(kāi)銷(xiāo)就是會(huì)降低應(yīng)用的吞吐量。Remark階段的并行,是指暫停了所有應(yīng)用程序后,啟動(dòng)一定數(shù)目的垃圾回收進(jìn)程進(jìn)行并行標(biāo)記,此時(shí)的應(yīng)用線程是暫停的。

公式

($TOMCAT_HOME/bin/catalina.sh)

export JAVA_OPTS="-server -Xmx10240m -Xms10240m -Xmn3840m -XX:PermSize=256m

-XX:MaxPermSize=256m -Denv=denalicnprod

-XX:SurvivorRatio=8  -XX:PretenureSizeThreshold=1048576

-XX:+DisableExplicitGC  

-XX:+UseParNewGC  -XX:ParallelGCThreads=10

-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled

-XX:+CMSScavengeBeforeRemark -XX:ParallelCMSThreads=10

-XX:CMSInitiatingOccupancyFraction=70

-XX:+UseCMSInitiatingOccupancyOnly

-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0

-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

-XX:+UseFastAccessorMethods

-XX:LargePageSizeInBytes=128M

-XX:SoftRefLRUPolicyMSPerMB=0

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC

-XX:+PrintGCApplicationStoppedTime 

-XX:+PrintGCDateStamps -Xloggc:gc.log -verbose:gc"

公式解析

參 數(shù) 含 義
-server 一定要作為第一個(gè)參數(shù),啟用JDK的server版本,在多個(gè)CPU時(shí)性能佳
-Xms java Heap初始大小。 默認(rèn)是物理內(nèi)存的1/64。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
-Xmx java heap最大值。建議均設(shè)為物理內(nèi)存的80%。不可超過(guò)物理內(nèi)存。
-Xmn 設(shè)置年輕代大小,一般設(shè)置為Xmx的2/8~3/8,等同于-XX:NewSize 和 -XX:MaxNewSize 。
-XX:PermSize 設(shè)定內(nèi)存的永久保存區(qū)初始大小,缺省值為64M
-XX:MaxPermSize 設(shè)定內(nèi)存的永久保存區(qū)最大大小,缺省值為64M
-Denv 指定tomcat運(yùn)行哪個(gè)project
-XX:SurvivorRatio Eden區(qū)與Survivor區(qū)的大小比值, 設(shè)置為8,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:8,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/10
-XX:PretenureSizeThreshold 晉升年老代的對(duì)象大小。默認(rèn)為0,比如設(shè)為1048576(1M),則超過(guò)1M的對(duì)象將不在eden區(qū)分配,而直接進(jìn)入年老代。
-XX:+DisableExplicitGC 關(guān)閉System.gc()
-XX:+UseParNewGC 設(shè)置年輕代為并發(fā)收集??膳cCMS收集同時(shí)使用。
-XX:ParallelGCThreads
-XX:+UseConcMarkSweepGC 設(shè)置年老代為并發(fā)收集。測(cè)試中配置這個(gè)以后,-XX:NewRatio=4的配置失效了。所以,此時(shí)年輕代大小最好用-Xmn設(shè)置。
-XX:+CMSParallelRemarkEnabled 開(kāi)啟并行remark
-XX:+CMSScavengeBeforeRemark 這個(gè)參數(shù)還蠻重要的,它的意思是在執(zhí)行CMS remark之前進(jìn)行一次youngGC,這樣能有效降低remark的時(shí)間
-XX:ParallelCMSThreads CMS默認(rèn)啟動(dòng)的回收線程數(shù)目是 (ParallelGCThreads + 3)/4) ,如果你需要明確設(shè)定,可以通過(guò)-XX:ParallelCMSThreads=20來(lái)設(shè)定,其中ParallelGCThreads是年輕代的并行收集線程數(shù)
-XX:CMSInitiatingOccupancyFraction 使用cms作為垃圾回收使用70%后開(kāi)始CMS收集
-XX:+UseCMSInitiatingOccupancyOnly 使用手動(dòng)定義初始化定義開(kāi)始CMS收集
-XX:+UseCMSCompactAtFullCollection 打開(kāi)對(duì)年老代的壓縮??赡軙?huì)影響性能,但是可以消除內(nèi)存碎片。
-XX:CMSFullGCsBeforeCompaction 由于并發(fā)收集器不對(duì)內(nèi)存空間進(jìn)行壓縮、整理,所以運(yùn)行一段時(shí)間以后會(huì)產(chǎn)生“碎片”,使得運(yùn)行效率降低。此參數(shù)設(shè)置運(yùn)行次FullGC以后對(duì)內(nèi)存空間進(jìn)行壓縮、整理。
-XX:+CMSPermGenSweepingEnabled 為了避免Perm區(qū)滿引起的full gc,建議開(kāi)啟CMS回收Perm區(qū)選項(xiàng)
-XX:+CMSClassUnloadingEnabled
-XX:+UseFastAccessorMethods 原始類型的快速優(yōu)化
-XX:LargePageSizeInBytes 內(nèi)存頁(yè)的大小,不可設(shè)置過(guò)大, 會(huì)影響Perm的大小
-XX:SoftRefLRUPolicyMSPerMB “軟引用”的對(duì)象在最后一次被訪問(wèn)后能存活0毫秒(默認(rèn)為1秒)。
-XX:+PrintGCDetails 記錄 GC 運(yùn)行時(shí)的詳細(xì)數(shù)據(jù)信息,包括新生成對(duì)象的占用內(nèi)存大小以及耗費(fèi)時(shí)間等
-XX:+PrintGCTimeStamps 打印垃圾收集的時(shí)間戳
-XX:+PrintHeapAtGC 打印GC前后的詳細(xì)堆棧信息
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期間程序暫停的時(shí)間.可與上面混合使用
-XX:+PrintGCDateStamps 之前打印gc日志的時(shí)候使用是:-XX:+PrintGCTimeStamps,這個(gè)選項(xiàng)記錄的是jvm啟動(dòng)時(shí)間為起點(diǎn)的相對(duì)時(shí)間,可讀性較差,不利于定位問(wèn)題,使用PrintGCDateStamps記錄的是系統(tǒng)時(shí)間,更humanreadable
-Xloggc 與上面幾個(gè)配合使用,把相關(guān)日志信息記錄到文件以便分析
-verbose:gc 記錄 GC 運(yùn)行以及運(yùn)行時(shí)間,一般用來(lái)查看 GC 是否是應(yīng)用的瓶頸
向AI問(wèn)一下細(xì)節(jié)

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

AI