スタックなどのメモリ機構実装や、キャッシュ機構などを実装する場合は、将来的に使用されなくなったオブジェクトがちゃんと 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
を利用することで、クライアント側で必要されなくなったキーに対するオブジェクト参照を自動的に無効にすることができます。