天天看點

JVM性能調優垃圾回收JVM的記憶體配置設定

垃圾回收

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垃圾回收配置:

JVM性能調優垃圾回收JVM的記憶體配置設定
JVM性能調優垃圾回收JVM的記憶體配置設定

-Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+PrintGCDetails

-XX:+PrintGCDetails GC收集器

-XX:+UseSerialGC Serial收集器列印

-Xms20M -Xmx20M 堆記憶體

-Xmn10M 新生代記憶體

-XX:SurvivorRatio=8 Eden區域大小

如下圖:

JVM性能調優垃圾回收JVM的記憶體配置設定

配置完成後,應用->運作。

JVM性能調優垃圾回收JVM的記憶體配置設定

從結果中我們可以看出:

我們目前的JVM對

1.2可達性分析算法

從GCRoot根節點向下檢索,如不存在引用鍊,不能檢索到的對象将被釋放。

JVM性能調優垃圾回收JVM的記憶體配置設定

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标記-清除算法(老年代)
效率問題
		空間問題
           
JVM性能調優垃圾回收JVM的記憶體配置設定

上圖我們可以看出,紅色代表使用的,黃色代表标記的,白色代表未使用的。當黃色被清除後,堆記憶體變成一塊一塊,占用率降低。并且當它再不停檢索時,因為塊不斷增加,導緻效率低下

1.1.2複制算法(新生代)

1.堆

1.1新聲代

Eden 伊甸園

Survivor 存活區

Tenured Gen

1.2老生代

2.方法區

3.棧 本地方法棧 程式計數器

JVM性能調優垃圾回收JVM的記憶體配置設定

提高記憶體使用率,将記憶體分為3大塊。

Eden用來存儲記憶體初始化對象。在回收時,将在使用的的記憶體,存放到Survivor,如果在使用大于在使用的記憶體,則會借用Tenured Gen“記憶體擔保”存儲。

1.1.3标記-整理算法(老年代)
JVM性能調優垃圾回收JVM的記憶體配置設定

使用和未使用的移動到兩端,最後清除未使用的。高效。

1.1.4分代手機算法

分代手機算法即針對新生代采用複制算法,針對老年代采用标記整理算法。

1.2 垃圾回收器

1.1.1Serial收集器(用戶端收集)

最基本,發展最悠久

單線程垃圾收集器

1.1.2Parnew

多線程收集

效率相比Serial要高,但如果在用戶端的話,建議使用Serial

JVM性能調優垃圾回收JVM的記憶體配置設定
1.1.3Parallel Scavenge 收集器(伺服器收集器)

複制算法(新生代收集器)

多線程收集器

達到可控制的吞吐量(吞吐量:CPU用于運作使用者代碼的時間與CPU消耗的總時間的比值 吞吐量=(執行使用者代碼時間)/(執行使用者代碼的時間+垃圾回收所占用的時間))

-XX:MaxGFPauseMillis 垃圾收集器最大停頓時間

-XX:CGTimeRatio 吞吐量大小

1.1.3Cms收集器(Concurrent Mark Sweep 并發标記清除)

并發收集器,用于回收老年代記憶體。

1.工作過程

初始标記

并發标記(邊扔垃圾邊打掃)

重新标記

并發清理

優點

并發收集

低停頓

缺點

占用大量的CPU資源

無法處理浮動垃圾

出現Concurrent Mode Failure (并發清理時,會出現問題)

空間碎片

JVM性能調優垃圾回收JVM的記憶體配置設定

初始标記:可被回收的對象。(可達性分析法)

并發标記

重新标記:因程式繼續運作而導緻的變動的對象進行重新标記

并發清理

1.1.4 G1收集器

注:重量級

優勢:

1.并行與并發

2.分代收集

3.空間整合(标記整理清除)

4.可預測的停頓

步驟:

1.初始标記

2.并發标記

3.最終标記

4.篩選回收

JVM性能調優垃圾回收JVM的記憶體配置設定

如上圖:在對象寫入時,通過可達性分析發判斷,如果對象的引用在不同的記憶體塊中,則記錄入remeber set表中。進而達到不需要垃圾回收篩選時,不需要掃描所有的記憶體塊。提高效率。

3.何時回收

引用計數法

在對象中添加一個引用計數器,當存在引用對象時,引用計數器的值+1,引用失效時,計數器-1

JVM的記憶體配置設定

1.優先配置設定到eden

2.大對象直接配置設定到老年代

3.上期存活的對象配置設定到老年代

4.空間配置設定擔保

5.動态對象年齡判斷