これはユーティリティクラスを実装するときに気をつけた方が良いことです。~
普段の実装ではまず登場しませんし、登場してはいけません。~
~
''Javaではメモリ管理はガベージコレクションが勝手にやるから、意識する必要がない''というのが一般的です。~
しかし、特定の場面では意識する必要があります。~
以下のサンプルを見てください。

** サンプルプログラム [#lf2f4c2c]
#sh(java){{
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メソッドで要素取得時に取得した要素を消していないため、
ガベージコレクトされません。~
~
ガベージコレクト対象にするために、以下のように修正します。
** 修正プログラム [#maaddbd1]
#sh(java){{
	public Object pop() {
		if (size == 0) {
			throw new EmptyStackException();
		}
		Object obj = elements[--size];
                // 参照外し
		elements[size] = null;
		return obj;
	}
}}

** まとめ [#p0850eaf]
このようにJavaではメモリ管理がまったく不要なわけではありません。~
しかし、このようなケースはごくまれで、例外的なケースです。


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS