java性能優(yōu)化四種常見垃圾收集器匯總
前言
本篇文章我們來(lái)具體看看如何選擇合適的垃圾收集器。每種垃圾收集器都有其不同的算法實(shí)現(xiàn)和步驟,下面我們簡(jiǎn)單描述下我們常見的四種垃圾收集器的算法過(guò)程,感興趣的同學(xué)們最好先看下以下的兩篇文章去增加理解。分別介紹了一些垃圾回收的基本概念,和各種垃圾回收器回收的過(guò)程,內(nèi)容重復(fù),本章不會(huì)在去單獨(dú)講解一遍。所以本章做一些歸納總結(jié)。
常見的垃圾回收器和算法
相信大家可以通過(guò)我提供的另外兩個(gè)文章,學(xué)習(xí)到很多的垃圾回收器的相關(guān)知識(shí)。而我們真正需要關(guān)注,甚至可能使用到的垃圾收集器就是以下四種:
serial 串行垃圾收集器
如果是在client
型的虛擬機(jī)或者在單核
的服務(wù)器上,這種垃圾回收器將會(huì)成為默認(rèn)的垃圾回收器。無(wú)論是Minor GC 還是 Full GC ,所有的應(yīng)用線程都會(huì)暫停。在老年代當(dāng)中使用的是Serial Old,同樣是單線程的老年代版本。
client型虛擬機(jī),我們前面提到過(guò)編譯類型分為client和server,jvm會(huì)通過(guò)client編譯器(單線程)將代碼編譯成jvm識(shí)別的字節(jié)碼。
可以通過(guò)如下標(biāo)志表示:
-XX:+UseSerialGC
Parallel 多線程垃圾收集器
在server型虛擬機(jī)或多線程服務(wù)器上,jdk8默認(rèn)使用的垃圾收集器類型。
無(wú)論是Minor GC還是Full GC都使用多線程的方式去回收垃圾,這兩種GC都會(huì)造成應(yīng)用線程的暫停。但是它具有更多的吞吐量,是對(duì)于響應(yīng)時(shí)間沒有過(guò)多要求情況下,最合適的垃圾回收器。
可以通過(guò)如下標(biāo)志查看其狀態(tài):
年輕代:
-XX:+UseParallelGC
老年代:
-XX:+UseParallelOldGC
CMS 收集器
其設(shè)計(jì)初衷是為了減少serial和parallel收集器,在回收時(shí)造成的長(zhǎng)時(shí)間的系統(tǒng)卡頓。
它在發(fā)生Minor GC時(shí)同樣會(huì)暫停所有的應(yīng)用線程,不同之處在于,年輕代使用的不是parallel或者serial,而是使用一款專門適用于CMS的年輕代收集器ParNew
。
可以通過(guò)下面的標(biāo)志查看:
-XX:+UseParNewGC
CMS在發(fā)生Full GC時(shí)不再暫停全部應(yīng)用線程,使用多線程的方式,和應(yīng)用線程同時(shí)運(yùn)行,清理不在使用的對(duì)象。這事得CMS垃圾收集器的停頓時(shí)間得到大大的降低。與Parellel收集器相比,極其明顯。
缺點(diǎn):
- CMS需要占用較多的CPU資源,確保在應(yīng)用線程運(yùn)行時(shí),gc線程不斷地掃描堆空間。
- 不會(huì)對(duì)內(nèi)存進(jìn)行壓縮整理,導(dǎo)致內(nèi)存碎片化。
如果沒有足夠的CPU資源,或者內(nèi)存碎片化達(dá)到極限,將會(huì)退化成serial
收集器。
可以通過(guò)下面的標(biāo)志查看:
-XX:+UseConcMarkSweepGC
G1 收集器
也可以稱作垃圾優(yōu)先收集器
(garbage first)。
設(shè)計(jì)初衷是為了盡量減少處理超大堆(4gb)時(shí)發(fā)生的卡頓。G1仍然屬于分代收集器,但是不同之處是它是邏輯分代
。G1將堆空間劃分成若干個(gè)區(qū)域(Region),新生代的垃圾收集依然采用暫停所有應(yīng)用線程的方式,將存活對(duì)象拷貝到老年代或者Survivor空間。老年代也分成很多區(qū)域,G1收集器通過(guò)將對(duì)象從一個(gè)區(qū)域復(fù)制到另外一個(gè)區(qū)域,完成了清理工作。這樣就解決了CMS中的內(nèi)存碎片問(wèn)題。
與CMS相同,G1也屬于concurrent收集器,在老年代發(fā)生Full GC時(shí),由后臺(tái)線程完成回收工作,不需要暫停應(yīng)用線程。
通過(guò)下面的標(biāo)志查看:
-XX:+UseG1GC
其實(shí)上面的內(nèi)容都是簡(jiǎn)單描述,真正的實(shí)現(xiàn)細(xì)節(jié)請(qǐng)看開篇提供的文章。
顯式垃圾收集
這里說(shuō)的顯式的垃圾收集,其實(shí)指的是手動(dòng)觸發(fā)的垃圾回收,如下所示:
System.gc;
這是一種可以認(rèn)為控制,讓jvm發(fā)生強(qiáng)制gc的方式。無(wú)論什么時(shí)候,都是不建議使用這種方式進(jìn)行垃圾回收。
當(dāng)你使用這條指定,不論是何種垃圾收集器,哪怕是CMS或G1也會(huì)發(fā)生Full GC,同時(shí)停止全部的應(yīng)用線程,會(huì)卡頓相當(dāng)長(zhǎng)的一段時(shí)間。
例外情況:
- 性能分析、測(cè)試
- 堆分析
在上述情況,調(diào)用System.gc將能更好的幫助我們分析當(dāng)前應(yīng)用存在的問(wèn)題。
到此這篇關(guān)于java性能優(yōu)化四種常見垃圾收集器匯總的文章就介紹到這了,更多相關(guān)java垃圾收集器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java獲取一維數(shù)組的最小值實(shí)現(xiàn)方法
這篇文章主要介紹了Java獲取一維數(shù)組的最小值實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02spring的pointcut正則表達(dá)式的實(shí)現(xiàn)
本文主要介紹了spring的pointcut正則表達(dá)式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08MybatisPlus結(jié)合groupby實(shí)現(xiàn)分組和sum求和的步驟
這篇文章主要介紹了MybatisPlus結(jié)合groupby實(shí)現(xiàn)分組和sum求和的步驟,這次使用的是LambdaQueryWrapper,使用QueryWrapper相對(duì)來(lái)說(shuō)簡(jiǎn)單點(diǎn)就不寫了,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2023-12-12JDK動(dòng)態(tài)代理過(guò)程原理及手寫實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理過(guò)程原理及手寫實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Spring Boot 啟動(dòng)注解過(guò)程分析
這篇文章主要為大家介紹了Spring Boot 啟動(dòng)注解過(guò)程示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06SpringMVC?RESTFul實(shí)體類創(chuàng)建及環(huán)境搭建
這篇文章主要為大家介紹了SpringMVC?RESTFul實(shí)體類創(chuàng)建及環(huán)境搭建詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05解決JavaWeb讀取本地json文件以及亂碼的問(wèn)題
今天小編就為大家分享一篇解決JavaWeb讀取本地json文件以及亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06