まくまくJavaノート
廃れたオブジェクト参照を取り除く
2016-02-18

スタックなどのメモリ機構実装や、キャッシュ機構などを実装する場合は、将来的に使用されなくなったオブジェクトがちゃんと Garbage Collection により回収されるように注意して実装する必要があります。 この実装を怠るとメモリリークが発生します。

具体的には、必要のなくなったオブジェクト参照を取り除くために、これまで参照を持っていたフィールドに対して null を代入します。

public T pop() {
    if (size == 0) {
        throw new EmptyStackException();
    }
    T result = elements[--size];
    elements[size] = null;  // 参照を取り除き、GC 対象とする
    return result;
}

一般的にこのような対策が必要となるのは、メンバフィールドでオブジェクト参照を保持している場合のみです。 ローカル変数は、そのスコープを外れた際には自動的に GC による回収の対象となるので、ローカル変数に対して null 代入するのは通常無駄であり、見通しを悪くするだけなのでやめるべきです。

キー&バリュー形式のキャッシュを実装する場合は、WeakHashMap を利用することで、クライアント側で必要されなくなったキーに対するオブジェクト参照を自動的に無効にすることができます。

2016-02-18