これはユーティリティクラスを実装するときに気をつけた方が良いことです。 サンプルプログラム †import java.util.Arrays; import java.util.EmptyStackException; public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object obj) { ensureCapacity(); elements[size++] = obj; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } // ここでメモリリーク発生 return elements[--size]; } private void ensureCapacity() { if (elements.length == size) { elements = Arrays.copyOf(elements, 2 * size + 1); } } } このプログラムの場合、popメソッドで要素取得時に取得した要素を消していないため、
ガベージコレクトされません。 修正プログラム †public Object pop() { if (size == 0) { throw new EmptyStackException(); } Object obj = elements[--size]; // 参照外し elements[size] = null; return obj; } まとめ †このようにJavaではメモリ管理がまったく不要なわけではありません。 |