垃圾回收机制之标记清除算法
生活随笔
收集整理的這篇文章主要介紹了
垃圾回收机制之标记清除算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這個時候我來講一下垃圾回收策略,主要分為這幾種1. 標(biāo)記清除算法就相當(dāng)于給一個對象做一個標(biāo)記,怎么做標(biāo)記呢,其實(shí)是這樣做標(biāo)記的,比如舉個例子,這個地方假如是堆內(nèi)存,比如你創(chuàng)建一個對象的時候,User user = new User();你拿到user對象的時候,這個時候是存活的,會起一個標(biāo)記,那這邊怎么做標(biāo)記呢,0標(biāo)識為存活,1標(biāo)識為沒有存活的,比如這個時候我的垃圾回收機(jī)制回收的時候,這個對象已經(jīng)被應(yīng)用的情況下,這個時候是為0還是為1呢比如我垃圾回收機(jī)制進(jìn)行回收的時候,發(fā)現(xiàn)你這個user對象已經(jīng)被別人引用了,這個時候應(yīng)該標(biāo)識為0還是標(biāo)識為1,是不是應(yīng)該標(biāo)識為0是不是這樣的,那這個時候垃圾回收機(jī)制會不會進(jìn)行回收,不會進(jìn)行回收,這個很好理解的,如果回收機(jī)制發(fā)現(xiàn)你沒有被回收的情況下,這個時候是標(biāo)記為0還是標(biāo)識為1,如果對象沒有引用就標(biāo)記為1,這個時候講一下,他有一個很大的bug,為什么有一個bug呢,叫做碎片化,就是標(biāo)記清除算法會產(chǎn)生碎片化,這個什么意思啊,待會我給你詳細(xì)講一下原理,假設(shè)我們現(xiàn)在創(chuàng)建兩個對象,叫做user1,user2,這個時候他們都是為存活的,標(biāo)識都是為0的,都為0的情況下,我寫偽代碼,這個時候我再來一個user3,user3也是存活的,也是為0,那么我們依次類推,后面還有很多很多,一直到1萬多個的時候,那我都是標(biāo)記為0,如果這個時候發(fā)現(xiàn)1萬個對象,發(fā)現(xiàn)都沒有被使用的情況下,那這個時候標(biāo)識都會改成1,那這個時候我的垃圾回收標(biāo)識變成1的時候,垃圾回收機(jī)制遍歷堆內(nèi)存中不可達(dá)對象,進(jìn)行清理,遍歷不可達(dá)對象,進(jìn)行清理,清理過程有一個缺點(diǎn),產(chǎn)生碎片化,因?yàn)閮?nèi)存不夠連貫,在這邊我舉個例子,在這邊我建一個文件夾,進(jìn)行模擬,標(biāo)記清除算法,比如我現(xiàn)在建一個文件夾叫做user,比如這個時候我們來了一個對象,在堆內(nèi)存中我們創(chuàng)建一個對象,叫做user0,再來一個對象,叫做user1,這個時候我們又來一個對象,叫做user3,后面依次類推我就不寫了,為什么會產(chǎn)生碎片化呢,如果你們這樣刪除的,因?yàn)椴皇且黄饎h除的,效率不高,他一個個的去進(jìn)行刪除,這樣的話很容易產(chǎn)生碎片化,我們?nèi)绻蜷_文件夾的時候,一起全選,是這樣刪除塊還是一個個的刪除快,你一個個刪除可能就會產(chǎn)生碎片化,會產(chǎn)生刪不干凈的問題,是不是這樣的,所以就是不連貫,就是因?yàn)闃?biāo)記清除法不夠連貫,所以就會產(chǎn)生碎片化的問題,這就叫做標(biāo)記清除算法,這個你們里不理解,理不理解碎片化的問題,這個不繞的,我已經(jīng)描述的非常清楚了,你們就可以理解為文件夾的意思,我是全部刪除文件夾呢,還是一個個刪除快呢,肯定是全部刪除快,我全部刪除的話很干凈,而且不會刪除碎片化,如果我一個刪除的情況下,效率就不高,而且會產(chǎn)生磁盤碎片化的問題,我們講一下標(biāo)記清除算法的應(yīng)用場景在什么地方,是在哪個年代,一般是在老年代,新生代里面一般不會用到這個算法,因?yàn)樾什粔蚋?只會在一些老年代里面,為什么老年代適合這種算法呢,因?yàn)槔夏甏厥盏拇螖?shù)就不夠多,你不能在新生代里面用這個算法,因?yàn)樾什桓?因?yàn)樾律枰l繁去回收的情況下,你如果這樣做的話,把速度減慢了,標(biāo)記清除算法一般是用在老年代里面的,標(biāo)記清除算法就講完了,標(biāo)記清除算法可以解決循環(huán)依賴的問題
2. 復(fù)制算法3. 標(biāo)記壓縮算法4. 分代算法
?
總結(jié)
以上是生活随笔為你收集整理的垃圾回收机制之标记清除算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何判断对象是否存活之根搜索算法
- 下一篇: 垃圾回收机制之复制算法