【发布时间】:2012-03-18 05:41:46
【问题描述】:
我有一个 OpenGL Android 应用程序,它使用大量内存来设置复杂的场景,这显然会导致严重的堆碎片。即使没有内存泄漏,也无法在不因碎片而耗尽内存的情况下销毁和创建应用程序。 (碎片肯定是问题,而不是泄漏)
这会导致一个重大问题,因为 Android 习惯于在同一个 VM/堆上销毁和创建 Activity,这显然会导致 Activity 崩溃。作为应对这种情况的策略,我使用了以下技术:
@Override
protected void onStop() {
super.onStop();
if(isFinishing()) {
System.runFinalizersOnExit(true);
System.exit(0);
}
}
这可确保当活动完成时,它会导致虚拟机完全关闭,因此下次启动活动时,它会获得一个新的未碎片化堆。
注意:我意识到这不是“Android 方式”,但鉴于垃圾收集器是非压缩的,因此不可能持续重用堆。
这种技术实际上确实可以正常工作,但是当 Activity 在非完成模式下被销毁然后重新创建时,它就不起作用了。
有人对如何处理堆的退化有任何好的建议吗?
进一步说明:减少内存消耗也不是一个真正的选择。该活动实际上并没有使用那么多内存,但堆(和本机堆)似乎很容易碎片化,可能是由于一些较大的内存块
【问题讨论】:
-
我遇到了同样的问题,并采用了类似的解决方案。真的很糟糕。
标签: android heap-memory fragmentation