1.在探討垃圾回收算法之前,首先需要介紹一下垃圾回收機制
2.我們知道對無用的對象,可以進行回收然後釋放空間,所以需要確定哪些對象是需要被回收的
垃圾回收機制:
1、引用計數法:當對象被引用,程序計數器+1;釋放-1;當爲0時證明對象未被引用,可回收
但是這個算法有明顯的缺陷,對於循環引用的情況下,對象不會被回收
例如下圖:對象A,對象B循環引用,沒有其他的對象引用A和B,但是A和B都不會被回收
2、可達性分析法:通過一些列稱之爲“GC Roots” 的對象作爲起點;從此起點向下搜索,所走過的路徑稱之爲引用鏈,當一個對象到 GC Roots 沒有任何引用鏈相連接,代表此對象不可達。
Java 可以作爲GC Roots 的對象包括:
1.虛擬機棧(幀棧中的局部變量表)中的引用對象;
2.類靜態屬性引用的對象;
3.常量引用的對象;
4.本地方法棧中JNI (即一般說的 Native 方法) 的引用對象;
確認了哪些對象需要回收,垃圾回收算法決定了回收的操作過程
垃圾回收算法:
1、標記-清理法
在GC時候,先進行掃描,把需要清理的無用對象進行標記,然後將這些對象直接清理
缺點:產生內存碎片,如上圖,如果清理了兩個1kb的對象,再添加一個2kb的對象,無法放入這兩個位置
2、標記-整理法(老年代採用的方式)
在標記-清理的基礎上,清理完成後,將內存空間進行整理,使空間緊湊排列,解決了內存碎片的問題
缺點:開銷較大
3、複製(新生代採用的方式)
將空間一分爲二,在清理時,將需要保留的對象複製到第二塊區域上,複製的時候直接緊湊排列,然後把原來的一塊區域清空
缺點:浪費空間