没有OutOfMemoryError,但无法加载图片

时间:2014-03-06 08:40:51

标签: android memory-management memory-leaks

我的游戏中有一个奇怪的(令人沮丧的)问题。

游戏本身是用画布绘制的,所以我没有使用布局和其他原生元素。只有一个画布的根布局。我已经实施了AdMob和Analytics,但它已被禁用(而不是分配)用于测试。

在几个级别后,我无法加载一些图像。 LogCat只输出imageref_ashmem create failed <(null)> *number of bytes*,但不输出OutOfMemoryError

我尝试过Memory Analyzer Tool(MAT),但没有运气。第一级后的保留大小(最大)为10.6 MB,停止加载图像之前的一级是10.7 MB(有时更少)。这种情况在仿真器和实际设备中是相同的(具有不同的值)。 在第一级和最后一级拍摄的HPROF文件的比较显示非常小的差异(~2kB)。

DDMS堆中的相同内容。当事情失败时,我有70.30%的已用内存。垃圾收集器也显示27%的可用内存。这是LogCat中的输出:

GC_CONCURRENT freed 193K, 42% free 6680K/11363K, paused 2ms+2ms
D/dalvikvm(16011): GC_CONCURRENT freed 118K, 27% free 8396K/11363K, paused 2ms+2ms
D/skia(16011): ------- imageref_ashmem create failed <(null)> 143360
D/skia(16011): ------- imageref_ashmem create failed <(null)> 1155072
D/skia(16011): ------- imageref_ashmem create failed <(null)> 450560
D/skia(16011): ------- imageref_ashmem create failed <(null)> 143360
D/skia(16011): ------- imageref_ashmem create failed <(null)> 36864
D/skia(16011): ------- imageref_ashmem create failed <(null)> 40960

另一个奇怪的事情是,当我将Debug.getNativeHeapAllocatedSize()输出到控制台时,水平之后它总是更大(~0.7 MB增量)。但MAT没有显示出内存使用量的任何增长。这种行为发生在2个不同的真实设备上。

我认为我的内存泄漏很大。但MAT没有显示出任何增长,并且OutOfMemoryError没有抛出。 所以我不知道在哪里查看泄漏/分配等。

修改

也许我没有正确使用MAT,所以如果有人感兴趣,这里有2个hprof文件。一个是在记忆问题之前的第一个运行和第二个级别。

link to zip file

仅为了安全

  

MD5 8f4ef3eeb28c1d129ac0c0ef01cc8583
  SHA-1 0afc1cc06527225ad3029ef2bb4ebc5fe12d02a2

1 个答案:

答案 0 :(得分:0)

Android调整可绘制文件夹中的图像以适应不同的分辨率。这个调整大小会搞乱你的图像加载。

要解决此问题,我建议您将图像(导致问题)复制到所有文件夹drawable-ldpi,mdpi,hdpi,xhdpi,xxhdpi并运行测试。它应该工作。

副作用

否定:更大的APK尺寸

肯定:图片加载速度更快,内存使用量更少。再次运行上面的DDMS堆,您会注意到内存使用量的显着下降。