gpt4 book ai didi

java - Android 堆增长 - 我应该担心吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:26 24 4
gpt4 key购买 nike

我读过一些关于应用程序在前面时“预留”16MB 内存的内容。至少,作为一名开发人员,我应该相信这一点,尽管根据设备的不同,它可能会更多。

我支持低至 2.2 froyo,所以很多设备都不会是高端设备。我在 Logcat 中收到一些这样的消息:

03-29 14:08:51.570:I/dalvikvm-heap(19899):将堆( fragment 情况)增加到 13.624MB 以分配 200765 字节

让我担心的是 13MB。我不知道如果我的应用程序达到 16MB 是否会崩溃。我是否应该认真考虑优化一些代码?

最佳答案

Android 内存管理并不是那么简单,在内存使用方面,您应该始终保持尽可能低的水平。

每台 Android 设备的可用内存量都是有限的。在大多数情况下,它与屏幕尺寸、CPU 计算能力和其他一些相关(例如 3D 屏幕在某些情况下需要两倍的内存)。 Nexus One 有 32MB,Galaxy Nexus - 64MB,平板电脑可以有更多。可以在系统设置中更改最大堆大小。 Cyanogen Mod 允许非常容易的调整。

较旧的 Android(2.3 之前?)将此内存限制分为两部分 - 标准(普通对象、UI、字符串等)和多媒体(图像、音频缓冲区、OpenGL 内容、相机框架)。搭载 Android 2.2 的 Nexus One 有 16MB/16MB 的堆,有时它会非常烦人,因为您可以加载 16MB 的图像和 100KB 的 UI 来使显示简单图库的应用程序崩溃。

有些设备不允许您分配太大的内存块。例如,Galaxy Nexus 的限制为 31.9999MB。此外,您尝试分配的连续内存块越大,系统完成此类分配所需的时间就越多。它必须重新分配一些东西才能找到这么大的内存块。

较新的 Android 有 largeHeap 标志,它提供了大量内存。通常是平时的 5 倍左右。虽然听起来不错,但不推荐使用 largeHeap(调试除外),因为它可能会导致严重的内存使用问题。基本上,系统本身需要一些内存。如果您使用的超过应有的数量,Android 会在没有任何通知的情况下终止您的应用,从最近最少使用的应用开始。

垃圾收集器可能根据系统版本和实现有不同的策略。 Nexus One 上的 Stock Android 2.3(我猜)非常激进,以至于我们无法分配超过 13MB 的图像。看起来您有大量可用内存,然后突然“砰”的一声——您的应用已关闭。

您可以使用 native 内存。每个 Android 应用程序(或多或少)都是一个 linux 进程,它可以使用直接 malloc 调用为自己分配内存。你需要 JNI 和 C 代码,但使用它你可以访问整个内存并做任何你想做的事。再次警告,当可用内存量变得太低时,系统将终止您的应用。

您可以使用多个进程来拆分您的应用程序并在它们之间分配内存使用量。它不是那么方便,但它确实有效,一些图书馆使用它来获取比乍一看更多的资源。

除此之外,您必须记住,某些对象可能会使用比您想象的更多的内存。例如,硬件加速有点棘手。大多数设备不支持非二次幂大小的纹理。这意味着当你有一个 ImageView (300x50px) 并且启用了硬件加速时,Android 会为你的 ImageView 分配一个 512x64px 的纹理。它必须这样做,因为一切都是由 OpenGL 绘制的,并且它需要纹理。有了这样的纹理,你的 ImageView 占用的内存比没有硬件加速时多 2.5 倍。此外,如果您的 View 是动画的,Android 必须在每个动画帧中重建纹理。

总而言之 - 在内存管理方面,Android 可能很棘手。堆增长到更大的值可能并没有错,因为有时您需要更大的内存量(例如在创建画廊时)。您应该意识到,有很多不同的因素会影响您的应用程序内存使用量,并尽量保持在较低水平。

关于java - Android 堆增长 - 我应该担心吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15703952/

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