Android 没有OutOfMemoryError,但无法加载图像

Android 没有OutOfMemoryError,但无法加载图像,android,memory-management,memory-leaks,Android,Memory Management,Memory Leaks,我在比赛中遇到了一个奇怪的(令人沮丧的)问题 游戏本身是在画布上绘制的,所以我没有使用布局和其他本地元素。画布只有一个根布局。我已经实现了AdMob和Analytics,但是它被禁用(并且没有分配)用于测试 几级之后,我无法加载一些图像。LogCat刚刚输出了imageref\u ashmem创建失败*字节数*,但没有OutOfMemoryError 我尝试了内存分析器工具(MAT),但没有成功。第一级之后的保留大小(最大)为10.6 MB,停止加载图像之前的一级为10.7 MB(有时更小)。在

我在比赛中遇到了一个奇怪的(令人沮丧的)问题

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

几级之后,我无法加载一些图像。LogCat刚刚输出了
imageref\u ashmem创建失败*字节数*
,但没有
OutOfMemoryError

我尝试了内存分析器工具(MAT),但没有成功。第一级之后的保留大小(最大)为10.6 MB,停止加载图像之前的一级为10.7 MB(有时更小)。在emulator和真实设备中,这种情况是相同的(具有不同的值)。 将第一级和最后一级的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
GC_并发释放193K,42%释放6680K/11363K,暂停2ms+2ms
D/dalvikvm(16011):GC_并发释放118K,27%释放8396K/11363K,暂停2ms+2ms
D/skia(16011):------imageref_ashmem创建失败143360
D/skia(16011):------imageref_ashmem创建失败1155072
D/skia(16011):------imageref_ashmem创建失败450560
D/skia(16011):------imageref_ashmem创建失败143360
D/skia(16011):------imageref_ashmem创建失败36864
D/skia(16011):------imageref_ashmem创建失败40960
另一件奇怪的事情是,当我将
Debug.getNativeHeapLocatedSize()
输出到控制台时,在级别之后,它总是更大(~0.7 MB增量)。但MAT在内存使用方面没有任何增长。这种行为发生在两个不同的真实设备上

我想我有一个相当大的内存泄漏。但MAT并没有显示出任何增长,OutOfMemoryError也并没有抛出。 因此,我不知道从何处查找泄漏/分配等信息

编辑:

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



只是为了安全

MD5 8f4ef3eeb28c1d129ac0c0ef01cc8583
SHA-1 0AFC1CC06527225AD3029EF2BB4B5EBC5FE12D02A2


Android可以调整drawable文件夹中图像的大小,以在不同分辨率下工作。这种调整大小的方法会扰乱你的图像加载

为了解决这个问题,我建议您将图像(导致问题的图像)复制到所有可绘制的ldpi、mdpi、hdpi、xhdpi、xxhdpi文件夹中,然后运行测试。它应该会起作用

副作用

负数:APK大小更大


正面:图像加载速度更快,占用内存更少。再次运行上面的DDMS堆,您会发现内存使用率显著下降。

谢谢您的回答!所有游戏图形都在资源文件夹中。可绘图文件夹中只有6个较大的图像。我支持mdpi、hdpi、xhdpi、xxhdpi,所以我认为系统没有调整它们的大小。我无法理解您的问题。