ByteBuffers 是在 Android 中存储 > 1MB 数据的好方法吗?
Posted
技术标签:
【中文标题】ByteBuffers 是在 Android 中存储 > 1MB 数据的好方法吗?【英文标题】:Are ByteBuffers a good way to store > 1MB of data in Android? 【发布时间】:2014-11-05 01:11:41 【问题描述】:我有一个应用程序需要在任何给定时刻将 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[]
对象而不会出现内存问题?
【问题讨论】:
你在重用这些字节数组吗?还是让他们收集垃圾并尝试稍后重新分配它们? '`byte[] 分配的大小为 0' 除非您指定大小为零,否则不会发生。它不会响应内存不足的情况而发生。 是的,Dalvik VM 似乎有能力(至少在模拟器上)删除一个太大的字节数组。很奇怪。 【参考方案1】:从症状(并且没有看到您的代码)听起来问题不在于堆的总大小;相反,Android 无法找到一个足够大的可用内存块来容纳您的 1MB 数组。考虑到 Android 设备的资源限制,这并不奇怪。如果我对正在发生的事情是正确的,那么我非常怀疑ByteBuffer
能否解决问题;它仍然需要分配一个足够大的单字节数组。
如果您的用例允许,您可以考虑将每个 1MB byte[]
拆分成更小的块。 (有一篇很好的博客文章here 介绍了一种方法。)系统将更容易找到 16 个 64KB 的空闲内存块(例如),而不是找到一个大小为 1MB 的块。我已经成功地使用了这种方法(尽管使用与上述链接不同的设计)来加载略大于 2.5MB 的数据集,即使在总堆大小远小于的旧设备(例如 Android 2.2)上也是如此更新的设备。
【讨论】:
以上是关于ByteBuffers 是在 Android 中存储 > 1MB 数据的好方法吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Bytebuffers 和 NIO 时如何避免 OutOfMemoryError?
由于 Netty 中的 ByteBuffers 导致的内存泄漏
为啥 ByteBuffers hashCodes 是一样的?