这是我正在使用的代码的简化版本
爪哇:
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代码中分配的内存量进行限制,所以这似乎是正确的方法。我这样做了吗?
答案 0 :(得分:3)
您应该会在memset()
之后看到“私人/脏”页面的增加。如果您在设备上安装了额外的开发人员命令行实用程序,则可以运行procrank
或showmap <pid>
以轻松查看此内容。需要有根设备。
如果失败,请让进程在分配之前和之后将/proc/self/maps
的内容复制到文件中。 (最简单的方法是将其写入外部存储;您需要在清单中使用WRITE_EXTERNAL_STORAGE
权限。)通过比较地图输出,您应该看到新的32MB区域,或者扩展32MB的现有区域。这是因为32MB高于dlmalloc的内部堆阈值,因此应该使用对mmap()的调用来分配内存。
您可以从本机代码分配的内存量没有固定限制。但是,你分配的越多,你对内核的低内存进程杀手就越好看。