java如何将线程与cpu的核绑定_JVM(13)年轻代垃圾回收器ParNew是如何工作的?
喜歡文章的可以關(guān)注下公眾號(hào)!謝謝支持!!
????之前的文章已經(jīng)把整個(gè)JVM的核心運(yùn)行原理梳理清楚了:
????【1】對(duì)象在新生代分配,什么時(shí)候會(huì)觸發(fā)Minor GC。? ?
????【2】觸發(fā)Minor GC之前會(huì)如何檢查老年代可用內(nèi)存大小和新生代對(duì)象大小,如何檢查老年代可用內(nèi)存大小和歷次Minor GC之后升入老年代的平均對(duì)象大小。
????【3】什么情況下Minor GC之前會(huì)提前觸發(fā)Full GC,什么情況下會(huì)直接觸發(fā)Minor GC。
????【4】Minor GC之后有哪幾種情況對(duì)象會(huì)進(jìn)入老年代。
????也大概知道了垃圾回收器、垃圾回收線程、垃圾回收算法之間的關(guān)系,包括垃圾回收的過(guò)程中的“Stop the World”現(xiàn)象和場(chǎng)景對(duì)系統(tǒng)運(yùn)行性能的影響。
? ? =>JVM(8)對(duì)象觸發(fā)回收的條件
????=>JVM(9)JVM的垃圾回收算法,以及優(yōu)劣
????=>JVM(10)年輕代和老年代適合的算法
????=>JVM(11)記錄一次JVM的問(wèn)題與優(yōu)化思路
????=>JVM(12)讓人無(wú)奈的"Stop the world"
????接下去的文章我們就要對(duì)常見(jiàn)的新生代和老年代的垃圾回收器的運(yùn)行原理進(jìn)行了解,以及常見(jiàn)的垃圾回收參數(shù)一般的設(shè)置方式。
????新生代垃圾回收器:ParNew
????一般來(lái)說(shuō),在之前沒(méi)有最新的G1垃圾回收器的話,線上系統(tǒng)都是ParNew垃圾回收器作為新生代的垃圾回收器。現(xiàn)在即使有了G1,其實(shí)很多線上系統(tǒng)還是用的ParNew。
????通常運(yùn)行在服務(wù)器上的Java系統(tǒng),都可以充分利用服務(wù)器的多核CPU的優(yōu)勢(shì),假設(shè)你的服務(wù)器是4核CPU,如果對(duì)新生代垃圾回收的時(shí)候,僅僅使用單線程進(jìn)行垃圾回收,是不是會(huì)導(dǎo)致沒(méi)法充分利用CPU資源?
????如上圖,在垃圾回收的時(shí)候,都把系統(tǒng)程序所有的工作線程全部停掉了,就一個(gè)垃圾回收線程在運(yùn)行,那么此時(shí)4核CPU的資源根本沒(méi)法充分利用,理論上4核CPU就可以支持4個(gè)垃圾回收線程并行執(zhí)行,可以提升4倍的性能!
????所以說(shuō),新生代的ParNew垃圾回收器就是多線程垃圾回收機(jī)制,另外一種Serial垃圾回收器是單線程垃圾回收,他們倆都是回收新生代的,唯一的區(qū)別就是單線程和多線程的區(qū)別,但是垃圾回收算法是完全一樣的。
????看下圖,ParNew垃圾回收器如果一旦在合適的時(shí)機(jī)執(zhí)行Minor GC的時(shí)候,就會(huì)把系統(tǒng)程序的工作線程全部停掉,禁止程序繼續(xù)運(yùn)行創(chuàng)建新的對(duì)象,然后自己就用多個(gè)垃圾回收線程去進(jìn)行垃圾回收,回收的機(jī)制和算法就跟之前文章介紹的是一樣的。
????如何為系統(tǒng)指定使用ParNew垃圾回收器?
????一般來(lái)說(shuō),對(duì)于系統(tǒng)部署啟動(dòng)的時(shí)候,我們有多種方式來(lái)設(shè)置JVM參數(shù)了,在IntelliJ IDEA中可以設(shè)置Debug JVM Arguments,使用“java -jar”命令啟動(dòng)時(shí)直接在后面跟上JVM參數(shù)即可。部署到Tomcat時(shí)可以在Tomcat的catalina.sh中設(shè)置Tomcat的JVM參數(shù),使用Spring Boot也可以在啟動(dòng)時(shí)指定JVM參數(shù)。
????在啟動(dòng)系統(tǒng)的時(shí)候如果要指定使用ParNew垃圾回收器,是用什么參數(shù)呢??
????很簡(jiǎn)單,使用“-XX:+UseParNewGC”選項(xiàng),JVM啟動(dòng)之后對(duì)新生代進(jìn)行垃圾回收的,就是ParNew垃圾回收器了。那么Minor GC的時(shí)機(jī),檢查機(jī)制,包括垃圾回收的具體過(guò)程,以及對(duì)象升入老年代的機(jī)制,都是我們之前介紹的那套原理,只需要知道,ParNew會(huì)使用多個(gè)線程來(lái)進(jìn)行垃圾回收。
????ParNew垃圾回收器默認(rèn)情況下的線程數(shù)量
????因?yàn)楝F(xiàn)在一般我們系統(tǒng)的服務(wù)器都是多核CPU的,所以為了在垃圾回收的時(shí)候充分利用多核CPU的資源,一旦我們指定了使用ParNew垃圾回收器之后,默認(rèn)給自己設(shè)置的垃圾回收線程的數(shù)量就是跟CPU的核數(shù)是一樣的。
????比如我們線上機(jī)器假設(shè)用的是4核CPU,或者8核CPU,或者16核CPU,那么此時(shí)ParNew的垃圾回收線程數(shù)就會(huì)分別是4個(gè)線程、8個(gè)線程、16個(gè)線程,這一般不用我們手動(dòng)去調(diào)節(jié),因?yàn)楦鶦PU核數(shù)一樣的線程數(shù)量,是可以充分進(jìn)行并行處理的。
????比如下圖,每個(gè)線程都通過(guò)一個(gè)CPU在運(yùn)行:
????但是如果你一定要自己調(diào)節(jié)ParNew的垃圾回收線程數(shù)量,也是可以的,使用“-XX:ParallelGCThreads”參數(shù)即可,通過(guò)他可以設(shè)置線程的數(shù)量。
????所以可以一起思考一個(gè)問(wèn)題,到底是用單線程垃圾回收好,還是多線程垃圾回收好?到底是Serial垃圾回收器好還是ParNew垃圾回收器好?
????啟動(dòng)系統(tǒng)的時(shí)候是可以區(qū)分服務(wù)器模式和客戶端模式的,如果你啟動(dòng)系統(tǒng)的時(shí)候加入“-server”就是服務(wù)器模式,如果加入“-cilent”就是客戶端模式。他們倆的區(qū)別就是,如果你的系統(tǒng)部署在比如4核8G的Linux服務(wù)器上,那么就應(yīng)該用服務(wù)器模式,如果你的系統(tǒng)是運(yùn)行在比如Windows上的客戶端程序,那么就應(yīng)該是客戶端模式。
????那么服務(wù)器模式和客戶端模式的區(qū)別是什么呢?
????服務(wù)器模式通常運(yùn)行我們的網(wǎng)站系統(tǒng)、電商系統(tǒng)、業(yè)務(wù)系統(tǒng)、APP后臺(tái)系統(tǒng)之類的大型系統(tǒng),一般都是多核CPU,所以此時(shí)如果要垃圾回收,那么肯定是用ParNew更好,因?yàn)槎嗑€程并行垃圾回收,充分利用多核CPU資源,可以提升性能。如下圖。
????如果你部署在服務(wù)器上,但是你用了單線程垃圾回收,那么就有一些CPU是被浪費(fèi)了,根本沒(méi)用上。比如下圖:
????那么如果Java程序是一個(gè)客戶端程序,比如類似百度云網(wǎng)盤的Windows客戶端,或者是有道云筆記的Windows客戶端。這種操作系統(tǒng)很多都是單核CPU,此時(shí)你如果要是還是用ParNew來(lái)進(jìn)行垃圾回收,就會(huì)導(dǎo)致一個(gè)CPU運(yùn)行多個(gè)線程,反而加重了性能開(kāi)銷,可能效率還不如單線程好,因?yàn)閱蜟PU運(yùn)行多線程會(huì)導(dǎo)致頻繁的線上上下文切換,有效率開(kāi)銷,如下圖:
????所以是類似于那種運(yùn)行在Windows上的客戶端程序,建議采用Serial垃圾回收器,單CPU單線程垃圾回收即可,反而效率更高,如下圖。
????現(xiàn)在一般很少有用Java寫客戶端程序的,幾乎很少見(jiàn),Java現(xiàn)在主要是用來(lái)構(gòu)建復(fù)雜的大規(guī)模后端業(yè)務(wù)系統(tǒng)的,所以常見(jiàn)的還是用“-server”指定為服務(wù)器模式,然后配合ParNew多線程垃圾回收器。
????但還是建議應(yīng)該清楚單線程和多線程對(duì)垃圾回收的適用場(chǎng)景。
???? 如果大家對(duì)這塊有更好的見(jiàn)解以及問(wèn)題,或者本文有書寫錯(cuò)誤的地方,也可以進(jìn)行評(píng)論交流。點(diǎn)點(diǎn)關(guān)注哦!!!謝謝支持!
總結(jié)
以上是生活随笔為你收集整理的java如何将线程与cpu的核绑定_JVM(13)年轻代垃圾回收器ParNew是如何工作的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 建行参考码大全ybla_52度五粮液价格
- 下一篇: 邀请合作如何表达_有偿兼职!土木在线全媒