Javaのソフト参照とファントム参照とは?違いとコード例でわかりやすく解説
ソフト参照(SoftReference)は、メモリ状況に応じて動作するキャッシュ(メモリセンシティブなキャッシュ)を実装する際によく利用されます。ソフト参照で保持されたオブジェクトは、JVMがメモリ不足に陥ったときにのみガベージコレクションの対象となるため、キャッシュ用途に適しています。
ここでは、Javaにおけるソフト参照の具体的な使用例を見ていきましょう。
ソフト参照の実装例
import java.lang.ref.SoftReference;
class Demo{
public void display_msg(){
System.out.println("Hello there");
}
}
public class Demo_example{
public static void main(String[] args){
Demo my_instance = new Demo();
my_instance.display_msg();
SoftReference<Demo> my_softref = new SoftReference<Demo>(my_instance);
my_instance = null;
my_instance = my_softref.get();
my_instance.display_msg();
}
}
実行結果
Hello there Hello there
コードの解説
Demoクラスには、メッセージをコンソールに表示する「display_msg」メソッドが定義されています。もう一つのクラス「Demo_example」には、プログラムのエントリポイントとなるmainメソッドが含まれています。
まず、Demoクラスのインスタンスを生成し、「display_msg」メソッドを呼び出して1つ目のメッセージを表示します。次に、Demoクラスに対するSoftReferenceインスタンスを作成し、元のインスタンス変数にはnullを代入して強参照を切断します。その後、ソフト参照オブジェクトの「get」メソッドを呼び出してオブジェクトを再取得し、再びdisplay_msgメソッドを呼び出しています。この時点ではまだメモリに余裕があるためオブジェクトは回収されておらず、2つ目のメッセージも正常にコンソールへ出力されます。
ファントム参照の実装例
ファントム参照(PhantomReference)は、Javaのファイナライズ機構よりも柔軟な形で、オブジェクトが回収される前の事後クリーンアップ処理をスケジューリングするために使用されます。ファントム参照は必ずReferenceQueueと組み合わせて使うのが一般的です。
それでは、ファントム参照の具体例を見てみましょう。
import java.lang.ref.*;
class Demo{
public void display_msg(){
System.out.println("Hello there");
}
}
public class Demo_example{
public static void main(String[] args){
Demo my_instance = new Demo();
my_instance.display_msg();
ReferenceQueue<Demo> refQueue = new ReferenceQueue<Demo>();
PhantomReference<Demo> phantomRef = null;
phantomRef = new PhantomReference<Demo>(my_instance, refQueue);
my_instance = null;
my_instance = phantomRef.get();
my_instance.display_msg();
}
}
実行結果
Hello there Exception in thread "main" java.lang.NullPointerException at Demo_example.main(Demo_example.java:22)
コードの解説
Demoクラスには、メッセージを表示する「display_msg」メソッドが定義されています。Demo_exampleクラスのmainメソッド内では、まずDemoクラスのインスタンスを生成し、display_msgメソッドを呼び出します。
続いて、ReferenceQueueのインスタンスを作成し、PhantomReference型の変数をnullで初期化した後、対象オブジェクトと参照キューを引数としてPhantomReferenceを生成します。そして、元のインスタンス変数にnullを代入して強参照を切ります。
ここで重要なポイントは、ファントム参照の「get」メソッドは常にnullを返すという仕様があることです。これは、ファントム参照がオブジェクトへのアクセスを許可せず、オブジェクトの到達可能性の変化を検知することだけを目的としているためです。そのため、phantomRef.get()の戻り値をmy_instanceに代入した時点でmy_instanceはnullとなり、その後にdisplay_msgメソッドを呼び出そうとした瞬間にNullPointerExceptionが発生します。これが実行結果に例外が出力される理由です。
ソフト参照とファントム参照の違いまとめ
| 項目 | ソフト参照(SoftReference) | ファントム参照(PhantomReference) |
|---|---|---|
| get()の戻り値 | メモリが十分な場合はオブジェクトを返す | 常にnullを返す |
| 主な用途 | メモリセンシティブなキャッシュ | 回収前のクリーンアップ処理のスケジューリング |
| GCによる回収タイミング | JVMがメモリ不足に陥ったとき | ファイナライズ処理の後 |
| ReferenceQueueとの併用 | 任意 | 必須(推奨) |
このように、ソフト参照は「メモリが足りなくなれば捨ててもよいオブジェクト」を扱うのに向いており、ファントム参照は「オブジェクトの寿命を監視して後処理を行う」ための仕組みである点が大きな違いです。用途に応じて適切な参照タイプを使い分けることで、より堅牢なメモリ管理を実現できます。
-
Excelの「データの取得と変換」機能の使い方を4つの実例で解説
Excelでデータの取得と変換(Get & Transform)を行う方法をお探しの方は、この記事が参考になります。Excelブック、テキスト/CSVファイル、Webなど外部ソースからデータセットを取り込みたい場面は多々あります。実は、いくつかの簡単な手順に従うだけで、外部データを取得してExcelワークシートに変換・取り込むことができます。本記事では、Excelでデータを取得・変換する4つの方法をわかりやすく紹介します。 「データの取得と変換」とは? Excelのデータの取得と変換機能を使うと、外部データをインポートまたは接続したうえで、列の削除、データ型の変更、テーブルの結合など、目的に合
-
CSVファイルとExcelファイルの違いとは?11の比較ポイントで徹底解説
Excelのスプレッドシートは、実にさまざまな形式で保存することができます。その中でも、CSV(Comma-Separated Values:カンマ区切り値)とMicrosoft Excel形式(xls/xlsx)は、特によく使われる2つのファイル形式です。本記事では、CSVファイルとExcelファイルの違いを、具体的な例を挙げながらわかりやすく解説します。両者の違いに興味がある方は、ぜひ最後までご覧ください。 Excelファイルの概要 現在、ビジネスの現場においてExcelなしで業務を遂行するのは困難といえるでしょう。Excelを使えば、データの保存・管理・分析・出力を効率的に行えます。また