【问题标题】:How much is too much memory allocation in NDK?NDK 内存分配过多是多少?
【发布时间】:2011-03-03 15:13:10
【问题描述】:

NDK 下载页面指出,“NDK 的典型候选对象是独立的、CPU 密集型操作,不会分配太多内存,例如信号处理、物理模拟等。”

我来自 C 背景,很高兴尝试使用 NDK 来操作我的大部分 OpenGL ES 函数以及与物理、顶点动画等相关的任何本机函数......我发现我是相当依赖本机代码并想知道我是否会犯一些错误。目前我在测试方面没有遇到任何问题,但我很好奇我将来是否会遇到问题。

例如,我定义了游戏结构(有点像在 San-Angeles 示例中看到的)。我正在动态加载对象的顶点信息(正是活动游戏区域所需要的),因此顶点、法线、纹理坐标、索引和纹理图形数据发生了相当多的内存分配......只是命名要领.我在释放游戏区域之间分配的内容时非常小心。

我会更安全地设置数组大小的上限,还是应该像现在这样勇敢地向前冲?

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    由于使用 NDK 的应用程序的行为应该与使用 SDK 开发的应用程序类似,我认为合理堆使用的最佳指导来自 ActivityManager.java 的 cmets。

    /**
     * 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 属性。

    【讨论】:

    • 谢谢蒂姆。保持在 16MB 以下有点吓人。如果我理解这一点,这是一个可以由操作系统的手机制造商构建的上限,以便每个应用程序只能访问一定数量的内存?如果未设置该上限,那么每个应用程序是否可以根据需要从可用 RAM 中分配尽可能多的内存(当然是在合理范围内)?您是说在手机上运行 getMemoryClass() 时它们返回 null 吗?你有哪些手机,如果我可以这么大胆地问......有没有任何地方可能有关于新手机限制的信息? (我完全脱离基地了吗?)
    • 我真的应该先搜索 NDK 组...来自 Dianne Hackborn。 “另外考虑到这是 NDK 列表,限制实际上并没有强加给你,因为它只在 Java 堆上。本机堆中的分配没有限制......”她确实继续说不应该被滥用,如果是这样,应用程序可能会被杀死。这是线程,一般来说,这是一个很好的主题阅读。 groups.google.com/group/android-ndk/browse_thread/thread/…
    • @Maximus Dianne 的 cmets 总结得非常好。虽然对于可以使用 NDK 分配多少堆没有硬性限制(运行 ulimit -d 返回 unlimited),但使用所有可用内存是有后果的。
    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 2019-11-24
    • 2014-03-02
    • 2020-03-12
    • 2012-02-12
    • 2011-01-03
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多