我有一个应用程序需要在任何给定时刻在队列中存储3~1MB字节数组。似乎最终发生的事情是我收到此消息
I/dalvikvm-heap﹕ Grow heap (frag case) to 4.827MB for 1058412-byte allocation
然后我的byte[]
被分配了大小为0。
我已尝试在清单中设置android:LargeHeap="true"
,但这仍然会发生。
如果我使用ByteBuffers而不是byte[]
,是否可以存储这3个byte[]
对象而没有内存问题?
答案 0 :(得分:0)
从症状(并且没有看到你的代码)看起来问题不是堆的总大小;更确切地说,Android无法找到足够大的1MB阵列的单个,连续的可用内存块。考虑到Android设备的资源限制,这并不奇怪。如果我对正在发生的事情说得对,那么我非常怀疑ByteBuffer
会解决问题;它仍然需要分配一个足够大的单字节数组。
如果您的用例允许,您可以考虑将每个1MB byte[]
分成更小的块。 (有一个很好的博客文章here关于一种方法。)系统将更容易找到16块空闲内存,每个64KB(例如),而不是找到一个块大小1MB。我已成功使用这种方法(尽管使用与上述链接不同的设计)来加载大于2.5MB的数据集,即使在总堆数小得多的旧设备(例如,Android 2.2)上也是如此大小比最近的设备。