Вкратце: у меня есть поток, который завершен, но не сбор мусора.
В длинном: см. следующий пример кода:
public void saveSomething() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// heavy memory access (~400 MB), finishes after ~10sec
}
});
thread.start();
}
Хорошо, так что этот поток запускается и заканчивается через некоторое время. За это время используется большая память, и все в порядке. Но моя проблема:
По завершении потока память не устанавливается
И я не знаю, как я могу это обеспечить. Готовые потоки, которые больше не используются, должны получить сбор мусора, насколько мне известно; но это, похоже, не происходит здесь: (
Смотрите этот скриншот от jvisualVM:
1: я запускаю запуск потока, вызывая saveSomething()
2: Thread был закончен давно (я видел его путем отладки), и я нажал "Выполнить GC" в jvisualvm
Как вы можете видеть, после принудительного включения GC все работает так, как я хочу. Но это должно произойти автоматически. Как я могу это сделать, что я делаю неправильно?
Если вам нужна дополнительная информация, пожалуйста, спросите. Примечание. Кажется, что через день (надеюсь, короче) память вернулась к нормальной жизни, может быть, GC просто "медленный" или, скорее, не очень часто приурочен?