Страницы

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

четверг, 18 апреля 2019 г.

Утечка памяти при многократном запуске потока

Доброго (CurrentTime) ,Столкнулся со странностью при многократном создании потока и по завершению исполнения озу не освобождается, можете рассказать что тут происходит, прошу извинений за вопрос тк новичок?
public class MainClass {
public static void main(String[] args) throws InterruptedException {
int i = 0; while (i < 100000) { TestThread test = new TestThread(); test.start(); i++; }
System.gc(); Thread.sleep(8000);
}
}
Класс TestThread
public class TestThread extends Thread {
public void run() {
// Пустой
}
}


Ответ

Несколько возможных причин для такого поведения:
Потоки не завершились на момент вызова System.gc
Потоки, хоть они ничего и не делают, требуют выделения ресурсов для запуска. Вы запускаете один за другим 100000 потоков, а затем вызываете сразу gc не дожидаясь их завершения. Часть потоков может быть не завершена на этот момент. Дождаться завершения работы потока можно с помощью Thread.join
Вызов System.gc не обязательно запускает сборщик мусора.
Из документации к System.gc
Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. ... Вызов метода предлагает виртуальной машине Java приложить усилия для обработки неиспользуемых объектов, чтобы сделать память, которую они занимают, доступной для быстрого повторного использования. ....
В общем, это рекомендация, которая не гарантирует сборку мусора. Сборка мусора произойдет когда виртуальная машина посчитает нужным. Можете еще почитать ответ на вопрос: «Как часто надо вызывать сборщик мусора?»
Сборка мусора не обязательно освобождает память для ОС.
Даже если сборка мусора запустится, нет никакой гарантии, что освобожденная память будет возвращена ОС для использования в других процессах.
Освобождение памяти и выделение ее заново — ресурсоемкие задачи, которые могут оказать влияние на производительность клиентского (Вашего) кода. Поэтому разработчики JVM предусматривают сложные алгоритмы сборки мусора с минимальным влиянием на исполнение. В зависимости от настроек памяти JVM и используемого сборщика мусора память может быть сохранена для повторного использования Java (на очистку вообще не тратятся ресурсы) либо возвращена частично до определенного процентного порога (перераспределение памяти происходит в ограниченных масштабах).
Подробнее о разных сборщиках мусора смотрите в документации к используемой Вами версии JVM. Можете также ознакомиться с обзорными статьями по теме:
Статьи на сайте Oracle: Java HotSpot Garbage Collection Теория и практика Java: Сборка мусора в HotSpot JVM серия статей «Дюк, вынеси мусор!» на Хабре.

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

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