Javaの「孤立の島(Island of Isolation)」とは?ガベージコレクションの仕組みを解説
Javaでは、使用済みのオブジェクトはガベージコレクタ(Garbage Collector)によってメモリから解放されます。オブジェクトが破棄されるのは、そのオブジェクトへの参照がどこにも存在しなくなったときです。ガベージコレクタは、破棄対象となったオブジェクトに対して「finalize」メソッドを呼び出します。
孤立の島(Island of Isolation)とは?
2つのオブジェクト「a」と「b」が互いに参照し合っており、それらを参照する外部のオブジェクトが一切存在しない状態を、「孤立の島(Island of Isolation)」と呼びます。
これは、互いに参照し合うオブジェクトの集まりですが、アプリケーション内の他のどのオブジェクトからも参照されていない状態です。プログラムからはアクセスできなくなっているのに、メモリ上にはオブジェクトが残り続けるため、メモリ管理の観点で重要な概念となります。
注: 孤立の島は複数のオブジェクトに限らず、参照を持たない単一のオブジェクトも孤立の島とみなされます。
Javaのガベージコレクタは、オブジェクトの到達可能性(reachability)を基準に破棄対象を判断します。そのため、オブジェクト同士が循環参照していても、外部からの参照がなければ回収対象となるのがポイントです。実際のコード例を見てみましょう。
コード例
public class Demo{
Demo i;
public static void main(String[] args){
Demo my_ob_1 = new Demo();
System.out.println("Demo object one has been created");
Demo my_ob_2 = new Demo();
System.out.println("Demo object two has been created");
my_ob_1.i = my_ob_2;
my_ob_2.i = my_ob_1;
my_ob_1 = null;
my_ob_2 = null;
System.gc();
}
@Override
protected void finalize() throws Throwable{
System.out.println("The finalize method has been called on the object");
}
}
実行結果
Demo object one has been created Demo object two has been created The finalize method has been called on the object The finalize method has been called on the object
コードの解説
この例では、Demoという名前のクラスにmainメソッドが定義されています。まず、Demoクラスのインスタンスを2つ生成し、それぞれのオブジェクトが持つDemo型のフィールド「i」に相手のオブジェクトを代入することで、互いに参照し合う状態(循環参照)を作り出しています。
その後、両方の参照変数にnullを代入すると、これら2つのオブジェクトへの外部からの参照は完全になくなります。この時点で、2つのオブジェクトは「孤立の島」の状態になります。続いてSystem.gc()メソッドを呼び出すことでガベージコレクションが実行され、到達不可能になったオブジェクトが回収されます。
finalizeメソッドはオーバーライドされており、各オブジェクトが破棄される際に呼び出されるため、実行結果にはfinalizeメソッドのメッセージが2回表示されます。これは、孤立の島を構成していた2つのオブジェクトが、どちらも正しくガベージコレクタによって回収されたことを示しています。
-
HTML DOM アンカーオブジェクトとは?<a>要素の操作方法を解説
HTMLでは、<a>要素にhref属性を組み合わせることで、ハイパーリンクを作成します。この<a>要素をJavaScript側から表すものが「アンカーオブジェクト」です。 アンカーオブジェクトの基本 アンカーオブジェクトは、HTML文書内の<a>要素を表すオブジェクトです。document.getElementById()などのメソッドで要素を取得することで、hrefプロパティを使ってリンク先のURLを参照・変更したり、その他のプロパティやメソッドでリンクを動的に操作したりできます。 サンプルコード 以下の例では、ページ内の<a>要素にアクセスし
-
Javaのコンストラクターは例外をスローできる?仕組みと注意点を解説
はい、Javaではコンストラクターが例外をスローすることが許されています。コンストラクターとは、オブジェクトを初期化するために用いられる特殊なメソッドの一種です。newキーワードを使ってクラスのインスタンス(オブジェクトとも呼ばれます)を生成する際に自動的に呼び出されます。クラスの各オブジェクトは、それぞれ固有の状態(インスタンス変数)を持ち、そのクラスが持つメソッドへアクセスできます。コンストラクターから例外をスローする検査例外(checked exception)は、インスタンス生成時に発生した正当な問題を示すために使用できます。一方、非検査例外(unchecked exception)は