垃圾收集的片段在java中

时间:2014-12-12 13:59:42

标签: java android collections fragment garbage

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

所以我想测试它并制作一个片段,它使用大约5 MB的内存。 当我使用transactionmanager删除片段时,使片段无效并显式调用垃圾收集器(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支持片段的片段

2 个答案:

答案 0 :(得分:0)

  

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

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

此处的关键字是“建议”。仅仅因为你打电话给gc并不意味着Runtime必须全部听。如果您在完成使用它们时只是使引用无效,Java将为您执行清理工作。

答案 1 :(得分:0)

至少有两个原因:

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