プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

参照いろいろ

参照とは

Hoge hoge = new Hoge()

上記の例において変数hogeHogeクラスのインスタンスへの参照を持っている。これが強参照。

強参照がなくなるとインスタンスはGarbage Collectionの回収対象になる。例えば上記の例では変数hogeにnullを代入したり、スコープの外に出たりすると強参照がなくなる。

強参照がなくなった後の状態にはソフト参照、弱参照、ファントム参照の3種類があり、それぞれGCされる条件が異なる。以下にそれぞれの参照について解説する。


強参照

  • 普通の参照
  • GCに回収されない

ソフト参照

  • GCは積極的に回収しないがメモリが逼迫すると回収する
  • 回収されるまでは実オブジェクトをgetメソッドで取り出して強参照に戻すことができる

弱参照

  • GCにより回収される
  • 回収されるまでは実オブジェクトをgetメソッドで取り出して強参照に戻すことができる

ファントム参照

  • なくなったオブジェクトへの参照
  • 強参照へ戻すことはできない
  • クリアされるまでGCで回収されない
  • ReferenceQueue#removeと組合わせてインスタンスが削除されたときのフックとして利用する
        while (true) {
            try {
                PhantomReference<Object > deletedObj =
                       (PhantomReference<Object>) rq.remove(1000);
                if (deletedObj != null) {
                    <deletedObj消滅前に実施したい処理>
                      deletedObj.clear();
                }
            } catch (InterruptedException e) {
                break;
            }
        }