Java垃圾回收之jconsole分析

環境:jdk1.8+Mac+Idea

爲了便於觀察我們設置了虛擬機的參數 VM oprions , -Xms10m -Xmx10m

代碼案例1:
新建了一個數組,向裏面添加100個 OutOfMemory

package com.rumenz;

import java.util.ArrayList;
import java.util.List;

public class OutOfMemory {
    
    public byte []one=new byte[128*1024];
    
    public static void main(String[] args) throws InterruptedException {
            Thread.sleep(5000); //延時5秒,方便我們打開`jconsole`
            append(100);
    }
    private static void append(int n) throws InterruptedException {
        List<OutOfMemory> list=new ArrayList<>();
        for (int i = 0; i < n; i++) {
            Thread.sleep(3000); //拖慢添加速度,方便我們觀察
            list.add(new OutOfMemory());
        }

    }
}

運行程序後迅速打開 jconsole ,並找到自己編寫的類,點擊進入,選擇不安全鏈接

> jconsole

由於我們使用的是成員變量,所以垃圾回收器一致不能回收內存,所以整個堆的內存趨勢是一路上漲.

代碼案例2:

package com.rumenz;
import java.util.ArrayList;
import java.util.List;

public class OutOfMemory {


    public OutOfMemory() {
            byte []one=new byte[128*1024];
    }
    public static void main(String[] args) throws InterruptedException {

            Thread.sleep(5000);
            append(100);
    }

    private static void append(int n) throws InterruptedException {
        List<OutOfMemory> list=new ArrayList<>();
        for (int i = 0; i < n; i++) {
            Thread.sleep(3000);
            list.add(new OutOfMemory());
        }

    }
}

與上面代碼的區別我們 one 變量有成員變量變成了局部變量. 局部變量在棧上分配內存,當方法結束,棧空間消失,棧上的變量或者引用地址將失效,本案例中 one 對象是分配在堆內存上,棧空間的消失導致 one 對象無法被使用到,隨後就會被垃圾回收掉. 所以本案例的堆內存變量將呈現出折線的效果.

來源:https://www.tuicool.com/articles/ne2YraB

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