溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java虛擬機(jī)中如何進(jìn)行性能調(diào)優(yōu)

發(fā)布時(shí)間:2022-01-17 15:49:41 來(lái)源:億速云 閱讀:98 作者:kk 欄目:大數(shù)據(jù)

這篇文章的內(nèi)容主要圍繞Java虛擬機(jī)中如何進(jìn)行性能調(diào)優(yōu)進(jìn)行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!

一.  如何找到一個(gè)垃圾?

1)  引用計(jì)數(shù)算法:給對(duì)象添加一個(gè)引用計(jì)數(shù)器,有一次引用,計(jì)數(shù)器值就加1;當(dāng)引用失效時(shí),計(jì)數(shù)器值就減1。很多流程的編程語(yǔ)言例如Python都使用這種方法管理內(nèi)存,但是主流的Java虛擬機(jī)沒有選用它,主要原因是它很難解決對(duì)象之間相互循環(huán)引用的問題。

2)  根可達(dá)性分析算法:因?yàn)橐糜?jì)數(shù)算法無(wú)法解決對(duì)象之間相互循環(huán)引用的問題,繼而引出了這個(gè)算法。思想是以GC Roots作為起始點(diǎn)開始向下搜索,所走過的路徑成為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈時(shí),則這個(gè)對(duì)象是不可用的,就是垃圾。

二.  找到一個(gè)垃圾后,如何清除它?

1)  Mark-Sweep(標(biāo)記清除):先標(biāo)記出可回收的對(duì)象,然后清除。如下黑色部分為可回收對(duì)象,灰色部分為存活對(duì)象,綠色部分為未使用對(duì)象。

它的主要不足有兩個(gè):

1. 標(biāo)記和清除兩個(gè)過程的效率都不高

2. 另一個(gè)是空間的問題,標(biāo)記清除之后產(chǎn)生了大量不連續(xù)的內(nèi)存碎片,碎片會(huì)導(dǎo)致以后需要分配較大對(duì)象時(shí),無(wú)法找到足夠的連續(xù)內(nèi)存,繼而提前觸發(fā)另一次垃圾收集動(dòng)作。

2)  Copying(拷貝):將內(nèi)存劃分為兩塊,將存活對(duì)象全部copy到下面的區(qū)域,然后把上面的全部清除。

新生代中的Survivor1和Survivor2就是這樣的。

缺點(diǎn):浪費(fèi)內(nèi)存

3)  Mark-Compact(標(biāo)記壓縮或者標(biāo)記整理):既不想碎片化,又不想浪費(fèi)內(nèi)存,就先將回收的對(duì)象標(biāo)記起來(lái),然后一邊回收,一邊把存活對(duì)象向一端移動(dòng)。

缺點(diǎn):效率偏低

3. CMS 全稱 ConcurrentMarkSweep 老年代 并發(fā)的,垃圾回收和應(yīng)用程序同時(shí)進(jìn)行,降低STW的時(shí)間(200ms),CMS問題很多,所以沒有一個(gè)版本默認(rèn)是CMS,只能手動(dòng)設(shè)定。CMS既然是MarkSweep,就一定會(huì)有碎片化的問題,碎片達(dá)到一定的程度,CMS老年代分配對(duì)象分配不下的時(shí)候,使用Serial Old進(jìn)行老年代回收。(面試重災(zāi)區(qū))

主要有四個(gè)過程:

初始標(biāo)記、并發(fā)標(biāo)記、重新標(biāo)記、并發(fā)清理

CMS的缺點(diǎn)是:產(chǎn)生了浮動(dòng)垃圾,并且使用Serial Old來(lái)清理整個(gè)老年代,這是CMS設(shè)計(jì)的缺陷;但是如果CMS做好調(diào)優(yōu),支持的內(nèi)存要比Parallel Old大的多。

想象一下:

PS + PO -> 加內(nèi)存 換垃圾回收器 -> PN + CMS + Serial Old (幾個(gè)小時(shí)-幾天的STW) ,幾十個(gè)G 的內(nèi)存,單線程的回收 -> G1 + Full GC  幾十個(gè)G -> 上T內(nèi)存的服務(wù)器 ZGC 

CMS并發(fā)標(biāo)記采用的是: 三色標(biāo)記法 + Incremental Update

4.  G1 垃圾回收器 (200ms - 10 ms)

算法:三色標(biāo)記 + SATB

由于越來(lái)越多的內(nèi)存需要回收,必然會(huì)產(chǎn)生STW,所以G1應(yīng)運(yùn)而生。

邏輯分代,物理不分代。

4.  ZGC (10ms - 1ms )  PK C++

算法:ColoredPointers + LoadBarrier

5.  Shenandoah

算法:ColorPointers + WriteBarrier

CMS中新生代的默認(rèn)年齡是6,PS/PO中新生代的默認(rèn)年齡是15,進(jìn)入老年代,可以通過參數(shù):-XX:MaxTenuringThreshold配置

jdk1.0自帶的Serial和Serial Old,現(xiàn)在用的最多的是Parallel Scavenge和Parallel Old,調(diào)優(yōu)用的是ParNew和CMS,jdk1.8用G1也沒有問題

jdk1.8默認(rèn)是Parallel Scavenge和Parallel Old,不管是單線程Serial還是并行Parallel,只要人多,都會(huì)出現(xiàn)問題,所以就有了承前啟后的ParNew和CMS。

Java的特點(diǎn)有哪些

Java的特點(diǎn)有哪些 1.Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。

感謝你的閱讀,相信你對(duì)“Java虛擬機(jī)中如何進(jìn)行性能調(diào)優(yōu)”這一問題有一定的了解,快去動(dòng)手實(shí)踐吧,如果想了解更多相關(guān)知識(shí)點(diǎn),可以關(guān)注億速云網(wǎng)站!小編會(huì)繼續(xù)為大家?guī)?lái)更好的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI