相关疑难解决方法(0)

Java mmap在Android上失败,"mmap失败:ENOMEM(内存不足)"

使用Java在Android上映射大型文件的内存效果很好.但是,即使有多个映射调用,当总共映射超过~1.5GB时,它也会失败:

mmap failed: ENOMEM (Out of memory)
Run Code Online (Sandbox Code Playgroud)

请参阅此处的完整讨论.注意:它在服务器Linux上不会失败.为应用程序启用了android:largeHeap ="true".

以下Java代码被称为几百次,每次调用请求~1MB:

ByteBuffer buf = raFile.getChannel().map(allowWrites ? FileChannel.MapMode.READ_WRITE : FileChannel.MapMode.READ_ONLY, offset, byteCount);
Run Code Online (Sandbox Code Playgroud)

避免请求一个通常难以找到的大的连续内存块.请在此处查看完整代码.请记住,将"段大小"(即单个地图调用的大小)加倍无效,这意味着它会停在相似的内存位置.另外值得注意的是,两个略低于极限的应用程序正在执行正常(暗示每个进程限制).

相关问题在这里,这里,这里,这里,这里,这里,这里这里.

使用多个文件而不是一个具有多个映射的文件会有帮助吗?

我已经读过,这可能是虚拟地址空间的每个进程限制.哪里可以找到更多相关信息?我可以用NDK更改此设置,例如如何调用ulimit?可以由madvise帮我一点吗?

更新

有关可在Java中使用的mmap工具,请参阅此处的答案

java android memory-management mmap android-ndk

10
推荐指数
1
解决办法
1710
查看次数

标签 统计

android ×1

android-ndk ×1

java ×1

memory-management ×1

mmap ×1