gpt4 book ai didi

安卓NDK : Why is this malloc() having no observable effect?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:45 25 4
gpt4 key购买 nike

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

Java:

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 代码中分配的内存量,所以这似乎是正确的方法。我这样做对吗?

最佳答案

memset() 之后,您应该会看到“私有(private)/脏”页面的增加.如果您在设备上安装了额外的开发人员命令行实用程序,您可以运行 procrankshowmap <pid>很容易看到这一点。需要 Root设备。

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

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

关于安卓NDK : Why is this malloc() having no observable effect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com