尽管有可用内存,但出现 OutOfMemory 错误

2023-12-20

我看到一个很奇怪的问题。本质上,有时即使有大量内存,大位图内存分配也会失败。有很多帖子似乎都在问类似的问题,但它们都与前蜂窝 Android 有关。我的理解是图像现在分配在堆上,而不是一些外部内存。无论如何,请查看下面的日志:

    10-14 13:43:53.020: INFO/dalvikvm-heap(31533): Grow heap (frag case) to 40.637MB for 942134-byte allocation
    10-14 13:43:53.070: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed 126K, 11% free 41399K/46343K, paused 31ms
    10-14 13:43:53.130: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed 920K, 13% free 40478K/46343K, paused 30ms
    10-14 13:43:53.180: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed 1026K, 13% free 40479K/46343K, paused 30ms
    10-14 13:43:53.250: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed 931K, 12% free 41193K/46343K, paused 31ms
    10-14 13:43:53.250: INFO/dalvikvm-heap(31533): Grow heap (frag case) to 41.313MB for 1048592-byte allocation
    10-14 13:43:53.280: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed <1K, 11% free 42217K/47431K, paused 31ms
    10-14 13:44:01.520: DEBUG/dalvikvm(31533): GC_CONCURRENT freed 3493K, 15% free 40646K/47431K, paused 3ms+9ms
    10-14 13:44:08.130: DEBUG/dalvikvm(31533): GC_EXPLICIT freed 16461K, 47% free 25527K/47431K, paused 3ms+6ms
    10-14 13:44:09.150: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed 1007K, 45% free 26191K/47431K, paused 35ms
    10-14 13:44:09.160: INFO/dalvikvm-heap(31533): Grow heap (frag case) to 29.334MB for 3850256-byte allocation
    10-14 13:44:09.200: DEBUG/dalvikvm(31533): GC_CONCURRENT freed 0K, 37% free 29951K/47431K, paused 2ms+4ms
    10-14 13:44:11.970: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed 1878K, 38% free 29784K/47431K, paused 37ms
    10-14 13:44:12.410: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed 62K, 36% free 30441K/47431K, paused 32ms
    10-14 13:44:12.440: DEBUG/dalvikvm(31533): GC_FOR_ALLOC freed <1K, 32% free 32325K/47431K, paused 32ms
    10-14 13:44:12.440: INFO/dalvikvm-heap(31533): Forcing collection of SoftReferences for 3850256-byte allocation
    10-14 13:44:12.480: DEBUG/dalvikvm(31533): GC_BEFORE_OOM freed 124K, 33% free 32200K/47431K, paused 37ms
    10-14 13:44:12.480: ERROR/dalvikvm-heap(31533): Out of memory on a 3850256-byte allocation.

我很抱歉包含这么多日志记录,我希望它是相关的。我的理解是系统不断地重新调整堆大小,直到最终达到堆最大值。然后,我们请求一个特别大的分配,但失败了。显然有足够的可用内存(大约 15 兆)。这是否意味着堆内部存在碎片并且没有足够大的连续内存段来处理我们的分配?如果是这样的话我该怎么办?如果不是这样,那又怎样呢?

提前致谢。


奇怪的行为是因为位图是在本机堆上分配的,而不是在垃圾收集堆上分配的,但 android 只能跟踪垃圾收集堆上的对象。从 Android 2.2(或可能是 2.3)开始,这种情况发生了变化,如果您进行堆转储,分配的位图也可见。

回到问题,您的问题很可能是您手动加载的位图没有正确释放。一个典型的问题是某些回调仍然设置或者视图仍然引用位图。 另一个常见问题是,如果您手动加载大位图(不是作为资源),当您不再需要它们时,您将需要对它们调用 recycle() ,这将从本机内存中释放位图,因此垃圾收集器将能够正常工作。 (GC只看到GC堆上的对象,并不知​​道要释放哪个对象来从本机堆中释放内存,实际上根本不关心它。)

我手边一直有这个小宝贝:

