Android NDK:为什么这个malloc()没有明显的效果?
下面是我正在使用的代码的简化版本 爪哇: C: 现在,当我从MyClass.java调用malloc()时,我希望看到分配了32M内存,并且我能够在某处观察到可用内存的下降。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
然而,我在
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;
}