- 資源回收機制---Garbage Collection(GC)
由JVM負責管理,當程式產生的物件不再使用時啟動,釋放更多系統資源維持程式執行的效率。
當物件不在被參照變數(reference variable)參考(refer)時,他會被認為是不再使用的garbage。
Example:
Double d = new Double(0.5);
d = new Double(0.2);
d = null;
- 運作與特點:
提供系統層級的執行緒來負責追蹤記憶體中使用與配置的狀況以回報JVM,自動發生在JAVA程式執行過程中,會適當釋放系統資源,巧妙避開memory leaks。
- 被回收的方法:
- 最簡單的方法: 方法結束後,方法中建立的區域變數只要不再使用就會被回收。
- NULL參照法---Nulling a Reference: 將null指派給物件變數,使目前的物件變數沒有參照對象。
EX.
public void foo(){
StringBuffer s = new StringBuffer("java");
//Block of code
s = null;
//Block of code
}
→在s = null此行執行完畢後被回收
- 重新指派法---Reassigning a Reference Variable: 將物件變數重新再參照一個物件。
EX.1
public void foo(){
StringBuffer s1 = new StringBuffer("java");
StringBuffer s2 = new StringBuffer("SCJP");
//Block of code
s1 = s2;
//Block of code
}
→new StringBuffer("SCJP")有兩個物件變數參照,new StringBuffer("java")被回收
EX.2
public static void main(String[] args){
StringBuffer s = getStringBuffer();
//Block of code
doComplicatedStuff();
}
static StringBuffer getStringBuffer(){
StringBuffer s = new StringBuffer("java");
return s;
}
→doComplicatedStuff()為考試中常見的程式碼表示法
表示以下還有複雜的程式碼等著要執行。
→main.s最後參照到new StringBuffer("java"),
但s物件變數將隨著getStringBuffer()方法的結束而回收
→new StringBuffer("java")物件並不會被回收
- 孤島參照法(物件內部參照)---Isolating a Reference: 若沒有任何外部參照,即使內部參照的關係存在,還是會被回收。
EX.
public class Island{
Island i;
public static void main(String[] args){
Island i2 = new Island();
Island i3 = new Island();
Island i4 = new Island();
i2.i = i3;
i3.i = i4;
i4.i = i2;
i2 = null;
i3 = null;
i4 = null;
doComplicatedStuff();
}
}
→由於三個Island物件(new Island())都沒有外部參照,皆被回收
- 喚醒資源回收機制: JVM以自動偵測方式進行,只能提醒或建議,無法保證馬上執行資源回收。
- 建議JVM能回收GC的物件的方法:
- System.gc()
- Runtime.getRuntime().gc()
- finalize()方法
- Garbage Collection機制在終結物件並釋放記憶體之前,會先呼叫物件中的finalize()方法。
- finalize()方法定義於Object類別。
- finalize()方法不提供多載的功能。而且finalize()不接受傳入參數或回傳值,所以一律以void定義。
- 程式中如果有finalize()的方法,資源回收機制啟動時會自動觸發
參考資料來源: SCJP筆記(六)資源回收 http://byakuinss.blog126.fc2.com/blog-category-0.html
第11章 例外處理、斷言與資源回收 http://wayne.cif.takming.edu.tw/java/scjp/chap11.pdf