Как освободить память, выделенную Swingworker? - PullRequest
1 голос
/ 16 декабря 2010

Моя программа использует несколько потоков Swingworker, и мне нужно освободить память каждого потока после его завершения.Завершается ли мой поток завершением метода doInBackground() или останавливается cancel(), сам поток остается там (он все еще отображается в Jconsole).

Я разыменовываю экземпляр Swingworker и запускаю сборку мусора, но мой Java-процесс никогда не освобождает память (например, как показано в диспетчере задач Windows).

Как мне полностью удалить завершенную нить Swingworker?

Или как я могу освободить память, которую она выделяет в нескольких местах во время какой-то сложной обработки?

Любой совет наиболее ценится.Спасибо.

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Вы, наверное, не нужно ничего делать, и ваш код уже работает по желанию.Поток все еще там, потому что он является частью пула потоков, но это не означает, что память, используемая объектом SwingWorker, не освобождается.

Процесс Java никогда не освобождает какую-либо память (например, как показаноДиспетчер задач Windows).

JVM (по крайней мере, Sun / Oracle), как правило, очень неохотно возвращает память в ОС и делает это только в том случае, если более 70% памяти кучинеиспользованными. Это может быть настроен с помощью -XX:MaxHeapFreeRatio параметры командной строки (но, как правило, должны быть оставлены как есть).

1011 * Для диагностики использования программы памяти, это гораздо полезнее использовать такой инструмент, как VisualVM, который может отображать используемые и свободную память кучи.Я не знаю JConsole хорошо, но было бы ожидать, что она имеет ту особенность, а также.
0 голосов
/ 08 августа 2011

У меня похожая проблема.Я использую несколько потоков SwingWorker для выполнения некоторых вычислений, и диспетчер задач Windows сообщает, что количество потоков в java.exe никогда не уменьшается, а всегда увеличивается.Если задача была выполнена нормально или отменена, кажется, не имеет никакого значения.

Насколько я могу судить, количество потоков зависит от объема оперативной памяти машины и максимального адресного пространства, доступного для процесса.(в 32-разрядных операционных системах это значение составляет 2 ГБ).

Насколько я знаю, иногда это не единственные ограничения.В Windows (XP или более поздней версии) я слышал, что, хотя ОС явно не устанавливает ограничение, процессы с более чем 1000 потоков имеют тенденцию к сбоям без видимой причины.

Я попытаюсь использовать свою программуначать и отменить эти темы SwingWorker, пока число не станет очень большим.Мне очень любопытно, что произойдет (у меня XP 32 бит и 1 ГБ оперативной памяти).

Дело в том, что это может быть реальной проблемой.Если на некоторых операционных системах и / или аппаратных платформах возникают проблемы с подсчетом потоков, то у кого-то, кто использует такую ​​программу в течение очень длительного периода времени (не выходя из нее в течение нескольких часов), могут возникнуть очень неприятные ситуации ...

...