Подтвердить что ты не робот

Почему пустая Java-программа потребляет память?

Я изучаю использование памяти в Java, чтобы понять, почему моя программа утечки памяти. После удаления кода в моем основном цикле while я все равно получаю увеличение использования памяти с течением времени. Рассматривая использование памяти в пустой программе:

class Nothing
{    public static void main(String[] args)
     {    while(true);    }
}

Я все еще видел увеличение памяти:

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

Итак, мой вопрос: почему существует еще образец пильного диска? Почему при запуске GC она не сохраняет всю память (каждый раз, когда gc работает (долины), используемая память увеличивается на 10-20 КБ (по сравнению с предыдущей долей))?

EDIT:

java version "1.6.0_29"

Java (TM) SE Runtime Environment (сборка 1.6.0_29-b11)

Клиентская виртуальная машина Java HotSpot (TM) (сборка 20.4-b02, смешанный режим, совместное использование)

ОС: Windows 7 Enterprise-32 бит

4b9b3361

Ответ 1

Почему существует еще рисунок пильного диска?

Если я не ошибаюсь, часть причины этого заключается в том, что сам монитор заставляет приложение создавать временные объекты, содержащие информацию о состоянии сбора мусора и использования памяти.

Почему при запуске GC он не сохраняет всю память (каждый раз, когда gc работает (долины), используемая память увеличивается на 10-20Kb (по сравнению с предыдущей долиной))?

Я считаю, что монитор не сразу видит количество использованной памяти после сбора мусора, а скорее должен часто опросить, чтобы увидеть использование памяти. Поэтому воспринимаемая "долина" обязательно несколько выше, чем истинная долина. Я бы предположил, что предполагаемое увеличение использования памяти в долинах - это просто случайный артефакт этого несоответствия и со временем будет нейтрализован. (То есть, я не думаю, что на самом деле в каждом цикле происходит 10-20 Кбайт утечки памяти.)

Ответ 2

Это артефакт профайлера, без профайлера не будет никаких распределений. Различные профилировщики производят разные артефакты, в зависимости от того, как они записывают данные. Ниже вы увидите, как выглядит профилирование Nothing JProfiler:

enter image description here

Значительно меньше пилообразного рисунка. Тем не менее, есть также незначительное потребление памяти:

enter image description here

что связано с тем, что агент профилирования опросит java.lang.management.MemoryUsage JMX bean. В конечном итоге это потребление также приведет к сбору мусора.