判斷對(duì)象是否已死就是找出哪些對(duì)象是已經(jīng)死掉的,以后不會(huì)再用到的,就像地上有廢紙、飲料瓶和百元大鈔,掃地前要先判斷出地上廢紙和飲料瓶是垃圾,百元大鈔不是垃圾。判斷對(duì)象是否已死有引用計(jì)數(shù)算法和可達(dá)性分析算法。
雁峰ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!1.引用計(jì)數(shù)算法
給每一個(gè)對(duì)象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器值加 1;每當(dāng)有一個(gè)地方不再引用它時(shí),計(jì)數(shù)器值減 1,這樣只要計(jì)數(shù)器的值不為 0,就說明還有地方引用它,它就不是無用的對(duì)象。如下圖,對(duì)象 2 有 1 個(gè)引用,它的引用計(jì)數(shù)器值為 1,對(duì)象 1有兩個(gè)地方引用,它的引用計(jì)數(shù)器值為 2 。
這種方法看起來非常簡單,但目前許多主流的虛擬機(jī)都沒有選用這種算法來管理內(nèi)存,原因就是當(dāng)某些對(duì)象之間互相引用時(shí),無法判斷出這些對(duì)象是否已死,如下圖,對(duì)象 1 和對(duì)象 2 都沒有被堆外的變量引用,而是被對(duì)方互相引用,這時(shí)他們雖然沒有用處了,但是引用計(jì)數(shù)器的值仍然是 1,無法判斷他們是死對(duì)象,垃圾回收器也就無法回收。
2.可達(dá)性分析算法
了解可達(dá)性分析算法之前先了解一個(gè)概念——GC Roots,垃圾收集的起點(diǎn),可以作為 GC Roots 的有虛擬機(jī)棧中本地變量表中引用的對(duì)象、方法區(qū)中靜態(tài)屬性引用的對(duì)象、方法區(qū)中常量引用的對(duì)象、本地方法棧中 JNI(Native 方法)引用的對(duì)象。
當(dāng)一個(gè)對(duì)象到 GC Roots 沒有任何引用鏈相連(GC Roots 到這個(gè)對(duì)象不可達(dá))時(shí),就說明此對(duì)象是不可用的,是死對(duì)象。
如下圖:object1、object2、object3、object4 和 GC Roots 之間有可達(dá)路徑,這些對(duì)象不會(huì)被回收,但 object5、object6、object7 到 GC Roots 之間沒有可達(dá)路徑,這些對(duì)象就被判了死刑。
2.復(fù)制算法
把內(nèi)存分為大小相等的兩塊,每次存儲(chǔ)只用其中一塊,當(dāng)這一塊用完了,就把存活的對(duì)象全部復(fù)制到另一塊上,同時(shí)把使用過的這塊內(nèi)存空間全部清理掉,往復(fù)循環(huán),如下圖。
缺點(diǎn):實(shí)際可使用的內(nèi)存空間縮小為原來的一半,比較適合。
3.標(biāo)記-整理算法
先對(duì)可用的對(duì)象進(jìn)行標(biāo)記,然后所有被標(biāo)記的對(duì)象向一段移動(dòng),最后清除可用對(duì)象邊界以外的內(nèi)存,如下圖。
4.分代收集算法
把堆內(nèi)存分為新生代和老年代,新生代又分為 Eden 區(qū)、From Survivor 和 To Survivor。一般新生代中的對(duì)象基本上都是朝生夕滅的,每次只有少量對(duì)象存活,因此采用復(fù)制算法,只需要復(fù)制那些少量存活的對(duì)象就可以完成垃圾收集;老年代中的對(duì)象存活率較高,就采用標(biāo)記-清除和標(biāo)記-整理算法來進(jìn)行回收。
在這些區(qū)域的垃圾回收大概有如下幾種情況:
大多數(shù)情況下,新的對(duì)象都分配在Eden區(qū),當(dāng) Eden 區(qū)沒有空間進(jìn)行分配時(shí),將進(jìn)行一次 Minor GC,清理 Eden 區(qū)中的無用對(duì)象。清理后,Eden 和 From Survivor 中的存活對(duì)象如果小于To Survivor 的可用空間則進(jìn)入To Survivor,否則直接進(jìn)入老年代);Eden 和 From Survivor 中還存活且能夠進(jìn)入 To Survivor 的對(duì)象年齡增加 1 歲(虛擬機(jī)為每個(gè)對(duì)象定義了一個(gè)年齡計(jì)數(shù)器,每執(zhí)行一次 Minor GC 年齡加 1),當(dāng)存活對(duì)象的年齡到達(dá)一定程度(默認(rèn) 15 歲)后進(jìn)入老年代,可以通過 -XX:MaxTenuringThreshold 來設(shè)置年齡的值。
當(dāng)進(jìn)行了 Minor GC 后,Eden 還不足以為新對(duì)象分配空間(那這個(gè)新對(duì)象肯定很大),新對(duì)象直接進(jìn)入老年代。
占 To Survivor 空間一半以上且年齡相等的對(duì)象,大于等于該年齡的對(duì)象直接進(jìn)入老年代,比如 Survivor 空間是 10M,有幾個(gè)年齡為 4 的對(duì)象占用總空間已經(jīng)超過 5M,則年齡大于等于 4 的對(duì)象都直接進(jìn)入老年代,不需要等到 MaxTenuringThreshold 指定的歲數(shù)。
在進(jìn)行 Minor GC 之前,會(huì)判斷老年代大連續(xù)可用空間是否大于新生代所有對(duì)象總空間,如果大于,說明 Minor GC 是安全的,否則會(huì)判斷是否允許擔(dān)保失敗,如果允許,判斷老年代大連續(xù)可用空間是否大于歷次晉升到老年代的對(duì)象的平均大小,如果大于,則執(zhí)行 Minor GC,否則執(zhí)行 Full GC。
當(dāng)在 java 代碼里直接調(diào)用 System.gc() 時(shí),會(huì)建議 JVM 進(jìn)行 Full GC,但一般情況下都會(huì)觸發(fā) Full GC,一般不建議使用,盡量讓虛擬機(jī)自己管理 GC 的策略。
永久代(方法區(qū))中用于存放類信息,jdk1.6 及之前的版本永久代中還存儲(chǔ)常量、靜態(tài)變量等,當(dāng)永久代的空間不足時(shí),也會(huì)觸發(fā) Full GC,如果經(jīng)過 Full GC 還無法滿足永久代存放新數(shù)據(jù)的需求,就會(huì)拋出永久代的內(nèi)存溢出異常。
大對(duì)象(需要大量連續(xù)內(nèi)存的對(duì)象)例如很長的數(shù)組,會(huì)直接進(jìn)入老年代,如果老年代沒有足夠的連續(xù)大空間來存放,則會(huì)進(jìn)行 Full GC。
后續(xù)會(huì)持續(xù)更新性能優(yōu)化專題知識(shí),寫的不好的地方也希望大牛能指點(diǎn)一下,大家覺得不錯(cuò)可以點(diǎn)個(gè)贊在關(guān)注下我,剛剛?cè)腭v,以后還會(huì)分享更多文章!
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
網(wǎng)頁標(biāo)題:JVM系列:判斷對(duì)象是否已死和四種垃圾回收算法總結(jié)-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://jinyejixie.com/article38/ccpesp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站改版、App開發(fā)、服務(wù)器托管、小程序開發(fā)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容