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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

因為這個圖理解起來比較繞,主要是讓大家能夠理解起來,根搜索算法的基本思想就是使用GC ROOTS作為起點,從這個起點開始往下搜索,如果沒有找到任何相關聯的話,我就認為此對象就是不可達對象的,要是如果你們相互引用的情況下,就是有關聯的情況下,我就認為是可達對象,GC ROOTS其實我們可以認為是被引用對象,這樣理解就行了,像我們剛才說的方法區,虛擬機棧,本地棧,都是GC ROOTS的

?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。