#multithreading #memory-leaks
#многопоточность #утечки памяти
Вопрос:
Этот код:
while (true) {
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return null;
}
};
}
заставьте JVM очень быстро исчерпать память.
Почему?
Комментарии:
1. У вас есть бесконечный цикл, который создает объекты: чего вы ожидаете?
2. Я ожидаю, что GC соберет неиспользуемые ссылки.
3. Это не имеет никакого отношения к
ThreadFactory
. Вы увидите аналогичные эффекты и для большинства других классов.4. @ben: Как GC узнает, что они не используются? Вы никогда не выходите из области, в которой они существуют.
5. @ben Я обновил свой предыдущий ответ, поскольку считаю его неправильным. Пожалуйста, просмотрите его, если он все еще актуален.
Ответ №1:
Я попытался запустить этот код с помощью JRE 1.7.0_60 x86_64 в Windows 7 с параметрами по умолчанию, и вот результаты:
- Авторский код, выполняемый как есть, похоже, вообще не выполняет никакого выделения, скорее всего, потому, что JIT обнаруживает неиспользуемые ссылки;
- Модифицированная версия кода, которая выводит созданные
threadFactory
sSystem.out
, приводит к «пилообразному» шаблону использования кучи:
Это означает, что происходит как выделение, так и сборка мусора.
Возвращаясь к вашему вопросу: я думаю, вы пропустили некоторые важные части кода, или присвоили -Xmx крайне низкое значение, или по какой-то другой причине. Тем не менее, опубликованный вами код в порядке.