所以我正在查看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?
修改
代码大致贯穿以下步骤:
答案 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)
你需要先了解一些事情。
我建议你看看像Picasso [http://square.github.io/picasso/]这样的Android图片库。它应该为你做一些工作。