🐺

javaでインスタンスの破棄を検知

2022/12/07に公開

Javaでインスタンスが破棄されるタイミングを検知する例を示します。

まず、finalize メソッドを使用して、インスタンスが破棄される前に特定の処理を実行する例を示します。

public class MyClass
{
    // インスタンスが破棄される前に呼び出されるメソッド
    @Override
    protected void finalize()
    {
        // インスタンスが破棄される前に実行したい処理
        System.out.println("MyClass instance is being finalized.");
    }

    public static void main(String[] args)
    {
        MyClass instance = new MyClass();

        // 参照を外す
        instance = null;

        // ランタイムがガベージコレクションを実行するように要求
        System.gc();
    }
}

次に、java.lang.ref.Reference クラスを使用して、参照されなくなったインスタンスを検知する例を示します。

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

public class MyClass
{
    public static void main(String[] args)
    {
        // 参照キューを作成
        ReferenceQueue<MyClass> queue = new ReferenceQueue<>();

        // 参照を作成
        Reference<MyClass> ref = new WeakReference<>(new MyClass(), queue);

        // 参照を外す
        ref = null;

        // ランタイムがガベージコレクションを実行するように要求
        System.gc();

        // 参照キューから参照が破棄されたインスタンスを取得
        Reference<? extends MyClass> polledRef = queue.poll();
        if (polledRef != null)
        {
            // 参照されなくなったインスタンスを検知
            System.out.println("MyClass instance is being finalized.");
        }
    }
}

Discussion