无法在JNI

时间:2015-09-04 05:28:49

标签: android c++ memory memory-management java-native-interface

我有一个Android本机共享库(.so),用于Android应用程序。该库最初是为windows / desktop编写的,然后移植到移动平台。它包含一个“算法”代码,适用于大型数据集。在库中我不使用标准堆(malloc和朋友),而是使用标记mmap通过MAP_PRIVATE | MAP_ANONYMOUS分配内存页,然后进行适当的分区。

现在,问题是某些时候mmap失败,错误代码= 12,即内存不足。当分配的内存总大小达到 650MB 时会发生这种情况。我知道这个值非常大,远远高于典型的Android应用程序所需要的。但在我的具体情况下,这是合法的恕我直言,因为这确实是这个库/应用程序所做的事情,这是由用户实现和批准的。

具体来说,我尝试在三星平板电脑SM-T800上运行它,该平板电脑具有3GB内存,32位armeabi-v7a架构和超过7GB的免费存储空间(闪存)。所以技术上应该没有问题。

此外,这不是虚拟内存碎片的问题:当我要求分配额外的内存块时,mmap失败了 16MB 。因此,很可能系统会对可以为进程分配多少内存页面施加一些人为限制。

所以,我的问题是,是否以及如何消除此限制。从我在在线文档中发现的,没有提到这个限制,但我很确定它存在。我还在一些论坛中读到,从Android 5.0开始,一些应用程序无法分配尽可能多的内存。

如果无法删除此限制,是否有助于处理文件映射?目前我以压缩方式将数据存储在源文件中,然后我读取它并在内存中构建复杂的数据结构。相反,我可以将整个数据结构存储在一个文件中(意味着文件会更大),然后通过mmap将其映射到内存中。虚拟地址空间的总大小将是相同的,但如果限制不是它的大小,而是分配了多少页面而没有文件支持 - 这可能有效。

作为最后的手段,我可​​以放弃将所有数据都放在(虚拟)内存中,并手动阅读和放弃的想法。仅锁定我当前需要的数据部分,并丢弃最近未使用的数据部分。但是通过这种方式我实际上复制了内存管理器的工作,因为分页机制就是这样做的。

提前致谢。

0 个答案:

没有答案