廃れたオブジェクト参照を取り除く
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
これはユーティリティクラスを実装するときに気をつけた方が...
普段の実装ではまず登場しませんし、登場してはいけません。~
~
''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ではメモリ管理がまったく不要なわけではあり...
しかし、このようなケースはごくまれで、例外的なケースです。
終了行:
これはユーティリティクラスを実装するときに気をつけた方が...
普段の実装ではまず登場しませんし、登場してはいけません。~
~
''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ではメモリ管理がまったく不要なわけではあり...
しかし、このようなケースはごくまれで、例外的なケースです。
ページ名: