0

我发现这些代码可能会在 android 2.1 上导致内存泄漏


    SoundPool soundPool = new SoundPool(10, 7, 0);
    ...
    ...
    soundPool = null;

每次执行后,MAT 插件都会告诉进程的堆中添加了“android:unnamed_thread”的两个 String 对象。这是个问题吗?

4

2 回答 2

2

您是否尝试运行 soundPool.release() 而不是 soundPool = null?

于 2010-11-04T01:56:19.897 回答
0

我看到了两种可能性(可能还有更多)。

第一个(很可能)对所有 Java 对象都是正确的:仅仅因为您将引用设置为null并不自动意味着它后面的对象将被垃圾收集。

如果一个SoundPool对象本身包含对两个线程对象的引用,则在需要空间之前,这三个对象中的任何一个都不一定会被 GC(尽管这当然取决于您的收集器的积极性)。

第二个(不太可能)是Android可能足够聪明,可以缓存线程(甚至SoundPool)对象,以防它们需要再次使用。如果对象创建比对象回收更昂贵,他们可能会将此作为性能优化。

在这种情况下,它们仍然会引用缓存中某处的对象,并且它们不会被认为有资格进行垃圾收集。

于 2010-08-16T02:29:55.860 回答