www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]簡介 JVM的參數(shù)有很多很多,根據(jù)我的統(tǒng)計JDK8中JVM的參數(shù)總共有1853個,正式的參數(shù)也有680個。 這么多參數(shù)帶給我們的是對JVM的細(xì)粒度的控制,但是并不是所有的參數(shù)都需要我們自己去調(diào)節(jié)的,我們需要關(guān)注的是一些最常用的,對性能影響比較大的GC參數(shù)即可。 為了


簡介


JVM的參數(shù)有很多很多,根據(jù)我的統(tǒng)計JDK8中JVM的參數(shù)總共有1853個,正式的參數(shù)也有680個。


這么多參數(shù)帶給我們的是對JVM的細(xì)粒度的控制,但是并不是所有的參數(shù)都需要我們自己去調(diào)節(jié)的,我們需要關(guān)注的是一些最常用的,對性能影響比較大的GC參數(shù)即可。


為了更好的讓大家理解JDK8中 GC的調(diào)優(yōu)的秘籍,這里特意準(zhǔn)備了八張圖。在本文的最后,還附帶了一個總結(jié)的PDF all in one文檔,大家把PDF下載回去,遇到問題就看兩眼,不美嗎?



分代垃圾回收器的內(nèi)存結(jié)構(gòu)


為了更好的提升GC的效率,現(xiàn)代的JVM都是采用的分代垃圾回收的策略(ZGC不是)。

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!


java運行時內(nèi)存可以分為JVM內(nèi)存和非JVM內(nèi)存。


JVM內(nèi)存又可以分為堆內(nèi)存和非堆內(nèi)存。


堆內(nèi)存大家都很熟悉了,YoungGen中的Eden,Survivor和OldGen。


非堆內(nèi)存中存儲的有thread Stack,Code Cache, NIO Direct Buffers,Metaspace等。


注意這里的Metaspace元空間是方法區(qū)在JDK8的實現(xiàn),它是在本地內(nèi)存中分配的。



JDK8中可用的GC


JDK8中到底有哪些可以使用的GC呢?


這里我們以HotSpot JVM為例,總共可以使用4大GC方式:

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!


其中對于ParallelGC和CMS GC又可以對年輕代和老年代分別設(shè)置GC方式。


大家看到上圖可能有一個疑問,Parallel scavenge和Parallel有什么區(qū)別呢?


其實這兩個GC的算法是類似的,Parallel Scavenge收集器也經(jīng)常稱為“吞吐量優(yōu)先”收集器,Parallel Scavenge收集器提供了兩個參數(shù)用于精確控制吞吐量; -XX:MaxGCPauseMillis:控制最大垃圾收集停頓時間; -XX:GCTimeRatio:設(shè)置吞吐量大小。


同時Parallel Scavenge收集器能夠配合自適應(yīng)調(diào)節(jié)策略,把內(nèi)存管理的調(diào)優(yōu)任務(wù)交給虛擬機去完成。

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!

JDK8中默認(rèn)開啟的是ParallelGC。

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!


打印GC信息


如果想研究和理解GC的內(nèi)部信息,GC信息打印是少不了的:

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!


上圖提供了一些非常有用的GC日志的控制參數(shù)。



內(nèi)存調(diào)整參數(shù)


JVM分為Heap區(qū)和非Heap區(qū),各個區(qū)又有更細(xì)的劃分,下面就是調(diào)整各個區(qū)域大小的參數(shù):

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!




Thread配置


TLAB大家還記得嗎?


如果一個對象的分配是在方法內(nèi)部,并且沒有多線程訪問的情況下,那么這個對象其實可以看做是一個本地對象,這樣的對象不管創(chuàng)建在哪里都只對本線程中的本方法可見,因此可以直接分配在??臻g中。


棧上分配的對象因為不用考慮同步,所以執(zhí)行速度肯定會更加快速,這也是為什么JVM會引入棧上分配的原因。

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!


上圖就是TLAB的參數(shù)。



通用GC參數(shù)


雖然JDK8的GC這么多,但是他們有一些通用的GC參數(shù):

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!


這里講解一下Young space tenuring,怎么翻譯我不是很清楚,這個主要就是指Young space中的對象經(jīng)過多少次GC之后會被提升到Old space中。



CMS GC


CMS全稱是Concurrent mark sweep。是一個非常非常復(fù)雜的GC。


復(fù)雜到什么程度呢?光光是CMS調(diào)優(yōu)的參數(shù)都有一百多個!


下圖是常用的CMS的參數(shù)。

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!


CMS這里就不多講了,因為在JDK9之后,CMS就已經(jīng)被廢棄了。


主要原因是CMS太過復(fù)雜,如果要向下兼容需要巨大的工作量,然后就直接被廢棄了。


在JDK9之后,默認(rèn)的GC是G1。



G1參數(shù)


G1收集器是分代的和region化的,也就是整個堆內(nèi)存被分為一系列大小相等的region。在啟動時,JVM設(shè)置region的大小,根據(jù)堆大小的不同,region的大小可以在1MB到32MB之間變動,region的數(shù)量最多不超過2048個。Eden區(qū)、Survivor區(qū)、老年代是這些region的邏輯集合,它們并不是連續(xù)的。


G1中的垃圾收集過程:年輕代收集和混合收集交替進行,背后有全局的并發(fā)標(biāo)記周期在進行。


當(dāng)老年代分區(qū)占用的空間達到或超過初始閾值,就會觸發(fā)并發(fā)標(biāo)記周期。


下圖是G1的調(diào)優(yōu)參數(shù):

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!

特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!

長按訂閱更多精彩▼

八張圖徹底了解JDK8 GC調(diào)優(yōu)秘籍!

如有收獲,點個在看,誠摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