Утечка памяти Android, новая тема () - PullRequest
1 голос
/ 29 марта 2012

Речь идет об утечке памяти в приложении Android объекта Thread.

Я еще не знал, что следующий код вызывает утечку памяти, так как я запустил программу для Android в течение 3 лет.

Thread t = new Thread();

tНЕ обнаруживается сборщиком мусора.

Вопрос в том, как я могу освободить локальную переменную t из памяти vm?

Я решил поэкспериментировать

Я сделал кнопкув моем приложении, которое выполняет следующий код.

for(int i=0;i<1000;i++)
{
   Thread t = new Thread();
}

Я ожидал, что локальная переменная t когда-нибудь будет освобождена.

И я выполнил ее в режиме отладки и открыл перспективу E-clipse DDMS.

Я выбрал поток приложений на устройстве Android (2.3.6) и нажал кнопку «Обновить кучу»

, чтобы я мог проверить размер кучи и выделить ее в реальном времени.

Он начался с общего размера кучи 5,445 МБ и выделил 2,779 МБ.

И я нажал кнопку, которая создает 1000 объектов потока.

Он изменился на размер кучи 5,508 МБ и выделил 3,058 МБ.

Как вы там знаетеэто кнопка «Причинить GC» в перспективе DDMS.

Я нажал эту кнопку.Но выделенная память по-прежнему составляла 3,058 МБ.

Я снова нажал кнопку, чтобы создать еще 1000 объектов потока.

И нажал безнадежную кнопку «Gause GC».

В конечном итоге кучаразмер ушел около 20 МБ и возникла исключительная ситуация нехватки памяти.

Как освободить объект экземпляра потока?

Ответы [ 2 ]

1 голос
/ 29 марта 2012

После того, как вы закончите использовать поток, позвоните interupt().

И я не знаю, если это необходимо, но это может быть хорошей идеей установить t=null как было предложено Йоханнесом.

Но после того, как вы остановили поток, теперь дело за сборщиком мусора JVM, чтобы справиться с уничтожением самого потока.

0 голосов
/ 29 марта 2012

У меня нет устройства Android для тестирования, но я думаю, что поток должен умереть, прежде чем его можно будет собрать мусором, в дополнение к тому, что на него не ссылаются никакие переменные.

Попробуйте запуститьтемы в вашем цикле, как это:

for(int i=0;i<1000;i++)
{
    Thread t = new Thread();
    t.start();
    t = null;
}
...