2

staticクラスで次のように変数を定義するとします。

class MyClass
{
  private static List<String> list = new ArrayList<String>();
}

listメモリリークを引き起こす可能性がありますか? はいの場合、どのように?

4

4 に答える 4

2

あなたが投稿したコードのスニペットは、そのリストから要素をクリアしたり、に設定したりnullしないと、成長し続け、ガベージコレクションされないという意味でのメモリリークです。

非静的リスト (インスタンスまたはローカル スコープ リスト) を使用すると、これが発生する頻度ははるかに低くなります。非静的変数では、インスタンスがスコープ外になると、変数 (および場合によってはオブジェクト) もスコープ外になるため、ガベージ コレクションを取得できます。静的変数を使用すると、それらはクラスにリンクされているため、スコープから外れることはありません ( への参照を設定しない限りnull、 では実行できません)。final

于 2013-07-27T14:33:05.563 に答える
1

メモリ リークを引き起こす可能性があるのは、必ずしも静的なリスト (コレクション) ではありません。寿命の長いコレクション (キャッシュなど) がある場合は、コレクションから古いオブジェクトを削除するなどして、何らかの方法でそのサイズを制限する必要があります。

于 2013-07-26T14:15:45.160 に答える
1

garbage collector's技術的には、手の届かないところにある場合にのみメモリ リークになります。一方、使用しない場合でも長期間メモリ内にある場合、それは問題でありlogical flaw、関連するオブジェクトもGCされないようにします。クラスがアンロードされたときにのみ、メモリが再利用されます。

于 2013-07-26T14:02:22.130 に答える
-1

静的変数は、特別なメモリの場所に割り当てられたクラスにあり、アプリには 1 つの配列しかMyclass.list存在せず、動的ではありません。したがって、リストのサイズは固定でなければなりません。

public final  static String[] list=new String[]
    {"str1", //0
    "str2", //1
    "str3", //2
    "str4", //3
    };

これらの値を変更することはできません。結果として、リークが発生することはないと思います。

于 2013-07-26T13:57:31.953 に答える