val*_*ldo 6 c++ memory java-native-interface android memory-management
我有一个Android本机共享库(.so),用于Android应用程序.该库最初是为windows/desktop编写的,然后移植到移动平台.它包含一个"算法"代码,适用于大型数据集.在库中我不使用标准堆(malloc
和朋友),而是mmap
使用标志分配内存页MAP_PRIVATE | MAP_ANONYMOUS
,然后适当地进行分区.
现在,问题是在某些时候mmap
失败,错误代码= 12,这是内存不足.当分配的总内存大小达到大约650MB时,会发生这种情况.我知道这个值非常大,远远高于典型的Android应用程序所需要的.但在我的具体情况下,这是合法的恕我直言,因为这确实是这个库/应用程序所做的,并且这是由用户实现和批准的.
具体来说,我尝试在三星平板电脑SM-T800上运行它,它具有3GB RAM,32位armeabi-v7a架构和超过7GB的免费存储空间(闪存).所以在技术上应该没有问题.
这也不是虚拟内存碎片的问题:mmap
当我要求分配多达16MB的额外内存块时失败.因此,很可能系统会对可以为进程分配多少内存页面施加一些人为限制.
所以,我的问题是,是否以及如何消除此限制.从我在在线文档中发现的,没有提到这个限制,但我很确定它存在.我还在一些论坛中读到,从Android 5.0开始,一些应用程序无法分配尽可能多的内存,而不是旧系统.
如果无法删除此限制,是否有助于处理文件映射?目前我以压缩方式将数据存储在源文件中,然后我读取它并在内存中构建复杂的数据结构.相反,我可以将整个数据结构存储在一个文件中(意思是,文件会更大),然后通过它将它映射到内存中mmap
.虚拟地址空间的总大小将是相同的,但如果限制不是它的大小,而是分配了多少页面而不是文件支持 - 这可能有效.
作为最后的手段,我可以放弃在(虚拟)内存中存储所有数据的想法,并手动读取和锁定我当前需要的数据部分,并丢弃最近未使用的数据部分.但是通过这种方式我实际上复制了内存管理器的工作,因为分页机制就是这样做的.
提前致谢.
归档时间: |
|
查看次数: |
305 次 |
最近记录: |