JAVA應(yīng)用性能監(jiān)控之JVM層GC調(diào)優(yōu)

1. JVM內(nèi)存結(jié)構(gòu)

1.1 運行時數(shù)據(jù)區(qū)

程序計數(shù)器PC Register:JVM支持多線程同時執(zhí)行,每一個線程都有自己的PC Register,線程正在執(zhí)行的方法叫做當前方法,如果是java代碼,PC Register里面存放的就是房錢正在執(zhí)行的指令的地址,如果你是C代碼审孽,則為空。

Java虛擬機棧(Java Virtual Machine Stacks)是線程私有的浑娜,它的生命周期與線程相同佑力。虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀,用于存儲局部變量表棚愤、操作數(shù)棧搓萧、動態(tài)鏈接、方法出口燈信息宛畦。每一個方法從調(diào)用直至執(zhí)行完成的過程瘸洛,就對應(yīng)著一個棧幀在虛擬機棧中入棧到出棧的過程。

Java堆(Java Heap)是Java虛擬機所管理的內(nèi)存中最大的一塊次和。堆是被所有線程共享的一塊內(nèi)存區(qū)域反肋,在虛擬機啟動時創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實例踏施,幾乎所有的對象實例都在這里分配內(nèi)存石蔗。Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可畅形。

方法區(qū)(Method Area):方法區(qū)域java堆一樣养距,是各個線程共享的內(nèi)存區(qū)域,它用于存儲已被虛擬機加載的類信息日熬、常亮棍厌、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。雖然Java虛擬機規(guī)范把方法區(qū)描述為堆的一個邏輯部分耘纱,但是它卻有一個別名叫做Non-Heap(非堆)敬肚,目的是與Java堆區(qū)分開來。

運行時常量池(Runtime Constant Pool)是方法區(qū)的一部分束析。Class文件中除了有類的版本艳馒、字段、方法员寇、接口等描述信息外弄慰,還有一項信息是常量池(Constant Pool Table),用于存放編譯器生成的各種字面量和符號引用丁恭,這部分內(nèi)容將在類加載后進入方法區(qū)的常量池中存放曹动。

本地方法棧(Native Method Stacks)與虛擬機棧所放回的作用是非常相似的,它們之間的區(qū)別不過是虛擬機棧為虛擬機執(zhí)行的Java方法(也就是字節(jié)碼)服務(wù)牲览,而本地方法棧則為虛擬機使用到的Native方法服務(wù)。

1.2 JVM的內(nèi)存結(jié)構(gòu)

實例:

啟用壓縮類空間:

jstat -gc 13144

禁用壓縮類空間:

jstat -gc 13523

codecache也是一樣操作恶守。

-xint

常用參數(shù):

-Xms-Xmx

-XX:NewSize -XX:MaxNewSize

-XX:NewRatio -XX:SurvivorRatio

-XX:MetaspaceSize -XX:MaxMetaspaceSize

-XX:+UseCompressedClassPointers

-XX:CompressedClassSpaceSize

-XX:InitialCodeCacheSize

-XX:ReservedCodeCacheSize

2. 垃圾回收算法

2.1 如何確定垃圾

2.2 各類算法

對象分配:

對象優(yōu)先分配在Eden區(qū)第献。

大對象直接進入老年代:-XX:PretenureSizeThreshold,該參數(shù)規(guī)定多大的對象會直接分配在老年代兔港。

長期存活對象進入老年代:?

-XX:MaxTenuringThreshold 晉升閾值?

-XX:+PrintTenuringDistribution 發(fā)生Young GC時候庸毫,打印存活對象的年齡的分布情況?

-XX:TargetSurivorRatio 設(shè)置Surivor區(qū),Young區(qū)垃圾回收后存活對象的比例衫樊,假設(shè)該值設(shè)置為80%飒赃,意味著發(fā)生一次Young GC,Surivor區(qū)存活對象為80%科侈,這時候需要計算這些80%存活對象的平均年齡载佳,用平均年齡和晉升閾值之間取一個最小值,如果有對象年齡大于該最小值臀栈,也會將該對象晉升到老年代蔫慧。

3. 垃圾收集器

3.1 三種類型垃圾收集器

串行收集器Serial:Serial、Serial Old权薯。單線程姑躲,適用于內(nèi)存小的嵌入式設(shè)備。

并行收集器Parallel:Paralel Scavenge盟蚣、Parallel Old黍析,吞吐量優(yōu)先。

并發(fā)收集器Concurrent:CMS屎开、G1阐枣,停頓時間優(yōu)先。

3.2 并行VS并發(fā)

并行是指多條垃圾收緊線程并行工作,但此時用戶線程仍然處于等待狀態(tài)侮繁。適合科學計算虑粥、后臺處理等弱交互場景。

并發(fā)指用戶線程與垃圾收集線程同時執(zhí)行(但不一定是并行的宪哩,可能會交替執(zhí)行)娩贷,垃圾收集線程在執(zhí)行的時候不會停頓用戶程序的運行。適合對響應(yīng)時間有要求的場景锁孟,比如Web彬祖。

3.3 停頓時間VS吞吐量

停頓時間:垃圾收集器做垃圾回收中斷應(yīng)用執(zhí)行的時間,-XX:MaxGCPauseMillis

吞吐量:花在垃圾收集的時間和花在應(yīng)用時間的占比品抽。-XXGCTimeRatio=<n>储笑,來及收集時間占:1/1+n。

3.4 如何評價一個垃圾回收器的好壞

