static
クラスで次のように変数を定義するとします。
class MyClass
{
private static List<String> list = new ArrayList<String>();
}
list
メモリリークを引き起こす可能性がありますか? はいの場合、どのように?
static
クラスで次のように変数を定義するとします。
class MyClass
{
private static List<String> list = new ArrayList<String>();
}
list
メモリリークを引き起こす可能性がありますか? はいの場合、どのように?
あなたが投稿したコードのスニペットは、そのリストから要素をクリアしたり、に設定したりnull
しないと、成長し続け、ガベージコレクションされないという意味でのメモリリークです。
非静的リスト (インスタンスまたはローカル スコープ リスト) を使用すると、これが発生する頻度ははるかに低くなります。非静的変数では、インスタンスがスコープ外になると、変数 (および場合によってはオブジェクト) もスコープ外になるため、ガベージ コレクションを取得できます。静的変数を使用すると、それらはクラスにリンクされているため、スコープから外れることはありません ( への参照を設定しない限りnull
、 では実行できません)。final
メモリ リークを引き起こす可能性があるのは、必ずしも静的なリスト (コレクション) ではありません。寿命の長いコレクション (キャッシュなど) がある場合は、コレクションから古いオブジェクトを削除するなどして、何らかの方法でそのサイズを制限する必要があります。
garbage collector's
技術的には、手の届かないところにある場合にのみメモリ リークになります。一方、使用しない場合でも長期間メモリ内にある場合、それは問題でありlogical flaw
、関連するオブジェクトもGCされないようにします。クラスがアンロードされたときにのみ、メモリが再利用されます。
静的変数は、特別なメモリの場所に割り当てられたクラスにあり、アプリには 1 つの配列しかMyclass.list
存在せず、動的ではありません。したがって、リストのサイズは固定でなければなりません。
public final static String[] list=new String[]
{"str1", //0
"str2", //1
"str3", //2
"str4", //3
};
これらの値を変更することはできません。結果として、リークが発生することはないと思います。