我有一个OutOfMemory异常,画廊超过600x800像素JPEG.
环境
我一直在使用带有大约600x800像素的JPG图像的Gallery.
由于我的内容可能比图像更复杂,我将每个视图设置为一个RelativeLayout,它将JPView包装在ImageView中.
为了"加速"用户体验,我有一个4个插槽的简单缓存,预取(在一个looper中)左边有1个图像,1个图像右边显示图像并将它们保存在4槽HashMap中.
该平台
我使用的是256 RAM和128堆大小的AVD,屏幕为600x800.它也发生在Entourage Edge目标上,除了使用设备它更难调试.
问题
我一直在例外:
OutofMemoryError: bitmap size exceeds VM budget
Run Code Online (Sandbox Code Playgroud)
并且它在获取第五个图像时发生.我试图改变我的图像缓存的大小,它仍然是相同的.
奇怪的是:应该没有内存问题
为了确保堆限制远离我的需要,我在开始时定义了一个虚拟的8MB数组,并将其保留为未引用,以便立即调度.它是活动线程的成员,定义如下
static { @SuppressWarnings("unused")
byte dummy[] = new byte[ 8*1024*1024 ]; }
Run Code Online (Sandbox Code Playgroud)
结果是堆大小接近11MB并且它们都是免费的. 注意我在它开始崩溃后添加了这个技巧.它使OutOfMemory不那么频繁.
现在,我正在使用DDMS.在崩溃之前(崩溃后变化不大),DDMS显示:
ID Heap Size Allocated Free %Used #Objects
1 11.195 MB 2.428 MB 8.767 MB 21.69% 47,156
Run Code Online (Sandbox Code Playgroud)
并在详细信息表中显示:
Type Count Total Size Smallest Largest Median Average
free 1,536 8.739MB 16B 7.750MB 24B 5.825KB
Run Code Online (Sandbox Code Playgroud)
最大的块是7.7MB.然而LogCat说:
ERROR/dalvikvm-heap(1923): 925200-byte external allocation too large for this process.
Run Code Online (Sandbox Code Playgroud)
如果你介意中位数和平均值之间的关系,可以假设大多数可用的块非常小.但是,有一个块足够大的位图,它是7.7M.怎么还不够呢?
注意:我记录了一个堆跟踪.在查看分配的数据量时,感觉不会超过2M.它确实与DDMS的可用内存报告相匹配. …