4

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

爪哇:

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 meminfo但是,无论是在或中,我都没有看到任何迹象adb shell cat /proc/meminfo。我对 C 很陌生,但有很多 Java 经验。我正在寻找在 Dalvik 堆之外分配一堆内存(因此它不由 Android/dalvik 管理)用于测试目的。Hackbod 让我相信 Android 目前对 Native 代码中分配的内存量没有限制,所以这似乎是正确的做法。我这样做对吗?

4

1 回答 1

3

您应该会看到在memset(). 如果您在设备上安装了额外的开发人员命令行实用程序,您可以轻松运行procrankshowmap <pid>查看它。需要有根设备。

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

您可以从本机代码分配的内存量没有固定限制。然而,你分配的越多,你对内核的低内存进程杀手的期待就越大。

于 2013-04-16T21:03:24.183 回答