【发布时间】:2012-03-29 08:17:50
【问题描述】:
这是关于线程对象的android应用程序内存泄漏。
自从我开始使用android程序3年以来,我还不知道以下代码会导致内存泄漏。
Thread t = new Thread();
t 未被垃圾收集器检测到。
问题是如何从 vm 内存中释放局部变量 t?
我决定尝试一下
我在我的应用程序上制作了按钮,该按钮遵循以下代码。
for(int i=0;i<1000;i++)
{
Thread t = new Thread();
}
我预计有一天局部变量 t 会被释放。
我以调试模式执行它并打开了 E-clipse DDMS 透视图。
我在我的 android 设备 (2.3.6) 上选择我的应用程序线程并单击“更新堆”按钮
所以我可以检查堆大小并实时分配。
开始时总堆大小为 5.445MB,分配了 2.779 MB。
然后我点击了生成 1000 个线程对象的按钮。
它改变了堆大小 5.508MB 并分配了 3.058 MB。
如您所知,DDMS 透视图中有“Cause GC”按钮。
我点击了那个按钮。但是分配的内存还是 3.058MB。
我再次单击按钮以生成另外 1000 个线程对象。
然后我点击了绝望的“Gause GC”按钮。
最终堆大小消失了大约 20MB 并导致内存不足异常。
如何释放线程实例对象?
【问题讨论】:
-
在大多数情况下,最好使用 Executor 而不是线程。如果您使用类似 cachedThreadPool 的东西,它将为您处理活动线程。 docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/…
标签: java android memory-leaks