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