Java教程34—Java垃圾回收
阿新 • • 發佈:2018-12-02
當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/