垃圾回收算法有哪些?每個算法各自有何優劣?

 1.在探討垃圾回收算法之前,首先需要介紹一下垃圾回收機制

2.我們知道對無用的對象,可以進行回收然後釋放空間,所以需要確定哪些對象是需要被回收的

   垃圾回收機制:

      1、引用計數法:當對象被引用,程序計數器+1;釋放-1;當爲0時證明對象未被引用,可回收

   

但是這個算法有明顯的缺陷,對於循環引用的情況下,對象不會被回收

例如下圖:對象A,對象B循環引用,沒有其他的對象引用AB,但是A和B都不會被回收

 

      2、可達性分析法:通過一些列稱之爲“GC Roots” 的對象作爲起點;從此起點向下搜索,所走過的路徑稱之爲引用鏈,當一個對象到 GC Roots 沒有任何引用鏈相連接,代表此對象不可達。

      Java 可以作爲GC Roots 的對象包括:

 

1.虛擬機棧(幀棧中的局部變量表)中的引用對象;

 

2.類靜態屬性引用的對象;

 

3.常量引用的對象;

4.本地方法棧中JNI (即一般說的 Native 方法) 的引用對象;

 

   確認了哪些對象需要回收垃圾回收算法決定了回收的操作過程        

      垃圾回收算法:

     1、標記-清理法

       在GC時候,先進行掃描把需要清理的無用對象進行標記,然後將這些對象直接清理

         缺點:產生內存碎片,如上圖,如果清理了兩個1kb的對象,再添加一個2kb的對象,無法放入這兩個位置

     2、標記-整理法(老年代採用的方式)

       

    在標記-清理的基礎上,清理完成後將內存空間進行整理使空間緊湊排列,解決了內存碎片的問題

   缺點:開銷較大

     3、複製(新生代採用的方式)

將空間一分爲二,在清理時,將需要保留的對象複製到第二塊區域上,複製的時候直接緊湊排列,然後把原來的一塊區域清空

缺點:浪費空間

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章