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 比顺序慢?

为啥 ByteBuffers hashCodes 是一样的?

ByteBuffer 在特定版本的 Android 上抛出 UnsupportedOperationException

哪些 JVM 不支持直接 java.nio.ByteBuffer?