但凡問到 JVM(Java 虛擬機(jī))通常有 99% 的概率一定會(huì)問: 在 JVM 中如何判斷一個(gè)對(duì)象的生死狀態(tài)?
站在用戶的角度思考問題,與客戶深入溝通,找到橋東網(wǎng)站設(shè)計(jì)與橋東網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋橋東地區(qū)。本文就來(lái)聊聊這個(gè)問題,判斷對(duì)象的生死狀態(tài)的算法有以下幾個(gè):
引用計(jì)算器判斷對(duì)象是否存活的算法是這樣的:給每一個(gè)對(duì)象設(shè)置一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用這個(gè)對(duì)象的時(shí)候,計(jì)數(shù)器就加1,與之相反,每當(dāng)引用失效的時(shí)候就減1。
優(yōu)點(diǎn) :實(shí)現(xiàn)簡(jiǎn)單、性能高。
缺點(diǎn) :增減處理頻繁消耗cpu計(jì)算、計(jì)數(shù)器占用很多位浪費(fèi)空間、最重要的缺點(diǎn)是無(wú)法解決循環(huán)引用的問題。
因?yàn)橐糜?jì)數(shù)器算法很難解決循環(huán)引用的問題,所以主流的Java虛擬機(jī)都沒有使用引用計(jì)數(shù)器算法來(lái)管理內(nèi)存。
運(yùn)行的結(jié)果:
開始:117 M
運(yùn)行中:96 M
結(jié)束:119 M
從結(jié)果可以看出,虛擬機(jī)并沒有因?yàn)橄嗷ヒ镁筒换厥账鼈儯矀?cè)面說(shuō)明了虛擬機(jī)并不是使用引用計(jì)數(shù)器實(shí)現(xiàn)的。
在主流的語(yǔ)言的主流實(shí)現(xiàn)中,比如Java、C#、甚至是古老的Lisp都是使用的可達(dá)性分析算法來(lái)判斷對(duì)象是否存活的。
這個(gè)算法的核心思路就是通過(guò)一些列的“GC Roots”對(duì)象作為起始點(diǎn),從這些對(duì)象開始往下搜索,搜索所經(jīng)過(guò)的路徑稱之為“ 引用鏈 ”。
當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連的時(shí)候,證明此對(duì)象是可以被回收的。如下圖所示: