JavaでオブジェクトをGC(ガベージコレクション)の対象にする方法とは?
参照されなくなったオブジェクトを破棄する一連の処理はガベージコレクション(Garbage Collection:GC)と呼ばれます。オブジェクトがどこからも参照されなくなると、それは未使用のオブジェクトとみなされ、JVMによって自動的に破棄されます。
Javaでは、プログラマーが明示的にメモリを解放することはできませんが、オブジェクトへの参照を切ることで、そのオブジェクトをGCの対象(回収候補)にすることができます。ここでは、代表的な方法をコード例とともに解説します。
1. 参照変数にnullを代入する
オブジェクトの役目が終わったら、そのオブジェクトを参照している変数にnullを代入します。これにより参照が切断され、オブジェクトはGCの対象となります。
コード例
public class GCTest1 {
public static void main(String[] args) {
String str = "Welcome to TutorialsPoint"; // Stringオブジェクトは変数strから参照されているため、まだGCの対象ではない
str = null; // nullを代入したことで、このStringオブジェクトはGCの対象になった
System.out.println("str eligible for GC: " + str);
}
}実行結果
str eligible for GC: null
2. 参照変数を別のオブジェクトに再割り当てする
参照変数に対して別のオブジェクトを代入すると、それまで参照していたオブジェクトとの結び付きが切れます。これにより、再割り当て前のオブジェクトがGCの対象になります。
コード例
public class GCTest2 {
public static void main(String[] args) {
String str1 = "Welcome to TutorialsPoint";
String str2 = "Welcome to Tutorix"; // それぞれstr1、str2から参照されているため、まだGCの対象ではない
str1 = str2; // str1が参照していたStringオブジェクトはGCの対象になった
System.out.println("str1: " + str1);
}
}実行結果
str1: Welcome to Tutorix
3. 孤立したオブジェクト群(Island of Isolation)を作る
複数のオブジェクトが互いに参照し合っていても、外部からそれらへ到達できる参照がひとつもなければ、全体として到達不可能な状態になります。このような状態は「孤立した島」と呼ばれ、グループ全体がGCの対象となります。
コード例
public class IslandTest {
IslandTest instance;
public static void main(String[] args) {
IslandTest a = new IslandTest(); // オブジェクトA
IslandTest b = new IslandTest(); // オブジェクトB
a.instance = b; // AがBを参照
b.instance = a; // BがAを参照
a = null;
b = null; // 外部からの参照が消え、AとBは互いだけを参照する孤立した島になる → GCの対象
}
}4. 匿名オブジェクトを使う
変数に代入せずに生成される匿名オブジェクトは、使用後すぐに参照を持たないため、そのままGCの対象になります。
コード例
public class AnonymousTest {
public static void main(String[] args) {
System.out.println(new String("Hello").length()); // 一時的なオブジェクトで、使用後は即座にGCの対象になる
}
}まとめ
オブジェクトをGCの対象にするポイントは、「そのオブジェクトへの有効な参照をすべて断ち切ること」です。主な方法は以下の通りです。
- 参照変数にnullを代入する
- 参照変数を別のオブジェクトに再割り当てする
- 外部から到達できない孤立したオブジェクト群を作る
- 変数に保持しない匿名オブジェクトとして使う
JVMのガベージコレクタは、これらの到達不可能なオブジェクトを適切なタイミングで自動的に回収し、メモリを効率的に管理してくれます。
-
JavaのJListで使える選択モードは何種類?3つのモードの違いを解説
JListは、JComponentクラスを継承したSwingコンポーネントの一つで、オブジェクトのリストを画面に表示し、ユーザーがその中から1つ以上の項目を選択できるようにするためのものです。 JavaのJListには、用途に応じて使い分けられる3種類の選択モードが用意されています。 ListSelectionModel.SINGLE_SELECTION:一度に選択できるのは、リスト内の1つのインデックスだけです。 ListSelectionModel.SINGLE_INTERVAL_SELECTION:一度に選択できるのは、1つの連続した区間(連続するインデックスの範囲)だけです。 Lis
-
JavaオブジェクトをJSONに変換する方法(Jackson・Gsonの使い方)
このチュートリアルでは、JavaオブジェクトをJSON形式に変換する方法を、定番ライブラリであるJacksonとGsonの2つを使って解説します。 サンプルとして使用するのは、ごく標準的なPOJO(Plain Old Java Object)であるPersonクラスです。Personオブジェクトを作成したら、それぞれのライブラリを使ってJSONへ変換してみましょう。 Person.java import java.util.List; import java.util.Map; public class Person { String name; Integer age;