【问题标题】:Garbage collection of a fragment in javajava中片段的垃圾收集
【发布时间】:2015-02-11 06:15:10
【问题描述】:

这可能是一个愚蠢的问题,但我对垃圾收集知之甚少。 当我查找有关它的信息时,很明显,使对象无效会设置它 引用计数为 0,因此它可以进行垃圾回收

所以我想对其进行测试并制作了一个片段,它使用了大约 5 MB 的内存。 当我使用事务管理器删除片段,使片段无效并显式调用垃圾收集器(GC.collect())时,分配的内存保持不变,我没有得到 5 MB 回来..

这可能是什么原因?

public void Unselect()
    {
        var ft = this.SupportFragmentManager.BeginTransaction ();

        switch (selected)
        {

        case 8:...
        case 9:
            //FindViewById (Resource.Id.fragment_container).SetBackgroundDrawable (null);
            ft.Hide (carFragment);
            ft.Remove (carFragment);
            Console.WriteLine ("NULLIFY");
            carFragment = null;
            break;
        case 10:...
        }

        ft.Commit ();

carFragment 是一个片段,其中包含 Google Maps V2 支持片段

【问题讨论】:

  • nullifying an object sets it's reference count to 0。不,它会减少计数器,因为该引用不再存在,但可能有其他引用保留该对象。在您的记忆中还有对象中使用的类,它们是延迟加载的,不会从内存中删除。您可能正在查看内存泄漏
  • 在此处添加一些代码来演示该问题。垃圾收集的细节很重要。

标签: java android collections fragment garbage


【解决方案1】:

调用 gc 方法表明 Java 虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc%28%29

这里的关键字是“建议”。仅仅因为你打电话给gc 并不意味着运行时必须听。如果您在使用完引用后将其无效,Java 将为您完成清理工作。

【讨论】:

    【解决方案2】:

    至少有两个原因:

    1. 您可以使用 System.gc() 建议垃圾收集。这不会强制 gc,它只是建议它。事实证明,在 Android VM 中,它通常会导致 gc
    2. 更重要的是,Fragment 是一个托管对象!您无法知道是否已删除所有容器的引用。在它们全部消失之前,GC 不会收集对象。

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 2010-12-13
      • 2011-02-25
      • 1970-01-01
      • 2011-11-07
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多