#java #память #jvm #сборщик_мусора
У меня тут творятся очень странные вещи с памятью. Есть главный класс в котором main метод запускает множество потоков. Эти созданные потоки через какое то время убиваю,никаких объектов и потоков но память выросла и не освобождается..наблюдаю за всем этим в профайлере(JProfiler). Нет никаких потоков и обьектов кроме main, но память все так же стоит и не освобождается, когда запускаю новые потоки память растет с того же места на котором остановилось до этого. т.е. похож на утечку памяти. но вроде никаких утечек нет. В памяти висят не очень много обьектов,самый большой это массив char[] Посмотрите на картинках: в диспетчере задач показывает что программа съедает 259 мб. и на данный момент нет ничего кроме метода main который в состоянии Thread.sleep(). ниже объекты которые в памяти : И вот общие сведения о том сколько жрет моя программа : Объясните, что тут к чему? Почему если в памяти нет почти никаких объектов приложение занимает 81 мб(это то что написано в профайлере). Как будто приложение распухло но внутри ничего нет.
Ответы
Ответ 1
У Java есть свой heap, в котором аллоцируются объекты. Когда объект освобождается сборщиком мусора, освобождается место именно в хипе Java, а не в общесистемном. Сборщики мусора могут иметь разные стратегии того, как они отдают память обратно системе. Кроме того, JVM использует и системный heap для своих нужд, например для стеков ваших потоков (которых вы создаете множество).Ответ 2
Это обычное поведение JVM. JVM управляет памятью через некоторый промежуточный артефакт, т.н. heap - большой (огромный) кусок памяти, в котором по мере необходимости создаются (и удаляются) объекты, но сам heap как был аллоцирован, так и остается. В целом JVM может отдать часть heap обратно ОС, но прямых способов воздействия на этот процесс нет, плюс из-за характера использования с этим могут быть некоторые проблемы (например, сначала придется компактить содержимое хипа).
Комментариев нет:
Отправить комментарий