1. 程式人生 > >對象回收

對象回收

資源 宋體 tex 收集 結束 ava nal 創建 回收

回收

對象回收

對象在不可達的情況下,如果對象覆蓋finalize()方法,而且finalize()沒有被調用過。這些對象會放置在F-Queue隊列中,由Finalizer線程執行。由於是單線程,線程異常的情況導致線程不能執行下去也是可能的。

finalize()方法類似析構函數,在對象結束的時候會被調用。但這並不是推薦的使用方法。客觀上,沒有什麽操作非得在這個時候執行。子類覆蓋finalize()方法用於系統資源的關閉或者其它資源的釋放。

finalize()方法執行過後,並且沒有任何線程可以訪問到這個對象(這裏對象可能復活)。對象被回收。

技術分享

Finalizer線程是在main線程之後創建的,其優先級為

10,主要用於在垃圾收集前,調用對象的finalize()方法;關於Finalizer線程的幾點:

  1. 只有當開始一輪垃圾收集時,才會開始調用finalize()方法;因此並不是所有對象的finalize()方法都會被執行;
  2. 該線程也是daemon線程,因此如果虛擬機中沒有其他非daemon線程,不管該線程有沒有執行完finalize()方法,JVM也會退出;
  3. JVM在垃圾收集時會將失去引用的對象包裝成Finalizer對象(Reference的實現),並放入ReferenceQueue,由Finalizer線程來處理;最後將該Finalizer對象的引用置為null,由垃圾收集器來回收;

    例子

    測試類中(這個是周誌明深入理解java虛擬機中的例子)。在finalize()方法中把當前對象的引用賦值給一個任意的實例。

    技術分享

    技術分享

    finalize()方法只會執行一次
    技術分享

    技術分享

    Ps:方法區回收集中在:廢棄常量和無用的類回收。可以查閱其它相關資料。

對象回收