2016-06-23 18 views
-2

Ich versuche zu verstehen, unter welchen Umständen ich Speicherlecks in meinen Programmen machen würde, also habe ich begonnen, darüber zu lesen, beginnend mit This Wikipedia page geschrieben in Deutsch.Speicherleck in Java (Wikipedia)

Es gibt es ein Beispiel in Java geschrieben am unteren Rand der Seite:

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) 

Ich schrieb dies in JavaScript und alles hat gut funktioniert.

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

Kann mir jemand erklären, warum das Stück Code in Java ist eine Speicherverlust produzieren?

+1

Sie kennen den Unterschied zwischen JavaScript und Java, nicht wahr? Sie sind grundlegend verschiedene Sprachen, die nur einen Teil des Namens teilen. Außerdem übersetzt sich die Kommentarzeile in "kein Lesezugriff mehr auf die Liste" nummern "" - es ist immer noch möglich auf die Liste zuzugreifen :) – Thomas

Antwort

3

Java lädt zwar Klassen, benötigt aber nie eine Klasse.

Wenn Sie also Daten in einem statischen Feld wie nummern in Ihrem Beispiel speichern, existiert das Feld so lange, wie die Klasse geladen ist. Der Garbage Collector kann die ArrayList, die in diesem Feld gespeichert ist, auch nicht erfassen, da das Field immer noch darauf verweist.

Da die Klasse nie entladen wird, wird der vom Feld verwendete Speicher (oder in diesem Fall die ArrayList-Instanz, auf die das Feld verweist) nie freigegeben.

+0

Danke. Abschließend muss ich verstehen, wie Java funktioniert – Andrei

1

nummern ist statisch, so wird es nicht von Garbage Collector gereinigt werden.

Es gibt keinen Müllsammler in Javascript. Und array in Ihrer js Funktion ist nicht statisch.