垃圾回收
1.如何判斷對象為垃圾對象
1.1引用計數法
1.2可達性分析法
1.1引用計數法
在對象中添加一個引用計數器,當存在引用對象時,引用計數器的值+1,引用失效時,計數器-1
/**
* @PACKAGE_NAME: PACKAGE_NAME
* @Description:
* @Author: liangxu
* @Date: 2021/8/30 11:52 上午
* @Version: V1.0
*/
public class JVMTest {
private Object instance;
public static void main(String[] args) {
//1.對象進行兩次引用
JVMTest t1 = new JVMTest();
JVMTest t2 = new JVMTest();
//對象間互相引用 此時達到的效果為t1引用計數器為2、t2引用計數器為2
t1.instance = t2;
t2.instance = t1;
//将對象設定為null後,引用計數器-1,t1引用計數器為1、t2引用計數器為1
t1 = null;
t2 = null;
//結論:
/**
* 如果JVM采用計數器進行記憶體釋放的話,則存在不會被釋放的垃圾對象占用記憶體,那麼如何驗證JVM是否使用了計數器進行記憶體管理呢,我們可以列印JVM觀察。
*/
System.gc();
}
}
idea垃圾回收配置:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3I2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHL90EWZNnVzUVQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2MTZ4IDZ4YWM2M2M1MjM4MGM5QTOzQWO2ITM5UjNhJzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
-Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+PrintGCDetails
-XX:+PrintGCDetails GC收集器
-XX:+UseSerialGC Serial收集器列印
-Xms20M -Xmx20M 堆記憶體
-Xmn10M 新生代記憶體
-XX:SurvivorRatio=8 Eden區域大小
如下圖:
配置完成後,應用->運作。
從結果中我們可以看出:
我們目前的JVM對
1.2可達性分析算法
從GCRoot根節點向下檢索,如不存在引用鍊,不能檢索到的對象将被釋放。
2.如何回收
1.1回收政策
1.1.1标記-清除算法
1.1.2複制算法
1.1.3标記-整理算法
1.1.4分代手機算法
1.2垃圾回收器
1.1.1Serial
1.1.2Parnew
1.1.3Cms
1.1.4G1
注:關于新聲代老年代檢視文檔介紹
1.1 回收政策
1.1.1标記-清除算法(老年代)
效率問題
空間問題
上圖我們可以看出,紅色代表使用的,黃色代表标記的,白色代表未使用的。當黃色被清除後,堆記憶體變成一塊一塊,占用率降低。并且當它再不停檢索時,因為塊不斷增加,導緻效率低下
1.1.2複制算法(新生代)
1.堆
1.1新聲代
Eden 伊甸園
Survivor 存活區
Tenured Gen
1.2老生代
2.方法區
3.棧 本地方法棧 程式計數器
提高記憶體使用率,将記憶體分為3大塊。
Eden用來存儲記憶體初始化對象。在回收時,将在使用的的記憶體,存放到Survivor,如果在使用大于在使用的記憶體,則會借用Tenured Gen“記憶體擔保”存儲。
1.1.3标記-整理算法(老年代)
使用和未使用的移動到兩端,最後清除未使用的。高效。
1.1.4分代手機算法
分代手機算法即針對新生代采用複制算法,針對老年代采用标記整理算法。
1.2 垃圾回收器
1.1.1Serial收集器(用戶端收集)
最基本,發展最悠久
單線程垃圾收集器
1.1.2Parnew
多線程收集
效率相比Serial要高,但如果在用戶端的話,建議使用Serial
1.1.3Parallel Scavenge 收集器(伺服器收集器)
複制算法(新生代收集器)
多線程收集器
達到可控制的吞吐量(吞吐量:CPU用于運作使用者代碼的時間與CPU消耗的總時間的比值 吞吐量=(執行使用者代碼時間)/(執行使用者代碼的時間+垃圾回收所占用的時間))
-XX:MaxGFPauseMillis 垃圾收集器最大停頓時間
-XX:CGTimeRatio 吞吐量大小
1.1.3Cms收集器(Concurrent Mark Sweep 并發标記清除)
并發收集器,用于回收老年代記憶體。
1.工作過程
初始标記
并發标記(邊扔垃圾邊打掃)
重新标記
并發清理
優點
并發收集
低停頓
缺點
占用大量的CPU資源
無法處理浮動垃圾
出現Concurrent Mode Failure (并發清理時,會出現問題)
空間碎片
初始标記:可被回收的對象。(可達性分析法)
并發标記
重新标記:因程式繼續運作而導緻的變動的對象進行重新标記
并發清理
1.1.4 G1收集器
注:重量級
優勢:
1.并行與并發
2.分代收集
3.空間整合(标記整理清除)
4.可預測的停頓
步驟:
1.初始标記
2.并發标記
3.最終标記
4.篩選回收
如上圖:在對象寫入時,通過可達性分析發判斷,如果對象的引用在不同的記憶體塊中,則記錄入remeber set表中。進而達到不需要垃圾回收篩選時,不需要掃描所有的記憶體塊。提高效率。
3.何時回收
引用計數法
在對象中添加一個引用計數器,當存在引用對象時,引用計數器的值+1,引用失效時,計數器-1