3.5 三種類型垃圾收集器開啟與停用

串行收集器:

并行收集器:

并發(fā)收集器:

3.6 垃圾收集器搭配

有連線的是可以相互搭配使用圆恤。

JDK8推薦使用G1突倍,性能比較好,在Yong區(qū)和Old區(qū)都可以使用盆昙。

虛線表示CMS可能退化成SerialOld羽历,空間擔保分配失敗。

如何選擇垃圾收集器淡喜?

優(yōu)先調(diào)整堆的大小秕磷,讓JVM自己來選擇;

如果內(nèi)存小于100M炼团,使用串行收集器澎嚣;

如果是單核,并沒有停頓時間的要求瘟芝,串行或JVM自己選易桃;

如果允許停頓時間超過1秒,選擇并行或JVM自己選模狭;

如果響應(yīng)時間非常重要颈抚,并且不能超過1秒,使用并發(fā)收集器嚼鹉;

3.7 兩種常用垃圾收集器

3.7.1 Parallel Collector

工作原理:當發(fā)現(xiàn)內(nèi)存不夠時贩汉,暫停應(yīng)用程序,啟動多個垃圾回收線程來回收垃圾锚赤,垃圾回收結(jié)束后匹舞,重新啟動應(yīng)用程序。

-XX:+UseParallelGC 手動開啟线脚,server模式默認開啟赐稽;

-XX:ParallelGCThreads=<n> 開啟多少個GC線程叫榕;

并行收集器的自適應(yīng)特性(Parallel Collector Ergonomics),會自動調(diào)整堆得大小姊舵,來自適應(yīng)調(diào)整滿足我們設(shè)定的指標:

-XX:MaxGCPauseMills=<n> 最大停頓時間晰绎;

-XX:GCTimeRatio=<n> 吞吐量;

-Xmx 堆的大欣ǘ 荞下;?

優(yōu)先滿足停頓時間要求,然后滿足吞吐量要求史飞,如果兩個都滿足的話尖昏,它會減小堆得大小,來滿足停頓時間的要求构资,直到這三個條件中有一個是滿足不了的抽诉。自適應(yīng)其實不是最優(yōu)的,因為它需要動態(tài)調(diào)整堆得大小來滿足這些條件吐绵。?

動態(tài)內(nèi)存調(diào)整?

并行收集器在自適應(yīng)的時候會動態(tài)調(diào)整內(nèi)存迹淌;

-XX:YongGenerationSizeIncrement=<Y> Yong區(qū)動態(tài)調(diào)整每次增加的大小,默認20%拦赠;

-XX:TenuredGenerationSizeIncrement=<T> Old區(qū)動態(tài)調(diào)整每次增加的大小巍沙,默認20%;

-XX:AdaptiveSizeDecrementScaleFactor= 動態(tài)減小時每次減小的大小荷鼠,默認4%;?

在生產(chǎn)環(huán)境下很少使用自適應(yīng)功能榔幸,主要通過手動調(diào)整允乐。

3.7.2 CMS Collector

(1)CMS垃圾收集過程

由于篇幅限制原因,更多關(guān)于jvm知識點的學習思維導(dǎo)圖以及上面垃圾收集的高清大圖可以私信筆者“jvm”領(lǐng)取

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末削咆,一起剝皮案震驚了整個濱河市牍疏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拨齐,老刑警劉巖鳞陨,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞻惋,居然都是意外死亡厦滤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門歼狼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掏导,“玉大人,你說我怎么就攤上這事羽峰√伺兀” “怎么了添瓷?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長值纱。 經(jīng)常有香客問我鳞贷,道長,這世上最難降的妖魔是什么虐唠? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任搀愧,我火速辦了婚禮,結(jié)果婚禮上凿滤,老公的妹妹穿的比我還像新娘妈橄。我一直安慰自己,他們只是感情好翁脆,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布眷蚓。 她就那樣靜靜地躺著,像睡著了一般反番。 火紅的嫁衣襯著肌膚如雪沙热。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天罢缸,我揣著相機與錄音篙贸,去河邊找鬼。 笑死枫疆,一個胖子當著我的面吹牛爵川,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播息楔,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼寝贡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了值依?” 一聲冷哼從身側(cè)響起圃泡,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愿险,沒想到半個月后颇蜡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡辆亏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年风秤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褒链。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡唁情,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甫匹,到底是詐尸還是另有隱情甸鸟,我是刑警寧澤惦费,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站抢韭,受9級特大地震影響薪贫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刻恭,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一瞧省、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳍贾,春花似錦鞍匾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咆爽,卻和暖如春梁棠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斗埂。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工符糊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呛凶。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓男娄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漾稀。 傳聞我的和親對象是個殘疾皇子沪伙,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準確的地方县好,同時不同JDK版本的...
    高廣超閱讀 15,564評論 3 83
  • Java 虛擬機內(nèi)存模型 程序計數(shù)器- Program Counter Register是一塊很小內(nèi)存空間。 由于...
    AlbenXie閱讀 512評論 0 2
  • 第二部分 自動內(nèi)存管理機制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運行數(shù)據(jù)區(qū)域 程序計數(shù)器:當前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,134評論 0 2
  • Java 虛擬機有自己完善的硬件架構(gòu), 如處理器暖混、堆棧缕贡、寄存器等,還具有相應(yīng)的指令系統(tǒng)拣播。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,685評論 0 10
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory晾咪,是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用贮配,...
    Aimerwhy閱讀 732評論 0 1