碎片垃圾收集
Posted
技术标签:
【中文标题】碎片垃圾收集【英文标题】:Fragments Garbage collection 【发布时间】:2014-02-23 18:49:39 【问题描述】:我在我的应用程序中使用 Fragments,我怀疑通过每次添加和删除 Fragment,删除它时是否会收集 Fragment 垃圾?
这是我的代码:
在 onCreate() 中
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(detailFragmentID, new MyDetailFragment());
fragmentTransaction.add(fragmentID, new MyListFragmentt());
fragmentTransaction.commit();
在 onRestart() 中
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
Fragment previousFragment = getSupportFragmentManager().findFragmentById(detailFragmentID);
if (previousFragment != null)
fragmentTransaction.remove(previousFragment);
fragmentTransaction.add(detailFragmentID, new MyDetailFragment());
fragmentTransaction.commitAllowingStateLoss();
在这里,当我参加一些活动并回来时,将调用 onRestart。
通过每次添加和移除fragment,fragment垃圾是否在这里收集?
[正确格式化代码]
【问题讨论】:
【参考方案1】:GC
将按自己的计划运行,除非您在某些 Object
上专门调用 finalize()
方法。因此,我认为您在删除 Fragment
时不必担心此处的 GC
。
【讨论】:
【参考方案2】:垃圾回收会在某些资源需要时自动收集对象,并收集内存中未使用的资源。
使用 remove 方法删除 Fragments
只会从堆栈中删除片段,而不是从内存中删除。您不能确定GC
是否会一次将其从内存中删除,因为我们称之为 Fragment 的 remove 方法。
所以通过每次添加和删除Fragment
,你不能说它总是从内存中删除GC
。
【讨论】:
【参考方案3】:很难知道它是否经过 GC。我认为您真正要问的是 Fragment 是否标记用于 GC(即稍后会被 GC)。
检查这一点的最简单方法是在 Fragment 的 onDestroy()
方法中放置一个断点,然后查看它是否被调用。您可以确信,如果系统“销毁”您的 Fragment,它最终会被 GC'd。
【讨论】:
最后那句话不太正确,是吗?一旦 onDestroy() 被调用,但片段的“this”仍然在某个地方引用,片段将不会被 GC'd。来源:blog.nimbledroid.com/2016/05/23/memory-leaks.html @Voy 你是绝对正确的。我会更新我的答案。以上是关于碎片垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章