1. 程式人生 > >Java教程34—Java垃圾回收

Java教程34—Java垃圾回收

當JVM啟動時,它會建立一個堆區域,稱為執行時資料區域。
這是儲存所有物件(類的例項)的地方。
由於該區域有限,因此需要通過移除不再使用的物件來有效地管理該區域。
從堆記憶體中刪除未使用的物件的過程稱為垃圾收集,這是Java中記憶體管理的一部分。

像C/C++ 這樣的語言不支援自動垃圾收集,但在java中,垃圾收集是自動的。


那啥時候java執行垃圾收集?

1、當物件不可到達時

BeginnersBook obj = new BeginnersBook();  
obj = null;

這裡引用obj指向類BeginnersBook的物件,但由於我們為它分配了一個空值,因此它不再指向該物件。
這使得BeginnersBook物件無法訪問,因此無法使用。
這些物件可自動用於Java中的垃圾收集。

另一個例子是:

char[] sayhello = { 'h', 'e', 'l', 'l', 'o'};
String str = new String(sayhello);
str = null;

這裡String類的引用str指向堆記憶體中的字串“hello”,但由於我們已將空值賦給str,因此堆記憶體中存在的物件“hello”不可用。


2.將一個引用複製到另一個引用時

BeginnersBook obj1 = new BeginnersBook ();
BeginnersBook obj2 = new BeginnersBook (); 
obj2 = obj1 ;  

這裡我們將引用obj1分配給obj2,這意味著obj2指向的(引用)例項(物件)不可訪問並且可用於垃圾收集。


如何請求JVM進行垃圾回收

我們現在知道無法訪問和不可用的物件可用於垃圾收集,但垃圾收集過程不會立即發生。
這意味著一旦物件準備好進行垃圾回收,他們就必須等待JVM執行執行垃圾收集的記憶體清理程式。
但是,您可以通過呼叫System.gc()方法請求JVM進行垃圾回收(請參閱下面的示例)。

Java中的垃圾收集示例
在這個例子中,我們通過呼叫System.gc()來演示垃圾收集。
在這段程式碼中,我們重寫了finalize()方法。
在Java銷燬物件之前呼叫此方法。這就是您在輸出中看到此方法已被呼叫兩次的原因。

public class JavaExample{
    public static void main(String args[]){
        /*
         * 給一個引用賦空值
         */
        JavaExample obj=new JavaExample();
        obj=null;

        /* 把引用a賦值給b
         */
        JavaExample a = new JavaExample();
        JavaExample b = new JavaExample();
        b = a;
        System.gc();
    }
    protected void finalize() throws Throwable
    {
        System.out.println("Garbage collection is performed by JVM");
    }
}

原文地址;

https://beginnersbook.com/2013/04/java-garbage-collection/