Android内存泄漏新线程()

时间:2012-03-29 08:17:51

标签: java android memory-leaks

这是关于Thread对象的android应用程序内存泄漏。

自从我启动android程序3年后,我还不知道代码是否导致内存泄漏。

Thread t = new Thread();
垃圾收集器未检测到

问题是如何从vm内存中释放局部变量?

我决定试验

我在我的应用上创建了按钮代码的按钮。

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透视图上有“原因GC”按钮。

我点击了那个按钮。但分配的内存仍然是3.058MB。

我再次单击我的按钮以生成另外1000个线程对象。

我点击了无望的“Gause GC”按钮。

最终堆大小消失了大约20MB并导致内存不足。

如何发布Thread实例对象?

2 个答案:

答案 0 :(得分:1)

使用完线程后,请致电interupt()

我不知道是否有必要,但按照约翰内斯的建议设置t=null可能是个好主意。

但是在你停止了线程之后,由JVM的垃圾收集器来处理线程本身的破坏。

答案 1 :(得分:0)

我没有Android设备来测试它,但我认为除了没有被任何变量引用之外,线程需要在它被垃圾收集之前死掉。

尝试启动循环中的线程,如下所示:

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