小编Ant*_*eau的帖子

android mmap因内存不足而失败

我到处寻找答案,但我想我已经达到了我能找到的极限.我的问题似乎与此有点相关:升级到Lollipop后,32位设备上的Android NDK mmap调用被破坏但没有提供答案.

我的问题是我尝试通过mmap调用从文件中存储映射457232384字节.在Android 5.1.1的两个不同的设备(三星Galaxy Note 3和OnePlus One,每个3GB RAM)上,该调用失败,错误12"内存不足".实际上,当我尝试分配超过300MB的内存时,调用失败.313524224字节(299MB)工作,314572800(300MB)不会.

事情是,同样的调用适用于第四台仍在Android 4.4.2上的设备.更奇怪的是,这个调用适用于带有SDK 21(Android 5.0)的Android ARM模拟器.不用说,可以毫无问题地加载相同数量的数据(不是mmap').

dmesg向我报告:

<3>[ 1137.488411] [0:Thread-298: 4267] arch_get_unmapped_area (TASK_SIZE - len < addr) len=457232384 task size=3204448256 pid=4267 do_align=0 addr=3034054656 mmap_base=3069939712
Run Code Online (Sandbox Code Playgroud)

尝试映射文件的函数(来自openfst)如下:

MappedFile* MappedFile::Map(istream* s, const FstReadOptions &opts,
                        size_t size) {
  size_t pos = s->tellg();

  if (opts.mode == FstReadOptions::MAP && pos >= 0 &&
      pos % kArchAlignment == 0) {
    int fd = open(opts.source.c_str(), O_RDONLY);
    if (fd != -1) {
      int pagesize = getpagesize();
      off_t offset = …
Run Code Online (Sandbox Code Playgroud)

memory android mmap android-ndk

5
推荐指数
1
解决办法
7866
查看次数

标签 统计

android ×1

android-ndk ×1

memory ×1

mmap ×1