1. 程式人生 > >JVM虛擬機器學習--GC垃圾回收機制及常用演算法介紹

JVM虛擬機器學習--GC垃圾回收機制及常用演算法介紹

一、GC--Garbage Collection 直譯就是垃圾回收。

GC主要是用來回收記憶體中已經被用完但是未被釋放的空間(主要是指堆記憶體)。通過GC可以一定程度避免記憶體溢位。

記憶體垃圾回收並不只是Java虛擬機器獨創的。很多其他主流語言都有垃圾回收思想。

二、新生代與老年代:

新生代:存放新生代物件的堆,新生代物件指剛建立的物件,或沒有經歷過幾次垃圾回收的物件。

老年代:存放老年代物件的堆,老年代物件指經歷過很多次垃圾回收後依然存活的物件。

而我們在這裡主要介紹一下GC的幾種常用演算法。

三、GC常用演算法:

1.引用計數法。

演算法思想:就是為每個新建立的物件配上一個整型計數器,當這個物件的引用增加一個時,計數器就加一。當這個物件的引用失效一個時,計數器就減一。當計數器為0時,就進行物件的記憶體回收。

這種演算法有一個巨大的缺點:就是無法解決迴圈引用的問題。所以在Java中不使用這種演算法。

2.標記清除法。

演算法思想:它將垃圾回收分為兩個階段。

(1)標記階段:首先從根節點開始。標記從根節點可到達的所有子節點物件。所有未被標記的物件就是清除物件。

(2)清除階段:清除所有未被標記的物件。

缺點:回收後的空間是不連續的。使用不連續空間分配大物件的記憶體效率低,所以這種演算法對Jvm整體的效率有影響。

3.複製演算法。

演算法思想:將記憶體分為兩半。每次只是用其中一半。當回收垃圾時。將當前的存活物件複製到未使用的另一半未使用的記憶體中。然後清除當前記憶體中的所有物件。交換兩塊記憶體的角色。就完成了垃圾回收。

優點:當記憶體中垃圾較多時,需要複製的物件不多。因此這種情況下該演算法十分高效。

缺點:由於將記憶體一分為二。

注:複製演算法適合於新生代。

4.標記壓縮(整理)法。

演算法思想:相當於標記清除法的增強版。前面也需要從根節點將所有可達物件進行標記。之後將所有被標記的物件壓縮到記憶體的一端。然後清除邊界之外的所有記憶體空間。

優點:效率高,節省空間。不會產生記憶體碎片(不連續空間)。

5.分代演算法。

演算法思想:分代演算法結合了前面幾種演算法的優點。它將記憶體物件的特點將記憶體分成幾塊。根據每塊記憶體的特點採用不同的演算法進行記憶體回收,以此提高回收效率。

為什麼會用這種設計思想呢。原來新生代物件存活的時間都比較短,很快就會被回收。所以更適合使用複製演算法。而老年代往往存活時間較長。所以更適合使用標記壓縮(整理)法或標記清除法。

優點:效率高,回收機制更加合理。

6.分割槽演算法。

演算法思想:分割槽演算法將整個堆記憶體分成了連續的小區間。每塊小區間都是獨立使用和回收的。這樣我們就可以控制一次回收多少小區間,一般來說,對空間越大,進行一次GC所需要的時間就越長。這種等待時間有可能導致伺服器發生異常情況。所以使用分割槽演算法可以減少等待時間,每次合理的回收若干個小區間,而不是整個堆空間,減少GC的等待週期。

喜歡的朋友點個贊哦~~