Java — ThreadFactory утечка памяти?

#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 с параметрами по умолчанию, и вот результаты:

  1. Авторский код, выполняемый как есть, похоже, вообще не выполняет никакого выделения, скорее всего, потому, что JIT обнаруживает неиспользуемые ссылки;
  2. Модифицированная версия кода, которая выводит созданные threadFactory s System.out , приводит к «пилообразному» шаблону использования кучи:

введите описание изображения здесь

Это означает, что происходит как выделение, так и сборка мусора.

Возвращаясь к вашему вопросу: я думаю, вы пропустили некоторые важные части кода, или присвоили -Xmx крайне низкое значение, или по какой-то другой причине. Тем не менее, опубликованный вами код в порядке.