Java 在Android上,即使内存非常低,垃圾收集器也无法运行
我正在开发一款Android游戏,它使用TMX平铺地图。在加载地图时,应用程序的内存使用量会上升到100MB以上。加载每个映射后,我会提示垃圾收集器运行(使用Java 在Android上,即使内存非常低,垃圾收集器也无法运行,java,android,garbage-collection,Java,Android,Garbage Collection,我正在开发一款Android游戏,它使用TMX平铺地图。在加载地图时,应用程序的内存使用量会上升到100MB以上。加载每个映射后,我会提示垃圾收集器运行(使用System.gc()),并且毫不奇怪,使用的内存量不会减少。我知道调用System.gc()方法不能确保垃圾收集器运行,但我希望它考虑到我的设备上的最大VM堆大小约为130MB(在其他较旧的设备上低至16-20MB)。正如预期的那样,当在此之后加载另一个映射时,应用程序抛出内存不足错误并崩溃 但是,我可以确保我的代码没有内存泄漏或未释放的
System.gc()
),并且毫不奇怪,使用的内存量不会减少。我知道调用System.gc()
方法不能确保垃圾收集器运行,但我希望它考虑到我的设备上的最大VM堆大小约为130MB(在其他较旧的设备上低至16-20MB)。正如预期的那样,当在此之后加载另一个映射时,应用程序抛出内存不足错误并崩溃
但是,我可以确保我的代码没有内存泄漏或未释放的资源,因为当我使用Eclipse中的DDMS堆选项卡强制GC运行时(“原因GC”按钮),应用程序的内存使用量会下降到15-16MB左右
在加载地图时,我是否遗漏了任何可能会导致超过100MB内存使用量被保留的内容?最好看看您是如何处理图像加载的 我假设您正在使用
Bitmap
类来处理它们。你必须记住,这个类在引擎盖下有点特别。它实际上是围绕一个将位图表示为字节数组的本机实现展开的。在这种情况下,垃圾收集对您没有帮助(此外,依赖在特定时间点执行GC是一种不好的做法)。我认为您应该仔细看看Bitmap
类的recycle()
方法。它释放位图实例占用的本机对象
Javadoc声明这是一个高级调用,通常不应手动触发,因为如果不再引用位图
实例,GC将执行此操作,但根据我在Android中使用图像的经验(以及游戏开发),有时它会在此类情况下帮助您
我能给你的另一个建议是对你的应用程序堆进行大量的分析——也许地图不是唯一的罪魁祸首。我会尝试跟踪DDMS中的内存分配,并检查是否存在潜在的危险信号。非常感谢您的建议。我将在我的应用程序的其他地方查找内存泄漏,并进一步阅读Android位图实现。