日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何判断对象是否存活之根搜索算法

發(fā)布時(shí)間:2024/4/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何判断对象是否存活之根搜索算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
根搜索算法有沒有人了解過的,在垃圾回收機(jī)制里面判斷對(duì)象存活,主要是使用根搜索算法進(jìn)行實(shí)現(xiàn)的,根搜索算法可能稍微有點(diǎn)抽象,算法是怎么進(jìn)行實(shí)現(xiàn)的,又叫GCRoots,類似于樹形結(jié)構(gòu)一樣的,他怎么樣進(jìn)行實(shí)現(xiàn)出來的,GC Roots到底是什么目的,他其實(shí)是判斷是否有依賴關(guān)系,如果你沒有和GC Roots做引用關(guān)系的話,我認(rèn)為是不可達(dá)對(duì)象的,就會(huì)被垃圾回收進(jìn)制給回收掉的,判斷是否可達(dá),是通過什么原理實(shí)現(xiàn)的呢,需要和根節(jié)點(diǎn)有依賴關(guān)系,如果沒有和我的GC Roots沒有任何的引用的情況下,這個(gè)就是不可達(dá)對(duì)象了,這個(gè)時(shí)候GC就會(huì)認(rèn)為是不可達(dá)對(duì)象,怎么樣才判斷可達(dá)呢,就是你的對(duì)象要和我的GCRoots要形成一個(gè)關(guān)聯(lián),必須要和我的GC ROOTS要有引用的情況下,這個(gè)時(shí)候GC就會(huì)認(rèn)為是可達(dá)對(duì)象,一定要和GC ROOTS產(chǎn)生關(guān)聯(lián),如果沒有關(guān)聯(lián)的情況下是一個(gè)不可達(dá)對(duì)象,就會(huì)給垃圾回收機(jī)制給回收掉,GC ROOTS到底是做什么的比較繞,GC ROOTS其實(shí)相當(dāng)于使用棧,還有方法區(qū)的類靜態(tài)屬性引用對(duì)象,包括方法區(qū)的常量引用對(duì)象,還有JNI native方法引用的對(duì)象,比如我現(xiàn)在來一個(gè)對(duì)象叫user1,我這邊再來個(gè)對(duì)象叫user2,這里又user1和user2對(duì)象,user1和user2之間沒有任何關(guān)系,user1和user2都引用到GC ROOTS,比如這個(gè)時(shí)候再來一個(gè)對(duì)象,叫做user3,user3他去引用到一個(gè)user1,這個(gè)時(shí)候也有一個(gè)可達(dá)對(duì)象,他底層怎么做的,從GC ROOTS去遍歷出來,找到下面的子節(jié)點(diǎn),如果有任何關(guān)聯(lián)的話,都會(huì)認(rèn)為是可達(dá)對(duì)象的,如果遍歷GC ROOTS,如果沒有任何依賴的情況下,沒有和我GC ROOTS有任何依賴的情況下,那么這個(gè)時(shí)候就會(huì)認(rèn)為是不可達(dá)對(duì)象的,這個(gè)時(shí)候有這個(gè)場(chǎng)景,這個(gè)場(chǎng)景用的還是比較多的我來一個(gè)對(duì)象叫做user5,我再copy一個(gè),叫做user6,然后我再來一下user7,user6和user7有依賴關(guān)系,user5和user6,user7會(huì)不會(huì)來及回收進(jìn)制回收掉呢,user5創(chuàng)建好了之后,沒有被任何引用,user6又被user7被引用的情況下,因?yàn)檫@個(gè)時(shí)候沒有GC ROOTS引用的情況下,就會(huì)被垃圾回收機(jī)制給回收掉,因?yàn)樗鼪]有GC ROOTS這個(gè)根節(jié)點(diǎn),那么我們?cè)俜催^來說,什么是GC ROOTS,GC ROOTS相當(dāng)于他是怎么來的,這個(gè)時(shí)候只要你有一個(gè)虛擬的棧,你只要有這樣的一個(gè)局部變量,能夠去引用對(duì)象,或者是方法區(qū)的引用對(duì)象,或者是方法區(qū)常量引用對(duì)象,方法區(qū)JNI native方法引用對(duì)象

這個(gè)圖其實(shí)還是很難描述GC ROOTS原理,在這里我又畫個(gè)圖你就知道GC ROOTS的原理了,在這里我畫一個(gè)非常詳細(xì)的圖你們就知道他們的原理了在這里我們舉個(gè)例子,方法區(qū)主要是存放一個(gè)靜態(tài)信息,那我來問一下你們,方法區(qū)能不能做一個(gè)GC ROOTS,方法區(qū)肯定能的,只要你和GC ROOTS進(jìn)行關(guān)聯(lián)起來,這個(gè)時(shí)候垃圾回收機(jī)制就會(huì)認(rèn)為有可達(dá)對(duì)象了,我們這里再來一個(gè)堆內(nèi)存,你知道我們的對(duì)象都是在堆內(nèi)存里面的,然后我們?cè)賮硪粋€(gè)虛擬機(jī)棧,我們可以把他叫做虛擬機(jī)棧,就叫棧吧,我們這里還有一個(gè)本地方法棧,比如這個(gè)時(shí)候我們方法去在虛擬棧里面,然后我們棧在GC ROOTS,這個(gè)時(shí)候我的堆里面有這么幾個(gè)對(duì)象,有哪幾個(gè)對(duì)象呢,比如第一個(gè)對(duì)象我們把他叫做user1,user1方法區(qū)里面是誰在引用他呢,是被方法區(qū)引用到了,這個(gè)時(shí)候我們?cè)儆幸粋€(gè)對(duì)象叫做user2,user2被虛擬機(jī)棧引用,然后我們還有一個(gè)user3,user3沒有任何依賴關(guān)系,我們?cè)賮硪粋€(gè)user5,user5去依賴user3,我把圖畫完了之后你們就知道什么意思了,接著我又來一個(gè)對(duì)象叫做user4,user4可能會(huì)被本地方法棧所依賴到,那我就把箭頭給你畫好點(diǎn),然后我再來一個(gè)user6,user6引用到了user4的情況下,這個(gè)時(shí)候我來問你們,垃圾回收機(jī)制,首先方法區(qū),虛擬機(jī)棧,本地方法區(qū),都可以做為一個(gè)GC ROOTS,只要你能夠被別人引用到的話,只要把GC ROOTS作為一個(gè)節(jié)點(diǎn),找到這樣的一個(gè)依賴關(guān)系的情況下,是可達(dá)的,垃圾回收機(jī)制是不會(huì)被回收掉的,如果沒有和GC ROOTS做關(guān)聯(lián)的情況下,我就會(huì)認(rèn)為是垃圾回收對(duì)象,會(huì)被回收掉的,這個(gè)時(shí)候你們可以想一下,1,2,3,4,5,6哪些對(duì)象可達(dá),哪些對(duì)象是不可達(dá)的,1,2,4,6首先是可達(dá)對(duì)象的,但是3和5你們有一個(gè)誤區(qū),3和5不是也有依賴關(guān)系嗎,他確實(shí)有依賴關(guān)系,但是3和5沒有和GC ROOTS做關(guān)聯(lián),我GC ROOT遍歷的時(shí)候,我可能認(rèn)為找不到你,我就認(rèn)為是不可達(dá)的對(duì)象,因?yàn)樗鼪]有GC ROOTS,這就是根搜索算法,這就是可達(dá)性算法,這個(gè)圖是我自己原創(chuàng)出來的

因?yàn)檫@個(gè)圖理解起來比較繞,主要是讓大家能夠理解起來,根搜索算法的基本思想就是使用GC ROOTS作為起點(diǎn),從這個(gè)起點(diǎn)開始往下搜索,如果沒有找到任何相關(guān)聯(lián)的話,我就認(rèn)為此對(duì)象就是不可達(dá)對(duì)象的,要是如果你們相互引用的情況下,就是有關(guān)聯(lián)的情況下,我就認(rèn)為是可達(dá)對(duì)象,GC ROOTS其實(shí)我們可以認(rèn)為是被引用對(duì)象,這樣理解就行了,像我們剛才說的方法區(qū),虛擬機(jī)棧,本地棧,都是GC ROOTS的

?

總結(jié)

以上是生活随笔為你收集整理的如何判断对象是否存活之根搜索算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。