android java mmap,Java mmap在Android上失败,“mmap failed:ENOMEM(Out of memory)”)
内存映射在Android上的一个大文件在Java中工作得很好.但是当映射超过〜1.5GB时,即使使用多个映射调用,也会失败:mmap failed: ENOMEM (Out of memory)请参阅完整的讨论here.注意:它不会在服务器Linux上失败.为应用程序启用了android:largeHeap =“true”.以下Java代码被称为几百次,每次调用请求〜1MB:ByteBuffer
内存映射在
Android上的一个大文件在Java中工作得很好.但是当映射超过〜1.5GB时,即使使用多个映射调用,也会失败:
mmap failed: ENOMEM (Out of memory)
请参阅完整的讨论here.注意:它不会在服务器Linux上失败.为应用程序启用了android:largeHeap =“true”.
以下Java代码被称为几百次,每次调用请求〜1MB:
ByteBuffer buf = raFile.getChannel().map(allowWrites ? FileChannel.MapMode.READ_WRITE : FileChannel.MapMode.READ_ONLY, offset, byteCount);
以避免请求一个大的连续的内存块,这常常难以被发现.请参阅完整的代码here.请记住,将“段大小”(即单个地图调用的大小)加倍没有任何影响,这意味着它将停留在类似的内存位置.同样重要的是要注意,两个略低于限制的应用程序都执行正常(暗示每个进程限制).
将使用多个文件而不是一个文件与多个映射有帮助?
我已经读过这可能是虚拟地址空间的每个进程限制.在哪里可以找到更多关于这一点?我可以用NDK更改此设置吗?如何调用ulimit?可以madvise帮我一下吗
更新
有关可用于Java的mmap工具,请参阅我的答案here
更多推荐
所有评论(0)