2016-06-23 4 views
-2

Я пытаюсь понять, при каких обстоятельствах я бы сделал Memory Leaks в своих программах, поэтому я начал читать об этом, начиная с This Wikipedia page, написанного на немецком языке.Утечка памяти в Java (Википедия)

Существует он пример написан на 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 производит Memory Leak?

+1

Вы знаете разницу между JavaScript и Java, не так ли? Это принципиально разные языки, которые разделяют только часть названия. Кроме того, строка комментария переводится как «больше нет доступа для чтения к списку« nummern »» - по-прежнему можно получить доступ к списку :) – Thomas

ответ

3

Java действительно загружает классы по мере необходимости, но никогда не выгружает класс.

Поэтому, если вы сохраняете данные в статическом поле, например nummern, в вашем примере поле существует до тех пор, пока класс загружается. Сборщик мусора также не может собирать ArrayList, хранящийся в этом поле, поскольку он по-прежнему ссылается на это поле.

Поскольку класс никогда не выгружается, память, используемая полем (или конкретный в данном случае экземпляр ArrayList, на который ссылается поле) никогда не освобождается.

+0

Спасибо. В заключение я должен понять, как работает Java – Andrei

1

nummern статический, поэтому он не будет очищен сборщиком мусора.

В javascript нет сборщика мусора. И array в вашей js-функции не является статичным.

Смежные вопросы