Это проблема утечки памяти приложения Android.Android Memory Leak new Thread()
Я еще не знал, что следующий код вызывает утечку памяти, так как я начал программу Android в течение 3 лет.
Thread t = new Thread();
t НЕ обнаруживается сборщиком мусора.
Вопрос: как я могу освободить локальную переменную t из памяти vm?
Я решил поэкспериментировать
Я сделал кнопку на моем приложении, которое является поведением следующего кода.
for(int i=0;i<1000;i++)
{
Thread t = new Thread();
}
Ожидаемая локальная переменная t будет освобождена в определенный день.
И я выполнил его в режиме отладки и открыл перспективу DDMS для клипов.
Я выбираю мой поток приложения на моем устройстве Android (2.3.6) и щелкнул «обновление куча» кнопка
так что я могу проверить размер кучи и выделяюсь на реальное время.
Начато с общей площади кучи 5.445MB и выделено 2.779 МБ.
И я нажал кнопку, которая производит 1000 объектов потока.
Он был изменен на кучу размером 5.508MB и выделен 3.058 MB.
Как вы знаете, есть кнопка «Причина GC» в перспективе DDMS.
Я нажал на эту кнопку. Но выделенная память все еще была 3.058MB.
Я снова нажал на свою кнопку, чтобы создать еще 1000 объектов потока.
И я нажал безнадежную кнопку «Gause GC».
В конце концов размер кучи ушел около 20 МБ и из-за исключения из памяти.
Как я могу освободить объект экземпляра Thread?
В большинстве случаев лучше использовать Исполнителя вместо потока. Если вы используете что-то вроде cachedThreadPool, он будет обрабатывать активные потоки для вас. http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executor.html – Jave