gpt4 book ai didi

GC 报告可用内存时 Android OutOfMemory?

转载 作者:行者123 更新时间:2023-11-30 02:09:52 26 4
gpt4 key购买 nike

所以我正在查看 OOM 失败的日志,其中我看到以下内容:

05-15 14:18:15.801: D/dalvikvm(5425): GC_BEFORE_OOM freed 12K, 63% free 18896K/49863K, paused 43ms, total 44ms
05-15 14:18:15.801: E/dalvikvm-heap(5425): Out of memory on a 25694224-byte allocation.
05-15 14:18:15.801: I/dalvikvm(5425): "AsyncTask #4" prio=5 tid=35 RUNNABLE
05-15 14:18:15.801: I/dalvikvm(5425): | group="main" sCount=0 dsCount=0 obj=0x41f117e8 self=0x5db0f2c0
05-15 14:18:15.801: I/dalvikvm(5425): | sysTid=5539 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1544307456
05-15 14:18:15.801: I/dalvikvm(5425): | schedstat=( 0 0 0 ) utm=19 stm=2 core=0
05-15 14:18:15.801: I/dalvikvm(5425): at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
05-15 14:18:15.801: I/dalvikvm(5425): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:520)

我觉得这很奇怪。为什么当我有大约 30mb 的可用空间时,大约 25mb 的分配会出现 OOM?

编辑

代码大致经历了这些步骤:

  1. camera.takePicture(null,null,callback)
  2. 内部回调将数据发送到 AsyncTask 进行处理/保存
  3. AsyncTask 将字节数组解码为 Bitmap 以进一步旋转
  4. 砰!

最佳答案

您的位图分配的似乎超过了可用的堆大小。您始终可以使用 Eclipse MAT 或 android studio 监控您的内存使用情况。

如果位图比要求的大,我建议您缩小位图。也可以使用 options.inJustDecodeBounds = true以确保您的应用程序不会因为位图分配而从内存中启动。尝试释放您的应用未显示的资源。对于空闲内存,onPause 调用是一个好地方。如果需要,您还应该有效地使用 GC 调用。你也可以使用

Drawable drawable = imageView.getDrawable();
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
bitmap.recycle();
}

从您的 imageView 中释放资源。

您还可以设置 largeHeap="true"。这其实很给力other app to out of memory .所以你永远不知道会增加多少堆。这取决于是否有任何应用程序被迫超出内存。

您还有其他选择是创建单独的进程,以便它们将在您的应用程序中单独分配内存堆。为此你必须使用 process="your process name"在 Activity 标签内。

关于GC 报告可用内存时 Android OutOfMemory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30258478/

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