簡體   English   中英

是否有可能在java中識別垃圾收集器是否收集了對象?

[英]Is it possible to identify that object is collected by garbage collector or not in java?

我已經讀過在下列情況下該對象有資格進行垃圾收集。

  1. 該對象的所有引用都顯式設置為null。
  2. 在塊內創建對象,並且一旦控制退出該塊,引用就會超出范圍。
  3. 父對象設置為null,如果對象保存另一個對象的引用,並且當您將容器對象的引用設置為null時,子對象或包含對象將自動符合垃圾回收的條件。

但是,無論如何都要確定垃圾收集器是否收集了符合垃圾收集條件的對象?

對象進行垃圾回收后,JVM會調用其finalize方法。 默認實現什么都不做; 你可以覆蓋它,例如,打印告別消息,或關閉一些打開的資源。

但請注意,無法保證收集后的調用時間。

您可以實現Object#finalize()方法

public class Driver {
    public static void main(String[] args) throws Exception {
        garbage();

        System.gc();
        Thread.sleep(1000);
    }

    public static void garbage() {
        Driver collectMe = new Driver();
    }

    @Override
    protected void finalize() {
        System.out.println(Thread.currentThread().getName() + ": See ya, nerds!");
    }
}

打印

Finalizer: See ya, nerds!

所以你可以在收集之前攔截。 javadoc說

finalize的一般契約是,當JavaTM虛擬機確定不再有任何方法可以被任何尚未死亡的線程訪問時,它被調用,除非采取了一個行動的結果通過最終確定一些其他准備完成的對象或類。 finalize方法可以采取任何操作,包括使該對象再次可用於其他線程;

但是也

對於任何給定對象,Java虛擬機永遠不會多次調用finalize方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM