Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android上,即使内存非常低,垃圾收集器也无法运行_Java_Android_Garbage Collection - Fatal编程技术网

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

Java 在Android上,即使内存非常低,垃圾收集器也无法运行,java,android,garbage-collection,Java,Android,Garbage Collection,我正在开发一款Android游戏,它使用TMX平铺地图。在加载地图时,应用程序的内存使用量会上升到100MB以上。加载每个映射后,我会提示垃圾收集器运行(使用System.gc()),并且毫不奇怪,使用的内存量不会减少。我知道调用System.gc()方法不能确保垃圾收集器运行,但我希望它考虑到我的设备上的最大VM堆大小约为130MB(在其他较旧的设备上低至16-20MB)。正如预期的那样,当在此之后加载另一个映射时,应用程序抛出内存不足错误并崩溃 但是,我可以确保我的代码没有内存泄漏或未释放的

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

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


在加载地图时,我是否遗漏了任何可能会导致超过100MB内存使用量被保留的内容?

最好看看您是如何处理图像加载的

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

Javadoc声明这是一个高级调用,通常不应手动触发,因为如果不再引用
位图
实例,GC将执行此操作,但根据我在Android中使用图像的经验(以及游戏开发),有时它会在此类情况下帮助您


我能给你的另一个建议是对你的应用程序堆进行大量的分析——也许地图不是唯一的罪魁祸首。我会尝试跟踪DDMS中的内存分配,并检查是否存在潜在的危险信号。

非常感谢您的建议。我将在我的应用程序的其他地方查找内存泄漏,并进一步阅读Android位图实现。