Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Почему java программа не освобождает память?

#java #память #jvm #сборщик_мусора


У меня тут творятся очень странные вещи с памятью. Есть главный класс в котором main
метод запускает множество потоков. Эти созданные потоки через какое то время убиваю,никаких
объектов и потоков но память выросла и не освобождается..наблюдаю за всем этим в профайлере(JProfiler).
Нет никаких потоков и обьектов кроме main, но память все так же стоит и не освобождается,
когда запускаю новые потоки память растет с того же места на котором остановилось до
этого. т.е. похож на утечку памяти. но вроде никаких утечек нет. В памяти висят не
очень много обьектов,самый большой это массив char[] Посмотрите на картинках: в диспетчере
задач показывает что программа съедает 259 мб.

и на данный момент нет ничего кроме метода main который в состоянии Thread.sleep().



ниже объекты которые в памяти :



И вот общие сведения о том сколько жрет моя программа : 


Объясните, что тут к чему? Почему если в памяти нет почти никаких объектов  приложение
занимает 81 мб(это то что написано в профайлере). Как будто приложение распухло но
внутри ничего нет.
    


Ответы

Ответ 1



У Java есть свой heap, в котором аллоцируются объекты. Когда объект освобождается сборщиком мусора, освобождается место именно в хипе Java, а не в общесистемном. Сборщики мусора могут иметь разные стратегии того, как они отдают память обратно системе. Кроме того, JVM использует и системный heap для своих нужд, например для стеков ваших потоков (которых вы создаете множество).

Ответ 2



Это обычное поведение JVM. JVM управляет памятью через некоторый промежуточный артефакт, т.н. heap - большой (огромный) кусок памяти, в котором по мере необходимости создаются (и удаляются) объекты, но сам heap как был аллоцирован, так и остается. В целом JVM может отдать часть heap обратно ОС, но прямых способов воздействия на этот процесс нет, плюс из-за характера использования с этим могут быть некоторые проблемы (например, сначала придется компактить содержимое хипа).

Комментариев нет:

Отправить комментарий