Khi nào thì object được trình thu gom rác dọn dẹp – java

Một object được xem là đủ điều kiện để trình thu gom rác dọn dẹp khi mà nó không còn một reference nào đến nó. 

Reference là gì?

Khi bạn khởi tạo một object với từ khoá new một object mới được tạo ra và lưu vào heap và nó trả về một reference. Hay nói cách khác reference là một địa chỉ của object được lưu trong heap.

Box box = new Box();

Như đoạn code trên, trình biên dịch sẽ khởi tạo một box object và lưu chúng vào heap, sau đó trả về một reference của nó cho biến box nắm giữ.

Các object được lưu trữ trong heap không thể tự giải phóng mà phải nhờ vào trình thu gom rác của java. Các object được dọn dẹp phải thoả điều kiện rằng không có một reference nào đến nó.

Làm thế nào để một object đủ điều kiện để dọn dẹp?

Khởi tạo một object trong method

Khi một object được gọi nó được thêm vào stack frame. Sau khi nó thực thi xong sẽ được xoá khỏi stack frame. Tất cả các thành phần được khai báo bên trong method này đều sẽ không thể truy cập được sau khi nó thực hiện xong, vì vậy chúng sẽ đủ điều kiện để trình thu gom rác dọn dẹp.

class Test {

    // to store object name
    String obj_name;

    public Test(String obj_name) {
        this.obj_name = obj_name;
    }

    static void show() {
        new Test("t1");
        display();

    }

    static void display() {
        new Test("t2");
    }

    // Driver method
    public static void main(String args[]) {
        // calling show()
        show();

        // calling garbage collector
        System.gc();
    }

    @Override
    protected void finalize() throws Throwable {
        // will print name of object
        System.out.println(this.obj_name + " successfully garbage collected");
    }
}

Output: 

t2 successfully garbage collected
t1 successfully garbage collected

Giải thích:

finalize(): Method này sẽ được trình thu gon rác gọi khi một object được xác định là không còn reference nào đến nó. 

System.gc(): Gọi trình thu gom rác để nó tiến hành giải phóng các object không còn được sử dụng.

Chúng ta thấy rằng show() gọi đến display() cho nên stack frame của chúng ta sẽ trông như sau.

display()
show()

Method display() sẽ kết thúc trước show() nên object t2 được trình thu gom rác xoá đầu tiên sau đó mới đến t1.

Gán reference khác vào biến tham chiếu

Xem ví dụ sau

class Test {
    String obj_name;

    public Test(String obj_name) {
        this.obj_name = obj_name;
    }

    public static void main(String args[]) {
        Test t1 = new Test("t1");
        Test t2 = new Test("t2");

        //t1 now referred to t2
        t1 = t2;

        // calling garbage collector
        System.gc();
    }

    @Override
    protected void finalize() {
        // will print name of oxbject
        System.out.println(this.obj_name + " successfully garbage collected");
    }
}

Output:
t1 successfully garbage collected

Ban đầu biến t1 giữ reference đến object Test t1 sau khi chúng ta gán t1 = t2, thì t1 và t2 đều chứa reference đến object t2. Và kết quả là object t1 sẽ được dọn dẹp vì không còn biến nào lưu trữ reference đến nó. 

Trỏ các reference của object về null

Khi tất cả các biến giữ reference đến object được trỏ về null thì object đó đủ điều kiện để trình thu gom rác dọn dẹp. Lưu ý là tất cả các reference đều phải trỏ về null nhé =)) cách này làm chơi thôi chứ không ai rảnh mà đi làm vậy.

class Test
{
    String obj_name;

    public Test(String obj_name)
    {
        this.obj_name = obj_name;
    }

    public static void main(String args[])
    {
        Test t1 = new Test("t1");

        t1 = null;

        System.gc();
    }

    @Override
    protected void finalize()
    {
        // will print name of object
        System.out.println(this.obj_name + " successfully garbage collected");
    }
}

Output: t1 successfully garbage collected

Khởi tạo mà không lưu trữ

Khi chúng ta khởi tạo một object mà không gán cho một biến nào thì nó cũng xem như là không có một tham chiếu nào đến nó, và nó cũng sẽ bị trình thu gom rác dọn dẹp.

class Test {
    String obj_name;

    public Test(String obj_name) {
        this.obj_name = obj_name;
    }

    public static void main(String args[]) {
        new Test("t1");

        System.gc();
    }

    @Override
    protected void finalize() {
        // will print name of object
        System.out.println(this.obj_name + " successfully garbage collected");
    }
}

Output: t1 successfully garbage collected

Nguồn tham khảo

https://www.geeksforgeeks.org/garbage-collection-java/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x