Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Android 为什么在显示片段或启动活动时,应用程序分配的内存会永久增加?_Android_Android Fragments_Memory_Memory Management - Fatal编程技术网

Android 为什么在显示片段或启动活动时,应用程序分配的内存会永久增加?

Android 为什么在显示片段或启动活动时,应用程序分配的内存会永久增加?,android,android-fragments,memory,memory-management,Android,Android Fragments,Memory,Memory Management,我想问问社区对这种行为的看法 在我的主要活动中,我有一个floatingAction按钮,单击该按钮将显示一个DialogFragment 在如何正确创建DialogFragment方面,我遵循了Google的指导原则(由于我是Stack Overflow的新用户,所以无法链接它),所以我相信我在这方面没有问题。我已经在使用onCreateDialog和onCreateView的片段上测试了这种行为,在这两种情况下,结果是相同的 当我点击按钮查看内存使用情况时,我看到的是: 因此,Androi

我想问问社区对这种行为的看法

在我的主要活动中,我有一个floatingAction按钮,单击该按钮将显示一个DialogFragment

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

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

因此,Android正在分配额外的资源,以弥补显示新片段的不足。这对我来说是有道理的

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

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

对我来说,这意味着我依靠垃圾收集器来为我做工作,据我所知,这不是一个好的做法

谁能告诉我这是安卓的正常行为,还是我做错了什么?如果这不是正常的行为,我会先尝试自己解决这个问题,然后再请求社区提供进一步的帮助(这就是为什么我没有提供任何代码)

提前谢谢你。

我想这段摘录很好地总结了这种行为

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

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

这样做之后,垃圾收集器就可以决定何时采取行动了。

我认为这段摘录很好地总结了这种行为

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

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


完成后,由垃圾收集器决定何时开始工作。

谢谢您的回答。如果您不介意的话,我想和您一起验证一些逻辑:假设我的代码是正确的,那么一旦片段关闭,对片段中对象的引用就会正确地被释放。然而,由于Android使用mmapping管理内存,除非垃圾收集器成功运行,否则我们不会看到RAM中的内存下降。如果真的发生了,内存应该会急剧减少。如果在收集器清除内存时,我确实看到内存下降,那么我可以假设一切都正常工作。听起来正确吗?是的,你的逻辑听起来正确。不幸的是,我不知道足够的低级细节来深入解释发生了什么,我也不能确定你的应用程序是否正常运行。然而,根据你提供的信息,听起来一切都像预期的那样工作。谢谢你的回答。如果您不介意的话,我想和您一起验证一些逻辑:假设我的代码是正确的,那么一旦片段关闭,对片段中对象的引用就会正确地被释放。然而,由于Android使用mmapping管理内存,除非垃圾收集器成功运行,否则我们不会看到RAM中的内存下降。如果真的发生了,内存应该会急剧减少。如果在收集器清除内存时,我确实看到内存下降,那么我可以假设一切都正常工作。听起来正确吗?是的,你的逻辑听起来正确。不幸的是,我不知道足够的低级细节来深入解释发生了什么,我也不能确定你的应用程序是否正常运行。然而,从你提供的信息来看,似乎一切都在按预期进行。