GC报告可用内存时的Android OutOfMemory?

时间:2015-05-15 11:33:41

标签: android memory

所以我正在查看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,回调)
  2. 内部回调将数据发送到AsyncTask进行处理/保存
  3. AsyncTask将字节数组解码为Bitmap以进一步旋转
  4. 热潮!

2 个答案:

答案 0 :(得分:1)

您的位图似乎分配的可用堆大小超过了。您始终可以使用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();
} 

从imageViews中释放资源。

您还可以设置largeHeap =" true"。这实际上是强制other app to out of memory。那么你将永远不知道会增加多少堆。这取决于是否有任何应用程序被迫内存不足。

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

答案 1 :(得分:0)

你需要先了解一些事情。

  • Android需要一些时间来增加内存,有时它还不够快。见https://stackoverflow.com/a/14462026/1390015
  • 您需要将位图加载到正确的大小。这将使您的应用程序更快,并防止消耗额外的内存。
  • 您需要回收您的位图。

我建议你看看像Picasso [http://square.github.io/picasso/]这样的Android图片库。它应该为你做一些工作。