您好,登錄后才能下訂單哦!
這篇文章的內(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)有哪些 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)更好的文章!
免責(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)容。