jvm判斷物件存活

2021-10-01 05:59:51 字數 1117 閱讀 2783

我們在編碼的過程當中,堆的空間的利用率是有限制的,假設我們的堆空間已經快要觸發gc,那麼大家有沒有想過,gc進行**的時候,到底哪一類的物件才能被**,**的標準是那些,好的,廢話不多,直接開始:

引用計數法;

可達性分析演算法(根搜尋法gs_roots演算法);

引用計數法的圖例如下:

給物件中新增乙個引用計數器,每當有 乙個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器為0 的物件就是不可能再被使用的。但是如果再堆裡面互相引用的物件就無法判斷,這個就是乙個問題。

//下面的例子講的就是在堆裡面相互引用對方的例子

public

static

void

main

(string[

] args)

可達性分析演算法(根搜尋法gc_roots根節點)分析如下:

是通過一系列的稱為「gc roots」的物件作為起始點,從這些節點開始向下搜尋,搜尋所 走過的路徑稱為引用鏈(reference chain),當乙個物件到gc roots沒有任何引用鏈相連 (用圖論的話來說,就是從gc roots到這個物件不可達)時,則證明此物件是不可用的。

這段話看著是不是很繞,我用我自己的話翻譯一下吧:、

就是判斷乙個物件是不是可達的,如果和根節點沒有任何引用關係,就是不可達物件,就不會**,所以說這種演算法的核心就是必須和gc_roots產生關聯,有引用關係,才會**

那麼問題又來了? 到底哪些才是gc_roots的起始點呢? 其實主要是下面幾個,我畫圖說明一下:

按照這個演算法的話,上面的引用計數法中遇到的問題:兩個物件互相引用的物件,也會被算為沒有存活,也會被**。如圖:

好了,判斷乙個物件是否存放的兩個方式都介紹好了。加油,共勉

如何判斷Java物件是否存活

該種方法是每乙個物件有乙個引用計數屬性,新增乙個引用時計數加1,引用釋放時計數減1,計數為0時表示沒用引用,則代表該物件可以 這種方法簡單,但是無法解決物件相互迴圈引用的問題。該種方法是從gc roots開始向下搜尋,搜尋所走過的路徑為引用鏈。當乙個物件到gc roots沒用任何引用鏈時,則證明此物...

物件存活判定演算法 判斷物件是否活著

物件被jvm收集的前提是該物件已經被jvm標記為了 死去 的物件。引用計數法 引用計數法的基本概念是 給物件新增乙個引用計數器,每當有乙個地方引用了該物件,計數器就加1 當引用失效,計數器就減1 任何時刻的計數器為0的物件就是不可能在被使用的物件。雖然是乙個實現簡單有效的演算法,但是jvm已經很少使...

JVM大端判斷

jvm採用大端方式存多位元組的資料,判斷方法如下 1 public static void bytestoint throws ioexception 6 bytearrayinputstream bais new bytearrayinputstream bytear 7 datainputstr...