public static void stripImageView(ImageView view) {
    if ( view.getDrawable() instanceof BitmapDrawable ) {
        ((BitmapDrawable)view.getDrawable()).getBitmap().recycle();
    }
    view.getDrawable().setCallback(null);
    view.setImageDrawable(null);
    view.getResources().flushLayoutCache();
    view.destroyDrawingCache();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管有可用内存,但出现 OutOfMemory 错误 的相关文章

随机推荐

  • 在 Area2D 中覆盖 KinematicBody2D 运动?

    I m trying to create a windy area within which the player would be pushed continuously to the left lt 到目前为止 这就是我想出的Windy
  • 将 Oracle 的时间戳转换为纪元中的秒数

    我在 Oracle 数据库的表中存储了一个时间戳 例如 01 03 12 16 13 33 000000000 我想将其转换为自 Unix Epoch 以来的秒数以在查询中返回 最简单的方法是什么 编辑 哦 我需要时间戳精度 不能依赖这里的
  • Swift:创建 UIImage 数组

    使用 Swift 我尝试为简单的动画创建 UIImage 对象数组 上下文帮助animationImages内容为 数组必须包含 UI Image 对象 我尝试按如下方式创建所述数组 但似乎无法获得正确的语法 var logoImages
  • 如何将 CSS 样式应用到元素?

    我是 CSS 新手 不是程序员 我了解什么是类 也了解什么是 div 但我似乎找不到的是如何在特定元素 例如我网站的 div 上设置样式 在你的 HTML 中 div class myClass Look at me div 在你的 CSS
  • 通过蓝牙将 OBDSim 连接到 Windows 上的 Torque

    我正在尝试在 Win7 上安装 OBDSim 但遇到了一些麻烦 我的最终目标是将 OBDSim 作为蓝牙 ELM327 OBDII 模拟器运行 并使用 Android 设备上的 Torque 应用程序连接到它 我在 youtube 上观看了
  • 如何调试从玉石打印对象

    如何调试从玉石打印对象 例如console log 在 JavaScript 中 您可以使用以下命令进行调试console log from jade像这样 div console log the object you want to lo
  • 如何在 Dart 中对末尾为空对象的 List 进行排序

    开始着手 Flutter 进行一个研究项目 我想知道如何对文件列表进行排序 事实上 我的程序有一个包含 4 个文件的列表 初始化如下 List
  • Python VLC - 获取位置轮询率解决方法

    我使用 Python VLC 在 pyqt 中构建自定义播放应用程序 我画了一个漂亮的自定义滑块来跟踪视频 但遇到了一些恼人的问题 无论我多久告诉我的滑块更新一次 它都会出现故障 每 1 4 秒左右跳跃一次 并且看起来不稳定 只是时间线 而
  • SVG textPath 上的希伯来语文本仅在 Safari 中反转

    将希伯来语文本放在 SVG textPath 上时 仅在 Safari 中会反转 macOS ventura 13 2 Safari 16 3 在 Firefox 和 Chrome 中都可以 不在路径上的文本总是可以的 此外 我可以使用 b
  • 防止使用 HTML 锚点播放 MP3 文件

    如何下载 MP3 链接而不是 在浏览器中 播放 我尝试将目标更改为空白 但这只是在新窗口中打开了播放器 您无法通过修改链接来做到这一点 您必须让提供该文件的 HTTP 服务器发送一个Content Type 应用程序 八位字节流 据推测 它
  • 将所有列中的值替换为该列的值

    如何用该列的编号替换所有列中的所有 1 我已经可以逐列执行此操作 输出 输出 3 1 3 3 输出 输出 4 1 4 4 输出 输出 5 1 5 5 etc 但我觉得自己像个傻瓜一样为每一个专栏写下这些内容 应该有一种方法可以同时完成所有这
  • 使用 IN 从 sqlite 数据库中删除

    我正在使用这样的记录 ID 从 sqlite 数据库中删除 这dirID是一个 ID 数组 Dim i As Integer 0 Dim conn As New SQLiteConnection Data Source DBPath Dim
  • Hadoop字数统计:接收以字母“c”开头的单词总数

    这是 Hadoop 字数统计 java map 和 reduce 源代码 在地图函数中 我已经可以输出所有以字母 c 开头的单词以及该单词出现的总次数 但我想做的只是输出总数以字母 c 开头的单词 但我在获取总数方面有点困难 任何帮助将不胜
  • 在 Clojure 中捕获系统/输出

    我正在使用一个将文本输出到控制台的 Java 包 我需要捕获字符串中的文本 但我不知道如何执行此操作 从查看 Clojure 文档看来 我所要做的就是将 java 调用包装在with out str但这对我不起作用 最小代码示例 如果我尝试
  • 写入没有段寄存器的地址

    我知道这段代码实际上会将数据写入 ds 100h mov 100h ax 但我怎样才能写入线性地址100H直接不使用任何段寄存器作为段基址 没有办法绕过段寄存器 每个内存访问都与某个段寄存器相关 如果要写入绝对地址 请首先向段寄存器加载适当
  • 多个 apache 根进程

    今天我注意到 当从我们的网络服务器发出请求时 速度相当慢 我开始研究它 发现了大量 root 拥有的 apache 进程 我不确定这实际上是导致事情变慢的原因 但无论如何 它看起来并不好 问题是 我不知道从这里做什么 如何找出为什么有这么多
  • WinRT 能够运行 Win 7 和 8 桌面应用程序吗?

    我读到了很多关于它的不同意见 但 WinRT 是像 Win 7 和 8 一样的实际桌面操作系统吗 您能够运行功能齐全的桌面应用程序和游戏吗 WinRT 不是桌面或操作系统 而是一个 API 就像传统的winapi一样 它与 winapi 有
  • 记录编译源代码的时间

    我有一个源文件 当我编译代码时 我希望可执行文件能够记住它的构建时间 我想知道是否可能 例如 int main time t t Time when this line is compiled print out value of t in
  • 使用 Jar 转换类,合并调试重复条目

    这是重复类的屏幕截图 https i stack imgur com ET0hk png当我开始集成 Digits 时 每次在 Marshmallow 之前的设备上构建应用程序时 我都必须在升级后升级 Crashlytics 我遇到了构建错
  • 尽管有可用内存,但出现 OutOfMemory 错误

    我看到一个很奇怪的问题 本质上 有时即使有大量内存 大位图内存分配也会失败 有很多帖子似乎都在问类似的问题 但它们都与前蜂窝 Android 有关 我的理解是图像现在分配在堆上 而不是一些外部内存 无论如何 请查看下面的日志 10 14 1