Почему пустая 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 бит
Ответы
Ответ 1
Почему существует еще рисунок пильного диска?
Если я не ошибаюсь, часть причины этого заключается в том, что сам монитор заставляет приложение создавать временные объекты, содержащие информацию о состоянии сбора мусора и использования памяти.
Почему при запуске GC он не сохраняет всю память (каждый раз, когда gc работает (долины), используемая память увеличивается на 10-20Kb (по сравнению с предыдущей долиной))?
Я считаю, что монитор не сразу видит количество использованной памяти после сбора мусора, а скорее должен часто опросить, чтобы увидеть использование памяти. Поэтому воспринимаемая "долина" обязательно несколько выше, чем истинная долина. Я бы предположил, что предполагаемое увеличение использования памяти в долинах - это просто случайный артефакт этого несоответствия и со временем будет нейтрализован. (То есть, я не думаю, что на самом деле в каждом цикле происходит 10-20 Кбайт утечки памяти.)
Ответ 2
Это артефакт профайлера, без профайлера не будет никаких распределений. Различные профилировщики производят разные артефакты, в зависимости от того, как они записывают данные. Ниже вы увидите, как выглядит профилирование Nothing
JProfiler:
![enter image description here]()
Значительно меньше пилообразного рисунка. Тем не менее, есть также незначительное потребление памяти:
![enter image description here]()
что связано с тем, что агент профилирования опросит java.lang.management.MemoryUsage
JMX bean. В конечном итоге это потребление также приведет к сбору мусора.