詳解JVM中的GC調(diào)優(yōu)
那些GC的默認值
其實GC或者說JVM的參數(shù)非常非常的多,有控制內(nèi)存使用的:

有控制JIT的:

有控制分代比例的,也有控制GC并發(fā)的:

當然,大部分的參數(shù)其實并不需要我們自行去調(diào)整,JVM會很好的動態(tài)幫我們設(shè)置這些變量的值。
如果我們不去設(shè)置這些值,那么對GC性能比較有影響的參數(shù)和他們的默認值有哪些呢?
GC的選擇
我們知道JVM中的GC有很多種,不同的GC選擇對java程序的性能影響還是比較大的。
在JDK9之后,G1已經(jīng)是默認的垃圾回收器了。

我們看一下G1的調(diào)優(yōu)參數(shù)。
G1是基于分代技術(shù)的,其實JVM還在開發(fā)一些不再基于分代技術(shù)的GC算法,比如ZGC,我們可以根據(jù)需要來選擇適合我們的GC算法。
GC的最大線程個數(shù)
GC是由專門的GC線程來執(zhí)行的,并不是說GC線程越多越好,這個默認線程的最大值是由heap size和可用的CPU資源動態(tài)決定的。
當然你可以使用下面兩個選項來修改GC的線程:
-XX:ParallelGCThreads=threads 設(shè)置STW的垃圾收集線程數(shù)
-XX:ConcGCThreads = n 設(shè)置并行標記線程的數(shù)量
一般情況下ConcGCThreads可以設(shè)置為ParallelGCThreads的1/4。
初始化heap size
默認情況下加初始化的heap size是物理內(nèi)存的1/64。
你可以使用
-XX:InitialHeapSize=size
來重新設(shè)置。
最大的heap size
默認情況下最大的heap size是物理內(nèi)存的1/4。
你可以使用:
-XX:MaxHeapSize
來重新設(shè)置。
分層編譯技術(shù)
默認情況下分層編譯技術(shù)是開啟的。你可以使用:
-XX:-TieredCompilation
來關(guān)閉分層編譯。如果啟用了分層編譯,那么可能需要關(guān)注JIT中的C1和C2編譯器帶來的影響。
我們到底要什么
java程序在運行過程中,會發(fā)生很多次GC,那么我們其實是有兩種統(tǒng)計口徑:
1.平均每次GC執(zhí)行導(dǎo)致程序暫停的時間(Maximum Pause-Time Goal)。
2.總的花費在GC上的時間和應(yīng)用執(zhí)行時間的比例(Throughput Goal)。
最大暫停時間
單次GC的暫停時間是一個統(tǒng)計平均值,因為單次GC的時間其實是不可控的,但是取了平均值,GC就可以動態(tài)去調(diào)整heap的大小,或者其他的一些GC參數(shù),從而保證每次GC的時間不會超過這個平均值。
我們可以通過設(shè)置:
-XX:MaxGCPauseMillis=<nnn>
來控制這個值。
不管怎么設(shè)置這個參數(shù),總體需要被GC的對象肯定是固定的,如果單次GC暫停時間比較短,可能會需要減少heap size的大小,那么回收的對象也比較少。這樣就會導(dǎo)致GC的頻率增加。從而導(dǎo)致GC的總時間增加,影響程序的Throughput。
吞吐率
吞吐率是由花費在GC上的時間和應(yīng)用程序上的時間比率來決定的。
我們可以通過設(shè)置:
-XX:GCTimeRatio=nnn
來控制。
如果沒有達到throughput的目標,那么GC可能會去增加heap size,從而減少GC的執(zhí)行頻率。但是這樣會增加單次的Maximum Pause-Time。
如果throughput和maximum pause-time的參數(shù)同時都設(shè)置的話,JVM會去嘗試去動態(tài)減少heap size的大小,直到其中的一個目標不能滿足為止。
相對而言,G1更加偏重于最大暫停時間,而ZGC更加偏重于吞吐率。
以上就是詳解JVM中的GC調(diào)優(yōu)的詳細內(nèi)容,更多關(guān)于JVM中的GC調(diào)優(yōu)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mybatis 中 foreach collection的用法小結(jié)(三種)
這篇文章主要介紹了mybatis 中 foreach collection的用法小結(jié)(三種),需要的朋友可以參考下2017-10-10
SpringBoot+MybatisPlus實現(xiàn)sharding-jdbc分庫分表的示例代碼
本文主要介紹了SpringBoot+MybatisPlus實現(xiàn)sharding-jdbc分庫分表的示例代碼,以分庫,分表,分庫分表三種方式來實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-03-03

