本文介绍了安卓:BitmapFactory.de codeStream()出内存拥有2MB免费堆一个400KB的文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序的源代码中的以下行创下的OOM错误

 图像= BitmapFactory.de codeStream(assetManager.open(imgFilename));
 

就在导致应用程序分配要与OOM错误丧生:

 (...)
08-05 21:22:12.443:I / dalvikvm堆(2319):从25.056MB钳目标GC堆到24.000MB
08-05 21:22:12.443:D / dalvikvm(2319):GC_FOR_MALLOC释放< 1K,50%的自由2709K / 5379K,外部18296K / 19336K,暂停58ms
08-05 21:22:14.513:D / dalvikvm(2319):GC_EXTERNAL_ALLOC释放< 1K,50%的自由2709K / 5379K,外部18296K / 19336K,暂停101ms
08-05 21:22:14.903:I / dalvikvm堆(2319):从25.073MB钳目标GC堆到24.000MB
08-05 21:22:14.903:D / dalvikvm(2319):GC_FOR_MALLOC释放0K,50%的自由2709K / 5379K,外部18312K / 19336K,暂停53ms
08-05 21:22:22.843:D / DDM堆(2319):堆GC的请求
08-05 21:22:22.963:I / dalvikvm堆(2319):从25.073MB钳目标GC堆到24.000MB
08-05 21:22:22.963:D / dalvikvm(2319):主题ID = 1:仍暂停撤消后(SC = 1 DC = 1)
08-05 21:22:22.963:D / dalvikvm(2319):GC_EXPLICIT释放1K,50%的自由2710K / 5379K,外部18312K / 19336K,暂停116ms
 

DDMS报告有关堆的状态类似的画面:

 堆大小:5.254 MB
分配:2.647 MB
免费:2.607 MB
%使用:50.38%
#Objects 49028
 

单步超过此线导致的OOM错误:

  08-05 21:26:04.783:D / dalvikvm(2319):GC_EXTERNAL_ALLOC释放< 1K,50%的自由2710K / 5379K,外部18312K / 19336K,暂停57ms
08-05 21:26:05.023:E / dalvikvm堆(2319):2097152字节外部分配太大,此过程。
08-05 21:26:05.163:I / dalvikvm堆(2319):从25.073MB钳目标GC堆到24.000MB
08-05 21:26:05.163:E / GraphicsJNI(2319):虚拟机不会让我们分配2097152字节
08-05 21:26:05.163:D / dalvikvm(2319):GC_FOR_MALLOC释放0K,50%的自由2710K / 5379K,外部18312K / 19336K,暂停30毫秒
08-05 21:26:05.283:D / Skia的(2319):--​​-德codeR->德code返回false
 

  1. 按imgFileName引用的文件的大小被报告为&所述; 400K在Windows上。那么,为什么BitmapFactory.de codeStream尝试分配2MB?
  2. 为什么会出现一个OOM错误时,似乎有足够的可用空间?

此应用程序的目标是Android 2.2及了。

在此先感谢!

解决方案

请参阅本作指导上更高效地加载大量位图:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

一个400 KB的图像文件可以很容易地占用5-10 MB的RAM。

My app is hitting an OOM error at the following line in the source:

image = BitmapFactory.decodeStream(assetManager.open(imgFilename));

Just before the allocation that causes the app to be killed with an OOM error:

(...)
08-05 21:22:12.443: I/dalvikvm-heap(2319): Clamp target GC heap from 25.056MB to 24.000MB
08-05 21:22:12.443: D/dalvikvm(2319): GC_FOR_MALLOC freed <1K, 50% free 2709K/5379K, external 18296K/19336K, paused 58ms
08-05 21:22:14.513: D/dalvikvm(2319): GC_EXTERNAL_ALLOC freed <1K, 50% free 2709K/5379K, external 18296K/19336K, paused 101ms
08-05 21:22:14.903: I/dalvikvm-heap(2319): Clamp target GC heap from 25.073MB to 24.000MB
08-05 21:22:14.903: D/dalvikvm(2319): GC_FOR_MALLOC freed 0K, 50% free 2709K/5379K, external 18312K/19336K, paused 53ms
08-05 21:22:22.843: D/ddm-heap(2319): Heap GC request
08-05 21:22:22.963: I/dalvikvm-heap(2319): Clamp target GC heap from 25.073MB to 24.000MB
08-05 21:22:22.963: D/dalvikvm(2319): threadid=1: still suspended after undo (sc=1 dc=1)
08-05 21:22:22.963: D/dalvikvm(2319): GC_EXPLICIT freed 1K, 50% free 2710K/5379K, external 18312K/19336K, paused 116ms

DDMS reports a similar picture about the state of the heap:

Heap Size:  5.254 MB
Allocated:  2.647 MB
Free:   2.607 MB
%Used:  50.38%
#Objects    49,028  

Single stepping over this line results in an OOM error:

08-05 21:26:04.783: D/dalvikvm(2319): GC_EXTERNAL_ALLOC freed <1K, 50% free 2710K/5379K, external 18312K/19336K, paused 57ms
08-05 21:26:05.023: E/dalvikvm-heap(2319): 2097152-byte external allocation too large for this process.
08-05 21:26:05.163: I/dalvikvm-heap(2319): Clamp target GC heap from 25.073MB to 24.000MB
08-05 21:26:05.163: E/GraphicsJNI(2319): VM won't let us allocate 2097152 bytes
08-05 21:26:05.163: D/dalvikvm(2319): GC_FOR_MALLOC freed 0K, 50% free 2710K/5379K, external 18312K/19336K, paused 30ms
08-05 21:26:05.283: D/skia(2319): --- decoder->decode returned false
  1. The size of the file referenced by "imgFileName" is reported to be < 400K on Windows. So why does BitmapFactory.decodeStream try to allocate 2MB?
  2. Why is there an OOM error when there seems to be enough free space?

This app is targeting Android 2.2 and up.

Thanks in advance!

解决方案

Please see this for a guide on loading large Bitmaps more efficiently:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

A 400 KB image file can easily take up 5-10 MB of RAM.

这篇关于安卓:BitmapFactory.de codeStream()出内存拥有2MB免费堆一个400KB的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-11 07:16