我的活动会保留一定数量的引用,以便在Map对象中预览来自相机的图像。这需要大量的内存。我正在使用以下方法监控内存使用情况:
Runtime runtime = Runtime.getRuntime();
long allocated = runtime.totalMemory();
long free = runtime.freeMemory();
long used = allocated - free;
当我杀死我的应用程序(后退键)时,活动被销毁。当我再次启动我的应用程序时,我可以看到内存未被清除。 “used”图从相同的值开始,然后随着新帧的到达而上升。
当我在“转储HPROF”之后查看“dominator_tree”时,我可以看到我活动的两个实例,都占用了大量内存。
当我覆盖onDestroy()并清除()预览帧映射对象时,这似乎不会发生。
我可能在这里遗漏了一些东西,但我认为在我的活动被销毁之后(垃圾收集过程之后)应该释放所有内存,为什么我必须手动清除()地图?我创建的其他对象似乎并不需要这个。
我尝试设置android:launchMode =“singleInstance”,但这似乎没有任何影响。
谢谢!
答案 0 :(得分:5)
为了理解正在发生的事情,在统治者树中,在您的活动上单击右键,查找PATH到GC ROOT并选择排除弱/软/幻像引用的选项。这会让你知道系统为什么不能破坏你的活动(如果你正在泄漏某些东西或其他什么)
答案 1 :(得分:1)
垃圾收集器将在运行时选择的不确定时间根据需要运行。当您的应用程序存在时,GC可能会也可能不会运行
但是,如果运行GC后对象仍然留在内存中,则表示您正在泄漏内存。您可以在调试时检查logcat中的日志以查看它何时运行。
有关如何检测和修复泄漏的好教程,请查看Google的Android Memory Management Video。