在NDK中,内存分配多少才算过多?

20

NDK下载页面指出,“通常适合使用NDK的是自包含的、CPU密集型操作,这些操作不会分配过多内存,例如信号处理、物理模拟等。”

我有C语言背景,并很激动地尝试使用NDK来操作我的大多数OpenGL ES函数和任何与物理、顶点动画等相关的本地函数...... 我发现我非常依赖本地代码,并想知道我是否可能会犯一些错误。到目前为止,我在测试方面没有遇到任何问题,但我好奇以后是否会有问题。

例如,我定义了一个游戏结构体(类似于San-Angeles示例中所见)。我正在动态加载对象的顶点信息(仅需要活动游戏区域),因此顶点、法线、纹理坐标、索引和纹理图形数据等要素正在进行大量的内存分配... 只是举几个例子。我很小心地在游戏区域之间释放已分配的内存。

我是否应该限制数组大小或像现在这样勇敢地继续前进以确保安全?

1个回答

10

由于使用NDK的应用程序应该表现得与使用SDK开发的应用程序类似,因此我认为合理的堆使用指南最好来自于ActivityManager.java的注释。

/**
 * Return the approximate per-application memory class of the current
 * device.  This gives you an idea of how hard a memory limit you should
 * impose on your application to let the overall system work best.  The
 * returned value is in megabytes; the baseline Android memory class is
 * 16 (which happens to be the Java heap limit of those devices); some
 * device with more memory may return 24 or even higher numbers.
 */
public int getMemoryClass() {
    return staticGetMemoryClass();
}

/** @hide */
static public int staticGetMemoryClass() {
    // Really brain dead right now -- just take this from the configured
    // vm heap size, and assume it is in megabytes and thus ends with "m".
    String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
    return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
}

设置Dalvik VM堆大小的代码位于AndroidRuntime.cpp中,并提供了一个示例,说明如何使用property_get函数来确定本地代码的堆分配的粗略限制。

strcpy(heapsizeOptsBuf, "-Xmx");
property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");
//LOGI("Heap size: %s", heapsizeOptsBuf);
opt.optionString = heapsizeOptsBuf;
mOptions.add(opt);

16m 的默认值可能很重要,因为我拥有的两台 Android 手机都没有默认设置 dalvik.vm.heapsize 属性。


谢谢Tim。这个16MB的限制有点可怕。如果我理解正确,这是由手机制造商构建的操作系统实现的一个上限,以便每个应用程序只能访问一定量的内存?如果没有设置这个上限,那么每个应用程序可以从可用的RAM中分配尽可能多的内存(当然要合理)。你是说在你的手机上运行getMemoryClass()时返回null吗?你有哪些手机,如果我可以这样问的话...是否有任何地方可以了解到新手机的这个限制信息?(我完全错了吗?) - Maximus
8
我真的应该先搜索NDK组……来自Dianne Hackborn的话:“还有,鉴于这是NDK列表,限制实际上并没有强加给你,因为它仅限于Java堆。本地堆上的分配没有任何限制……” 她继续说,不应滥用该功能,否则应用程序可能会被终止。这是讨论主题的线程,在一般情况下很值得一读。http://groups.google.com/group/android-ndk/browse_thread/thread/95c9f0cecceb112a/ab033b9a28d52fcd?lnk=gst&q=heap+limit#ab033b9a28d52fcd - Maximus
2
@Maximus Dianne的评论非常准确地概括了这个问题。虽然使用NDK分配堆内存没有硬性限制(运行ulimit -d返回“无限制”),但是使用所有可用内存会产生后果。 - Tim Kryger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接