Почему пустая Java-программа потребляет память? - PullRequest
24 голосов
/ 02 декабря 2011

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

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

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

Image description here

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

EDIT:

Java-версия "1.6.0_29"

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

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

ОС: Windows 7 Enterprise-32 bit

Ответы [ 2 ]

11 голосов
/ 03 декабря 2011

Почему до сих пор существует рисунок зубьев пилы?

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

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

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

4 голосов
/ 05 декабря 2011

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

enter image description here

Гораздо меньше пилообразного паттерна.Однако есть и незначительное потребление памяти:

enter image description here

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

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