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

2024-01-25

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

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

03-29 14:08:51.570: I/dalvikvm-heap(19899): Grow heap (frag case) to 13.624MB for 200765-byte allocation

让我担心的是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 上的原生 Android 2.3(我猜)非常激进,以至于我们无法分配超过 13MB 的图像。您可能看起来有大量可用内存,但突然间,您的应用程序崩溃了。

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 增长堆 - 我应该担心吗? 的相关文章

  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