當程序建立對象、數組等引用類型實體時,系統就會在對內存中爲之分配一塊內存區,對象就保存在這塊內存區中,當這塊內存再也不被任何引用變量引用時,這塊內存就變成垃圾,等待垃圾回收機制進行回收。java
垃圾回收機制具備以下特色:數組
當一個對象失去引用後,系統什麼時候調用它的finalize()方法對它進行資源清理,對於程序是不可控的。
程序沒法精確控制Java垃圾回收的時機,但依然能夠強制系統進行垃圾回收-這種強制只是通知系統進行垃圾回收,但系統是否進行垃圾回收依然不肯定。大部分時候,程序強制系統垃圾回收後總會有一些效果。強制系統垃圾回收有以下兩種方式:ide
System.gc()
Runtime.getRuntime().gc()
Object類的finalize()方法沒有作任何事情,子類能夠選擇重寫,以下:測試
protected void finalize() throws Throwable { }
下面我重寫finalize()方法,使一個沒被應用的對象從新被引用,變成可達狀態。this
/** * Created by SqMax on 2018/5/12. */ public class FinalizeTest { private static FinalizeTest ft; public void info(){ System.out.println("測試方法"); } @Override protected void finalize() throws Throwable { System.out.println("讓變量引用該對象,使其變爲可達狀態"); ft=this; } public static void main(String[] args) { // 該對象沒有任何引用變量引用,處於可恢復狀態 new FinalizeTest(); System.gc(); // Runtime.getRuntime().gc(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } ft.info(); } }
上面咱們調用System.gc()方法後,還讓當前線程休眠了1秒鐘,由於垃圾回收機制也是一個線程,咱們通知垃圾回收機制回收垃圾後,垃圾回收線程仍是和main線程爭奪CPU資源,因此讓main線程休眠,這樣垃圾回收線程就會通知沒被引用的對象調用finalize()方法,使咱們的ft變量引用這個對象。
執行結果以下:線程
讓變量引用該對象,使其變爲可達狀態 測試方法
finalize方法有以下4個特色:code
public class FinalizeTest { private static FinalizeTest ft; public void info(){ System.out.println("測試方法"); } @Override protected void finalize() throws Throwable { System.out.println("正在進行垃圾回收...."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("讓變量引用該對象,使其變爲可達狀態"); ft=this; } public static void main(String[] args) { // 該對象沒有任何引用變量引用,處於可恢復狀態 new FinalizeTest(); System.gc(); } }
執行結果以下:對象
正在進行垃圾回收....
能夠看到finalize()方法還沒運行完,程序就結束了。blog
因爲finalize()方法並不必定會被執行,並且不必定會執行完,所以若是清理某個類裏打開的資源,則不要放在finalize()方法裏進行清理,而應該在finally異常處理的finally塊裏清理。內存
目前尚未在項目中遇到該知識點的應用,之後遇到在補充.........