Android NDK:为什么这个malloc()没有明显的效果?

Android NDK:为什么这个malloc()没有明显的效果?,android,android-ndk,Android,Android Ndk,下面是我正在使用的代码的简化版本 爪哇: C: 现在,当我从MyClass.java调用malloc()时,我希望看到分配了32M内存,并且我能够在某处观察到可用内存的下降。 然而,我在adb shell dumpsys meminfo或adb shell cat/proc/meminfo中都没有看到这方面的任何迹象。我对C相当陌生,但有一大堆Java经验。我希望在Dalvik的堆之外分配一堆内存(因此它不是由Android/Dalvik管理的)用于测试目的。Hackbod让我相信Android

下面是我正在使用的代码的简化版本

爪哇:

C:

现在,当我从MyClass.java调用malloc()时,我希望看到分配了32M内存,并且我能够在某处观察到可用内存的下降。
然而,我在
adb shell dumpsys meminfo
adb shell cat/proc/meminfo
中都没有看到这方面的任何迹象。我对C相当陌生,但有一大堆Java经验。我希望在Dalvik的堆之外分配一堆内存(因此它不是由Android/Dalvik管理的)用于测试目的。Hackbod让我相信Android目前没有限制本地代码中分配的内存量,因此这似乎是正确的方法。我这样做对吗?

memset()
之后,您应该会看到“私有/脏”页面的增加。如果您在设备上安装了额外的开发人员命令行实用程序,则可以运行
procrank
showmap
来轻松查看。需要根设备

否则,让流程在分配前后将
/proc/self/maps
的内容复制到文件中。(最简单的方法是将其写入外部存储;您需要清单中的
write_external_storage
权限。)通过比较映射输出,您应该看到一个新的32MB区域,或者一个扩展了32MB的现有区域。这是因为32MB高于dlmalloc的内部堆阈值,所以应该通过调用mmap()来分配内存


您可以从本机代码分配的内存量没有固定限制。但是,分配的越多,内核的低内存进程杀手就越受欢迎。

日志cat中是否出现任何调试?是的,日志消息按预期显示。似乎正确,请参阅以获取有关内存使用的深入讨论。在设备上的
top-m 20-s vss
输出中,我可以看到vss正在增加,但是VSS本质上不是一个毫无价值的“虚拟”度量吗?缺少的peice:
memset(blob,“\0”,sizeof(char)*字节)编辑的原始问题。
private native void malloc(int bytes);
private native void free();

// this is called when I want to create a very large buffer in native memory
malloc(32 * 1024 * 1024);

// EDIT: after allocating, we need to initialize it before Android sees it as anythign other than a "reservation"
memset(blob, '\0', sizeof(char) * bytes);


...

// and when I'm done, I call this
free()
static char* blob = NULL;

void Java_com_example_MyClass_malloc(JNIEnv * env, jobject this, jint bytes)
{

    blob = (char*) malloc(sizeof(char) * bytes);

    if (NULL == blob) {
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Failed to allocate memory\n");
    } else {
        char m[50];
        sprintf(m, "Allocated %d bytes", sizeof(char) * bytes);
        __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, m);
    }
}

void Java_com_example_MyClass_free(JNIEnv * env, jobject this)
{
    free(blob);
    blob = NULL;
}