碎片垃圾收集

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 你是绝对正确的。我会更新我的答案。

以上是关于碎片垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章

垃圾收集算法!

java垃圾回收Garbage Collection(垃圾收集算法)

JVM——垃圾收集算法

JVM垃圾收集器

Java垃圾收集算法

垃圾收集算法——标记-清除算法