这可能是一个愚蠢的问题,但我对垃圾收集知之甚少。 当我查找有关它的信息时,很明显无效的对象设置了它 引用计数为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支持片段的片段
答案 0 :(得分:0)
调用gc方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。
http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc%28%29
此处的关键字是“建议”。仅仅因为你打电话给gc
并不意味着Runtime必须全部听。如果您在完成使用它们时只是使引用无效,Java将为您执行清理工作。
答案 1 :(得分:0)
至少有两个原因:
Fragment
是一个托管对象!您无法知道是否已删除所有容器的引用。在它们全部消失之前,GC不会收集该对象。