即使内存非常低,垃圾收集器也无法运行

时间:2016-04-04 12:35:11

标签: java android garbage-collection

我正在开发一款使用TMX平铺地图的Android游戏。在加载地图时,应用程序的内存使用量增加到100MB以上。加载每个映射后,我提示要运行垃圾收集器(使用System.gc()),并且毫不奇怪,使用的内存量根本不会减少。我知道调用System.gc()方法并不能确保垃圾收集器运行,但我希望它能够考虑我设备上的最大VM堆大小约为130MB(另外,其他时候,最低可达16-20MB)设备)。正如人们所料,在此之后加载另一个映射时,应用程序会抛出内存不足错误并崩溃。

但是,我可以确保我的代码没有内存泄漏或未释放的资源,因为当我使用Eclipse中的DDMS堆选项卡强制GC运行时('原因GC'按钮),应用程序的内存使用量会下降到大约15-16MB。

在加载地图时,有什么我错过的可能会导致超过100MB的内存使用量保留?

1 个答案:

答案 0 :(得分:1)

实际上看看你如何处理图像的加载会很好。

我假设您正在使用Bitmap类来处理它们。你必须记住,这个课程在引擎盖下有点特别。它实际上是围绕一个本机实现,它将位图表示为字节数组。在这种情况下,垃圾收集无法帮助您(此外,依靠在特定时间点执行GC是一种不好的做法)。我想你应该仔细看看recycle()类的Bitmap方法。它释放由位图实例占用的本机对象。

Javadoc表示它是一个高级调用,通常不应该手动触发,因为如果没有对Bitmap实例的更多引用,GC将执行此操作,但根据我在Android(也是游戏开发)中使用图像的经验,有时它会在这种情况下帮助你。

我可以给你的另一个建议是大量分析你的应用程序堆 - 也许地图不是唯一的罪魁祸首。我会尝试在DDMS中跟踪内存分配并检查那里是否存在潜在的红旗。