Android:GC不尊重SoftReferences?

Android:GC不尊重SoftReferences?,第1张

概述它接缝Dalvik的垃圾收集器不尊重SoftReferences并尽快删除它们,就像WeakReferences一样.我还没有100%肯定,但是尽管事实上还有〜3MB的可用内存,但是在我看到在“LogCat”中看到“GC释放bla-bla-bla字节”之后,我的SoftReferences被清除了. 此外,我看到Mark Murphy here发表了评论: Except that it doesn 它接缝Dalvik的垃圾收集器不尊重SoftReferences并尽快删除它们,就像WeakReferences一样.我还没有100%肯定,但是尽管事实上还有〜3MB的可用内存,但是在我看到在“LogCat”中看到“GC释放bla-bla-bla字节”之后,我的SoftReferences被清除了.

此外,我看到Mark Murphy @L_301_0@发表了评论:

Except that it doesn’t work on
AndroID,at least in the 1.5
timeframe. I have no IDea if the GC
SoftReference BUGs have been fixed.
SoftReferences get GC’d too soon with
this BUG.

是真的吗SoftReference是否不受尊重?

如何解决这个问题?

解决方法@H_419_19@ 没有收到答案后,我决定自己做研究.我已经做了一个简单的测试来对SoftReferences执行GC.
public class TestSoftReference extends TestCase {    public voID testSoftRefsAgainstGc_1() {        testGcWithSoftRefs(1);    }    public voID testSoftRefsAgainstGc_2() {        testGcWithSoftRefs(2);    }    public voID testSoftRefsAgainstGc_3() {        testGcWithSoftRefs(3);    }    public voID testSoftRefsAgainstGc_4() {        testGcWithSoftRefs(4);    }    public voID testSoftRefsAgainstGc_5() {        testGcWithSoftRefs(5);    }    public voID testSoftRefsAgainstGc_6() {        testGcWithSoftRefs(6);    }    public voID testSoftRefsAgainstGc_7() {        testGcWithSoftRefs(7);    }    private static final int SR_COUNT = 1000;    private voID testGcWithSoftRefs(final int gc_count) {        /* "Integer(i)" is a referrent. It is important to have it referenced         * only from the SoftReference and from nothing else. */        final ArrayList<SoftReference<Integer>> List = new ArrayList<SoftReference<Integer>>(SR_COUNT);        for (int i = 0; i < SR_COUNT; ++i) {            List.add(new SoftReference<Integer>(new Integer(i)));        }        /* Test */        for (int i = 0; i < gc_count; ++i) {            System.gc();            try {                Thread.sleep(200);            } catch (final InterruptedException e) {            }        }        /* Check */        int dead = 0;        for (final SoftReference<Integer> ref : List) {            if (ref.get() == null) {                ++dead;            }        }        assertEquals(0,dead);    }}

这个想法是,我每次运行相同的代码,每次在SoftReferences上增加压力(通过运行更多的GC通行证).

结果非常有趣:除了一个,所有运行通过只是罚款!

On AndroID 1.5 device:testSoftRefsAgainstGc_1()  Failed!  AssertionFailedError: expected:0 but was:499testSoftRefsAgainstGc_2()  passedtestSoftRefsAgainstGc_3()  passedtestSoftRefsAgainstGc_4()  passedtestSoftRefsAgainstGc_5()  passedtestSoftRefsAgainstGc_6()  passedtestSoftRefsAgainstGc_7()  passedOn AndroID 1.6 device:testSoftRefsAgainstGc_1()  passedtestSoftRefsAgainstGc_2()  Failed!  AssertionFailedError: expected:0 but was:499testSoftRefsAgainstGc_3()  passedtestSoftRefsAgainstGc_4()  passedtestSoftRefsAgainstGc_5()  passedtestSoftRefsAgainstGc_6()  passedtestSoftRefsAgainstGc_7()  passedOn AndroID 2.2 device:All pass.

这些测试结果是稳定的.我尝试了很多次,每次都是一样的.所以我相信垃圾回收器确实是一个BUG.

结论

所以,我们从中学到什么…在你的代码中使用SoftReferences对于AndroID 1.5-1.6设备来说是毫无意义的.对于这些设备,您将无法获得期望的行为.不过我并没有尝试2.1.

总结

以上是内存溢出为你收集整理的Android:GC不尊重SoftReferences?全部内容,希望文章能够帮你解决Android:GC不尊重SoftReferences?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1131985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存