Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';无法在JNI中分配足够的内存_Android_C++_Memory_Memory Management_Java Native Interface - Fatal编程技术网

Android Can';无法在JNI中分配足够的内存

Android Can';无法在JNI中分配足够的内存,android,c++,memory,memory-management,java-native-interface,Android,C++,Memory,Memory Management,Java Native Interface,我有一个android本机共享库(.so),用于android应用程序。该库最初是为windows/desktop编写的,然后移植到移动平台。它包含一个“算法”代码,可用于大数据集。在库中,我不使用标准堆(malloc和friends),而是通过mmap分配内存页,使用标志MAP_PRIVATE | MAP_ANONYMOUS,然后进行适当的分区 现在,问题是在某个点上mmap失败,错误代码=12,内存不足。当分配的总内存大小达到大约650MB时,就会发生这种情况。我知道这个值非常大,远远高于典

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

现在,问题是在某个点上
mmap
失败,错误代码=12,内存不足。当分配的总内存大小达到大约650MB时,就会发生这种情况。我知道这个值非常大,远远高于典型的android应用程序所需要的值。但在我的具体案例中,这是合法的IMHO,因为这确实是这个库/应用程序所做的,并且这是由用户实现和批准的

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

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

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

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

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

提前谢谢