これはユーティリティクラスを実装するときに気をつけた方が良いことです。
普段の実装ではまず登場しませんし、登場してはいけません。

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メソッドで要素取得時に取得した要素を消していないため、 ガベージコレクトされません。

ガベージコレクト対象にするために、以下のように修正します。

修正プログラム

	public Object pop() {
		if (size == 0) {
			throw new EmptyStackException();
		}
		Object obj = elements[--size];
                // 参照外し
		elements[size] = null;
		return obj;
	}

まとめ

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


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-06-30 (水) 02:01:03 (5049d)