JVM 垃圾收集

2021-07-24 05:51:35 字數 969 閱讀 7232

1.引用計算法

給物件新增乙個引用計數器,每當有乙個地方引用它時,計數器值加一,當引用失效時,計數器值減一。當該物件的計數器值為0時,表明該物件不可用,虛擬機器可以對其進行**。但是不能解決迴圈引用問題。

2.可達性分析演算法

演算法思想為:以一系列的gc roots作為起點進行搜尋,搜尋走過的路徑稱之為引用鏈,當乙個物件到gc roots沒有任何引用鏈時,認為該物件時不可達的。如下圖所示。

圖中,根據可達性分析演算法,object5,object6,object7可**。

可以作為gc roots的物件有一下幾種:

1. 虛擬機器棧中引用的物件。

2. 方法區中靜態屬性引用的物件。

3. 方法區中常量引用的物件。

4. 本地方法棧中jni引用的物件。

乙個物件在**之前,至少要經歷兩次標記過程:

- 如果物件在進行可達性分析後,發現不可達,那麼該物件會被第一次標記。標記完成後,jvm會進行一次篩選,篩選依據為該物件是否有必要執行finalize()方法。當物件沒有覆蓋(重寫)finalize方法或者已經虛擬機器呼叫過該方法的finalize方法時,jvm認為沒有必要執行。如果該物件被判定需要執行finalize方法,則虛擬機會把此物件放入f-queue佇列中。

- gc接著會對f-queue中的物件進行第二次標記。如果物件在此過程中與gc roots有引用鏈關聯,則標記該物件並將其移除f-queue。

兩次標記完畢後,對f-queue中物件進行**。流程如下圖所示

在二次標記過程中,該物件只要與引用鏈上的任何乙個物件建立關聯,例如把自己賦值給每個類變數或者物件的成員變數,那麼在第二次標記的時候就可以將它移出f-queue佇列(即將**)。

JVM 垃圾收集演算法

這裡只是各個演算法的思想及發展過程 這是最基礎的收集演算法,分為兩個過程,標記和清除兩個階段。首先標記出需要 的物件,在標記完成後統一 掉所有被標記的物件。標記的過程就是之前判定物件的時候標記的。後續的演算法都是基於這種思路進行改進的。缺點呢,有兩個,1.效率問題,標記和清除的效率都不高。2.空間問...

JVM之垃圾收集演算法

標記清除演算法主要分為兩個階段,標記階段和清除階段,這兩個階段效率比較低,而且收集之後會產生記憶體碎片,無法為大的物件分配記憶體空間。如下圖 複製演算法解決了記憶體碎片問題,但是隨之而來的卻是把記憶體一分為二。原理是 記憶體一分為二,每次使用其中的一半,當需要 的時候,講死亡物件清理,然後存活物件移...

jvm垃圾收集演算法整理

1,標記清除演算法 標記可 的記憶體,然後清除。2,複製演算法。使用標記清除演算法的過程中,如果 的記憶體很少這個演算法還是可以的,但是如果大量的記憶體都是需要 的,那這個就比較笨重,因為我們只需要保留少量不被 的記憶體就可以。這就衍生出了複製演算法。3,標記整理演算法 使用標記清除演算法的過程中,...