此外,我看到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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)