Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの参照の種類とは?強参照・弱参照・ソフト参照・ファントム参照の違いを解説

Javaでは、ガベージコレクション(GC)によるオブジェクトの回収方法に応じて、参照は4つの種類に分類されます。それぞれの特性を理解しておくことで、メモリリークの防止や効率的なメモリ管理につながります。

  • 強参照(Strong Reference)
  • 弱参照(Weak Reference)
  • ソフト参照(Soft Reference)
  • ファントム参照(Phantom Reference)

強参照(Strong Reference)

強参照は、Javaにおける最も基本的な参照の型で、通常の変数への代入によって作成される参照がこれに該当します。強参照が有効な状態にあるオブジェクトは、ガベージコレクションの対象になりません。オブジェクトが回収されるのは、強参照を持つ変数にnullが代入され、参照が切れた場合のみです。

コード例

class Demo {
    // 何らかの機能
}
public class Demo_example {
    public static void main(String[] args) {
        Demo my_inst = new Demo();
        my_inst = null; // 強参照が切れ、GCの対象になる
    }
}

弱参照(Weak Reference)

弱参照はデフォルトの参照型ではないため、明示的に指定して作成する必要があります。一般的にはWeakHashMapなどでエントリオブジェクトを参照する際に利用されます。弱参照しか持たないオブジェクトは、JVM(Java Virtual Machine)によってガベージコレクションの対象としてマークされます。弱参照は「java.lang.ref.WeakReference」クラスを使用して生成します。

コード例

import java.lang.ref.WeakReference;
class Demo {
    public void display_msg() {
        System.out.println("Hello");
    }
}
public class Demo_sample {
    public static void main(String[] args) {
        Demo inst = new Demo();
        inst.display_msg();
        WeakReference<Demo> my_weak_ref = new WeakReference<Demo>(inst);
        inst = null;
        inst = my_weak_ref.get();
        inst.display_msg();
    }
}

実行結果

Hello
Hello

この例では、Demoクラスにメッセージを出力する「display_msg」メソッドが定義されています。別のクラス「Demo_sample」のmainメソッド内でDemoクラスのインスタンスを生成し、まず直接メソッドを呼び出しています。その後、Demoクラスへの弱参照を作成し、元のインスタンス変数にnullを代入します。さらに、弱参照のget()メソッドを使ってオブジェクトを再取得し、再度メソッドを呼び出しています。いずれの場合もコンソールに「Hello」と出力されます。

ソフト参照(Soft Reference)

ソフト参照は「java.lang.ref.SoftReference」クラスを使って作成します。ソフト参照からのみ到達可能なオブジェクトは、JVMがメモリ不足と判断した場合にのみガベージコレクションによって回収されます。この性質を活かし、メモリに余裕がある限り保持したいキャッシュの実装などによく使われます。

ファントム参照(Phantom Reference)

ファントム参照は「java.lang.ref.PhantomReference」クラスを使って作成します。get()メソッドを呼び出しても常にnullを返すという大きな特徴があり、オブジェクト自体へのアクセスはできません。主に、オブジェクトが実際に回収されたタイミングを検知し、後処理(クリーンアップ)を行う目的で使用されます。

まとめ

Javaの参照は、強参照・弱参照・ソフト参照・ファントム参照の4種類があり、それぞれガベージコレクションとの関係が異なります。強参照はデフォルトの参照でGC対象外、弱参照はGC対象になりやすく、ソフト参照はメモリ不足時に回収、ファントム参照は回収タイミングの検知に使われます。用途に応じて適切な参照型を選択することが、堅牢なJavaアプリケーションの開発につながります。

  1. Javaのクラスの種類一覧!具象・抽象・final・POJO・静的・内部クラスを徹底解説

    Javaには、用途や宣言方法に応じてさまざまな種類のクラスが存在します。それぞれのクラスには固有の役割があり、適切に使い分けることで、保守性の高いコードを書くことができます。この記事では、Javaの代表的な6つのクラスの種類について、コード例とともにわかりやすく解説します。 1. 具象クラス(Concrete Class) 具象クラスとは、抽象メソッドを持たない通常のクラス、または親クラスやインターフェースのすべてのメソッドを実装しているクラスのことです。直接インスタンス化できる、最も一般的なクラスです。 コード例 public class Concrete { // 具象クラス

  2. Javaの継承の種類をわかりやすく解説!3つのパターンと具体例

    Javaでサポートされる3種類の継承Javaにおける継承(Inheritance)は、既存のクラスのプロパティやメソッドを別のクラスが引き継ぐことで、コードの再利用性を高め、保守性の高いプログラムを実現する重要な仕組みです。Javaでは、主に以下の3種類の継承パターンが利用できます。1. 単一レベル継承(Single Level Inheritance)ひとつのクラスが、別の単一のクラスからプロパティやメソッドを引き継ぐ、最も基本的な継承形式です。例:クラスBがクラスAを継承する。2. 多段階継承(Multilevel Inheritance)あるクラスが、すでに別のクラスを継承しているクラス