溫馨提示×

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

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

jvm堆內(nèi)存優(yōu)化詳解

發(fā)布時(shí)間:2020-08-01 17:45:30 來(lái)源:網(wǎng)絡(luò) 閱讀:9161 作者:weilovepan520 欄目:網(wǎng)絡(luò)安全

在日常的運(yùn)維工作中用到tomcat,都需要對(duì)tomcat中的jvm虛擬機(jī)進(jìn)行優(yōu)化,只有知道需要優(yōu)化參數(shù)的具體用處,才能深刻體會(huì)優(yōu)化jvm的意義所在。

在平常的工作中我們談對(duì)jvm的優(yōu)化,主要是針對(duì)java的堆內(nèi)存的優(yōu)化和垃圾回收機(jī)制的優(yōu)化。

JVM堆內(nèi)存示意圖:

    jvm堆內(nèi)存優(yōu)化詳解    

JVM的堆內(nèi)存的組成:

  young generation:新生代

   eden:伊甸園區(qū)

   surived:存活區(qū)

   其中存活區(qū)有2個(gè),第1個(gè)為S0,第2個(gè)為S1

  old generation:老年代   

  permanent generation:持久代

堆內(nèi)存相關(guān)參數(shù)詳解:

  -Xms:初始化堆內(nèi)存大小,不包括持久代的內(nèi)存,默認(rèn)為物理內(nèi)存的1/64,不會(huì)超過(guò)1G

  -Xmx:最大堆內(nèi)存大小,不包括持久代內(nèi)存,默認(rèn)為物理內(nèi)存的1/4

  -Xmn:新生代內(nèi)存大小,默認(rèn)值為Xmx的3/8,老年代內(nèi)存則為5/8

  -XX:NewRatio:指定新生代與老生代的內(nèi)存的比值,默認(rèn)值為2

  -XX:SurvivorRatio:eden和2個(gè)存活區(qū)內(nèi)存的比值,默認(rèn)值為8

  -XX:PermSize:初始化時(shí)持久代內(nèi)存的大小

  -XX:MaxPermSize:最大持久代內(nèi)存的大小

  建議:

    1.一般建議Xms等于Xmx,好處是避免每次gc后,調(diào)整堆的大小,減少系統(tǒng)內(nèi)存分配開(kāi)銷

    2.建議-XX:PermSize和-XX:MaxPermSize的值相同,因?yàn)橛谰么笮〉恼{(diào)整也會(huì)導(dǎo)致堆內(nèi)存需要觸發(fā)FGC; 一般設(shè)置為128M就足夠;

棧內(nèi)存相關(guān)參數(shù)詳解:

  -Xss:指定線程的最大??臻g,默認(rèn)為1M

jvm垃圾收集算法:

  1.引用計(jì)數(shù)算法

    每個(gè)對(duì)象有一個(gè)引用計(jì)數(shù)屬性,新增一個(gè)引用計(jì)數(shù)加1,引用釋放時(shí)計(jì)數(shù)減1,計(jì)數(shù)為0可以回收。

    此方法簡(jiǎn)單,無(wú)法解決對(duì)象相互循環(huán)引用的問(wèn)題。還有一個(gè)問(wèn)題是如何解決精準(zhǔn)計(jì)數(shù)。

  2.根搜索算法(GC Roots)

    從GC Roots開(kāi)始向下搜索,搜索所走過(guò)的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈時(shí),則證明此對(duì)象是不可用的。

jvm垃圾回收算法:

  1.復(fù)制算法(Copying)

  2.標(biāo)記清除算法(Mark-Sweep)

  3.標(biāo)記整理壓縮算法(Mark-Compac)

  復(fù)制算法:

  采用從根集合掃描,并將存活對(duì)象復(fù)制到一塊新的沒(méi)有使用過(guò)的空間中,成本是需要一塊內(nèi)存交換空間

  此算法用于新生代內(nèi)存回收,從E區(qū)復(fù)制到S0或者S1

  標(biāo)記清除算法:

  采用從根集合掃描,對(duì)存活的對(duì)象標(biāo)記,標(biāo)記完畢后再掃描整個(gè)空間中未被標(biāo)記的對(duì)象,進(jìn)行回收。

  優(yōu)點(diǎn):在存活對(duì)象較多的情況下極為高效

  缺點(diǎn):標(biāo)記清除算法直接回收不存活的對(duì)象,會(huì)造成內(nèi)存碎片

  標(biāo)記整理壓縮算法:

  采用與標(biāo)記清除一樣的方式進(jìn)行對(duì)象的標(biāo)記,但在清除時(shí)不同,在回收不存活的對(duì)象后,會(huì)將所有存活

  對(duì)象往左端空閑空間移動(dòng),并更新對(duì)應(yīng)的指針。此算法在標(biāo)記清除的基礎(chǔ)上,又進(jìn)行了對(duì)象的移動(dòng)。

  優(yōu)點(diǎn):可以解決內(nèi)存碎片問(wèn)題

  缺點(diǎn):成本要比標(biāo)記清除算法要高

垃圾回收名詞解釋:

  1.串行回收(Serial)  --> gc單線程內(nèi)存回收,會(huì)暫停所有用戶線程,獨(dú)占式回收

  2.并行回收(Parallel)  --> 多個(gè)gc線程并行工作,會(huì)暫停所有用戶線程,獨(dú)占式回收

  3.并發(fā)回收(CMS) --> gc線程和用戶線程同時(shí)執(zhí)行,不需要停頓用戶線程(用戶線程還是需要停頓,只是很短)

GC串行回收器(Serial回收器):

  1.是一個(gè)單線程的收集器,只能使用一個(gè)CPU或一條線程去完成垃圾收集;在進(jìn)行垃圾收集時(shí),必須

     暫停所有其它工作線程。直到收集完成。

  2.缺點(diǎn):Stop-the-World

  3.優(yōu)勢(shì):簡(jiǎn)單,對(duì)于單CPU的情況,由于沒(méi)有多線程交互開(kāi)銷,反而更高效。

  開(kāi)啟方法:

    -XX:+UseSerialGC來(lái)開(kāi)啟

    使用此參數(shù)后:新生代和老年代都采用Serial回收器進(jìn)行垃圾回收

    新生代使用復(fù)制算法

    老年代使用標(biāo)記壓縮算法

GC并行回收器(ParNew回收器):

  1. 并行回收也是獨(dú)占式回收器,在收集過(guò)程中,應(yīng)用程序會(huì)全部暫停。但由于并行回收器使用多線程

   進(jìn)行垃圾回收,因此在并發(fā)能力比較強(qiáng)的CPU上,它產(chǎn)生的停頓時(shí)間要短于串行回收器。而在單

   CPU上或者并發(fā)能力較弱的系統(tǒng)中,回收效果不會(huì)比串行回收器好。

  開(kāi)啟方法:

   -XX:UserParNewGC

   使用此參數(shù)后:新生代使用并行回收收集器,老年代使用串行收集器

   -XX:ParallelGCThreads 可以指定線程數(shù)量,最好與CPU數(shù)量相當(dāng)

   新生代使用復(fù)制算法

新生代吞吐量?jī)?yōu)先回收器(Parallel Scavenge回收器):

  1.吞吐量?jī)?yōu)先回收器:關(guān)注CPU吞吐量,即運(yùn)行用戶代碼的時(shí)間/總時(shí)間,這種收集器能最高效率利用CPU。

  開(kāi)啟方法:

   -XX:UseParallelGC開(kāi)啟

   使用此參數(shù)后:將使用Parallel Scavenge+Serial Old收集器組合回收垃圾,這也是Server模式下的默認(rèn)值。

   -XX:GCTimeRation 可以設(shè)置用戶執(zhí)行時(shí)間占總時(shí)間的比例,默認(rèn)為99,即用1%時(shí)間進(jìn)行垃圾收集

   新生代使用復(fù)制算法

新生代吞吐量?jī)?yōu)先回收器(Parallel Scavenge回收器):老生代用Parallel Old算法

  開(kāi)啟方法:

   -XX:UseParallelOldGC開(kāi)啟

   使用Parallel Scavenge和Parallel Old組合收集器進(jìn)行收集

   老年代使用標(biāo)記整理算法

并發(fā)標(biāo)記清除回收器(CMS回收器):

  運(yùn)作過(guò)程分為4個(gè)階段:初始標(biāo)記,并發(fā)標(biāo)記,重新標(biāo)記,并發(fā)清除

  其中標(biāo)記和重新標(biāo)記兩個(gè)階段仍然需要Stop-The-World,其它過(guò)程中收集器和用戶線程是一起工作的

  啟動(dòng)方法:

   -XX:ParallelCMSMarkSweepGC

   使用此參數(shù)后:使用ParNew + CMS + Serial Old的組合進(jìn)行內(nèi)存回收。Serial Old作為CMS出現(xiàn)

   “Concurrent Mode Failure”失敗后的后備收集器使用。

  其它參數(shù):

   -XX:ParallelCMSThreads 手工設(shè)置CMS的線程數(shù)量

   -XX:CMSInitiatingOccupancyFraction:設(shè)置CMS收集器在老年代空間被使用多少后發(fā)出垃圾收集,默認(rèn)為68%,僅在CMS收集器時(shí)有效。

   -XX:CMSFullGCBeforeCompaction:設(shè)置CMS收集器在進(jìn)行若干次垃圾收集后再進(jìn)行一次內(nèi)存碎片整理過(guò)程,通常與-XX:CMSInitiatingOccupancyFraction一起使用

GC性能監(jiān)控指標(biāo):

  吞吐量 --> 應(yīng)用花在非GC上的時(shí)間百分比

  CG負(fù)荷 --> 與吞吐量相反,指應(yīng)用花在GC上的時(shí)間百分比

  暫停時(shí)間 --> 應(yīng)用花在GC stop-the-world的時(shí)間

  GC頻率 -->

  一個(gè)交互式的應(yīng)用要求暫停時(shí)間越少越好,非交互性應(yīng)用,要求GC負(fù)荷越低越好

  一個(gè)實(shí)時(shí)系統(tǒng)對(duì)暫停時(shí)間和GC負(fù)荷的要求都是越低越好

向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