2016-06-23 5 views
-2

私はのメモリリークを自分のプログラムに作成することを理解しようとしていますので、それについては、ドイツ語で書かれたThis Wikipedia pageで始まります。Java(Wikipedia)のメモリリーク

それは、ページの下部にJavaで書かれた例があります:

private static List<Integer> nummern = new ArrayList<>(); 
public void erzeugeSpeicherleck() { 
    for (int i=1; i<10000; i++) 
    nummern.add(i); 
} 
// kein weiterer lesender Zugriff auf die List nummern (German) 
// no further read access to list 'nummern' (English) 

私はJavaScriptでこれを書いて、すべてがうまく働きました。

var array = []; 
for(var i=1; i<10000;i++){ 
    array.push(i); 
    console.log(array); 
} 

Javaでコードのその部分がメモリリークを生産している理由を誰かが私に説明できますか?

+1

あなたはJavaScriptとJavaの違いを知っていますか?彼らは名前の一部しか共有しない基本的に異なる言語です。それ以外に、コメント行は "nummern 'というリストへの読み取りアクセス権がありません - それでもリストにアクセスすることは可能です:) – Thomas

答えて

3

Javaは必要なときにクラスをロードしますが、クラスをアンロードすることはありません。

したがって、例ではnummernのような静的フィールドにデータを保存すると、クラスはロードされている限り存在します。 ガベージコレクタは、フィールドによってまだ参照されているので、このフィールドに格納されているArrayListも収集できません。

クラスがアンロードされないため、フィールドで使用されるメモリ(またはこの場合は具体的にはフィールドで参照されるArrayListインスタンス)は決して解放されません。

+0

ありがとうございます。結論として、私はJavaの仕組みも理解しなければなりません – Andrei

1

nummernは静的なので、ガベージコレクタでは消去されません。

javascriptにガベージコレクタはありません。あなたのjs関数のarrayは静的ではありません。