Android NDK:为什么这个malloc()没有可观察到的影响?

时间:2013-04-11 18:47:09

标签: android android-ndk

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

爪哇:

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()

C:

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;
}

现在当我从MyClass.java调用malloc()时,我希望看到32M的内存分配,并且我能够在某处看到可用内存的这种下降。 但是,我没有在adb shell dumpsys meminfoadb shell cat /proc/meminfo中看到任何迹象。我是C的新手,但有一堆Java经验。我想在Dalvik的堆之外分配一堆内存(所以它不是由Android / dalvik管理的)用于测试目的。 Hackbod让我相信Android目前没有对Native代码中分配的内存量进行限制,所以这似乎是正确的方法。我这样做了吗?

1 个答案:

答案 0 :(得分:3)

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

如果失败,请让进程在分配之前和之后将/proc/self/maps的内容复制到文件中。 (最简单的方法是将其写入外部存储;您需要在清单中使用WRITE_EXTERNAL_STORAGE权限。)通过比较地图输出,您应该看到新的32MB区域,或者扩展32MB的现有区域。这是因为32MB高于dlmalloc的内部堆阈值,因此应该使用对mmap()的调用来分配内存。

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