@Atllantis

Как освободить выделенную потоку память?

Есть большое кол-во потоков.
На каждый поток выделяется примерно 280 Кб фиксированной памяти (без учёта используемой памяти внутри потока).
После завершения работы, поток завершается и в стеке его больше нет. Но память выделенная на поток (~280Кб) остаётся.

Ещё поясню, я просто в цикле создаю 100 потоков, в которых, в методе run() есть только "sleep(1000)" и всё. Соответственно через 1 сек. поток завершает работу, что видно на скрине, но память выделенная потоку не освобождается.

8730ca5ee6614d1d96ac827a3af3ef39.PNG

Как это исправить?
Или это не страшно? И при необходимости память освободится?
Т.е. как я понимаю, память освобождается, но она резервируется и доступна в любой момент текущей программе. Но, что будет если память понадобится другой программе?

UPD:
Но, если в этих же потоках использовать переменные (что я и делаю), то в общем один поток занимает около 400Кб памяти. По завершении работы в потоке, я очищаю переменные. И память занимаемая переменными освобождается и становится доступной ОС, а память занимаемая потоками не доступна ОС.
Т.е. допустим есть 100 потоков, на поток выделяется 280Кб + в потоке используется ещё 120Кб памяти.
В общей сложности все потоки жрут 40 000Кб памяти. После завершения работы потоков, и очистки переменных, занято памяти остаётся 28 000Кб. Т.е. 12 000Кб освободилось и стало доступно ОС, а 28 000Кб всё ещё "используются" программой. P.S. цифры примерные, но смысл думаю понятен. :)
Ну и вот скрин к вышесказанному:
b9a87944a6d145e58688fe71c795c2d8.jpg
1 - память используемая внутри потоков - освобождается
2 - память выделяемая потокам - не освобождается
  • Вопрос задан
  • 701 просмотр
Пригласить эксперта
Ответы на вопрос 2
Losted
@Losted
Software Architect
Должно почиститься при следующей сборке мусора. Можете сэмулировать нажав кнопку Perform GC. Уже аллоцированная память под JVM другим процессам не возвращается, насколько я помню.
Ответ написан
Комментировать
@sirs
В java память и не должна осбождаться таким образом.
GC стартует только тогда, когда это реально нужно, например когда нужно выделить память под новый объект, а память уже на исходе (очень грубый пример). Посмотрите тут или еще лучше в спецификации.
Принудительно вызвать GC из клиентского кода и удалить неиспользуемые объекты возможности нет.

UPD: Думаю это обсуждение должно дать вам ответ.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы