为什么在显示片段或开始活动时应用分配的内存会永久增加?

时间:2016-01-13 16:19:21

标签: android android-fragments memory memory-management

我想问一下社区他们对这种行为的看法。

在我的主要活动中,我有一个FloatingActionButton,点击后会显示DialogFragment。

我遵循了Google的指导原则(由于在Stack Overflow上成为新用户,我无法将其链接起来)如何正确创建DialogFragment,所以我相信我在那里。我已经在使用onCreateDialog和onCreateView的片段上测试了这种行为,在这两种情况下结果是相同的。

当我点击按钮并查看内存使用情况时,这就是我所看到的:

Memory when fragment is first showed

因此,Android正在分配额外资源以补偿显示新片段。这对我来说很有意义。

但是,当我关闭或取消对话框时,分配的内存不会丢失。

当我使用相同的按钮打开相同的对话框时,分配的内存再次跳转。我一遍又一遍地重复这个(红色箭头),直到我分配的内存达到不到10MB,然后(我相信)垃圾收集器(蓝色箭头)启动并清理应用程序:

Memory after multiple showings

对我而言,这意味着我依靠垃圾收集器为我工作,而且据我所知,这不是一种好的做法。

有人能告诉我这是不是正常的Android行为,还是有什么我做错了?如果这不是正常行为,我会在向社区寻求进一步帮助之前先尝试自己解决问题(这就是为什么我没有提供任何代码)。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为Flask documentation的这段摘录很好地总结了这种行为。

  

Android不为内存提供交换空间,但它确实使用分页和内存映射(mmapping)来管理内存。这意味着您修改的任何内存 - 无论是通过分配新对象还是触摸mmapped页面 - 都会驻留在RAM中并且无法进行分页。因此,从应用程序中完全释放内存的唯一方法是释放您可能持有的对象引用,使内存可用于垃圾收集器。这有一个例外:如果系统想要在其他地方使用该内存,那么任何未经修改的mmap的文件(例如代码)都可以从RAM中分页。

基本上,您作为应用程序开发人员所能做的就是释放对您分配的对象的引用。因此,假设您没有在任何地方保留对对象的引用,例如将片段放在后面的堆栈上供以后使用,则在片段关闭时应释放对象的引用。此时,垃圾收集器可以清除以前分配的内存。

在完成之后,由垃圾收集者决定何时采取行动,所以说。