【问题标题】:Android Memory Leak new Thread()Android 内存泄漏 new Thread()
【发布时间】: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 并导致内存不足异常。

如何释放线程实例对象?

【问题讨论】:

标签: java android memory-leaks


【解决方案1】:

使用完线程后,调用interupt()

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

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

【讨论】:

  • 它不起作用.... for(int i=0;i
  • 好吧。真的应该没关系。应该没有需要创建 1000 个线程的实例。并且创建一个线程不会占用那么多内存。您创建这么多线程的事实可能是问题的原因。如果您要创建一个,中断它,并使其为空,那么它很可能会从内存中清除。如果没有,那么我不相信你能做些什么。
  • 这实际上解决了我的情况,我使用 12 个线程对象的数组在大约 20 分钟内创建了 7000 个线程。 @muyoungko我注意到您的for循环测试实际上没有运行或任何东西-也许这是问题的一部分...在start()之后过早调用interrupt()?在我的情况下,我有一个 AtomicBoolean (用于多个线程的数组),它告诉我线程已完成 - 然后我在原始 Thread 对象上中断(),然后在同一个数组插槽中创建一个新对象。此解决方案消除了内存泄漏。
【解决方案2】:

我没有安卓设备来测试它,但我认为除了不被任何变量引用之外,线程还需要死掉才能被垃圾收集。

尝试像这样在循环中启动线程:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多