在Xamarin.Android应用程序中多长时间调用一次垃圾收集器?

时间:2018-03-23 13:15:07

标签: xamarin.android garbage-collection call

我有以下课程:

public class CurrentOrder
{
    //contains current order values which is global to all application
    public static List<OrderArticleViewModel> listOfOrderArticles = new List<OrderArticleViewModel>();
    public static string orderCustomerName;
    public static string orderCustomerId;
    public static string orderNumber;
    public static string orderDateAndHour;
    public static DateTime executionOrderDate = DateTime.Now.AddDays(1);

    private CurrentOrder()
    {
    }

}

我在整个应用程序中使用它的字段作为全局变量,例如:CurrentOrder.orderNumber。当我进行某些活动并按下后退按钮时,我想清除所有类字段值,我这样做:

CurrentOrder.listOfOrderArticles = new List<OrderArticleViewModel>();
CurrentOrder.orderCustomerName = null;
CurrentOrder.orderCustomerId = null;
CurrentOrder.orderNumber = null;
CurrentOrder.orderDateAndHour = null;
CurrentOrder.executionOrderDate = DateTime.Now.AddDays(1);

但据我所知,这些字段的值保留在内存中,唯一的是现在我的变量指向另一个地方。如果我单击后退按钮1000次,我将在内存中有1000次没有引用它们的字段。我听说垃圾收集器会注意破坏没有任何东西指向它们的值,但这种情况经常发生?是否可以在没有垃圾收集器清洁的情况下按下按钮100次?

1 个答案:

答案 0 :(得分:0)

垃圾收集之间没有固定的时间间隔。基于剩余可分配内存的大小调用垃圾收集器。 c#和java都是面向对象的语言,因此我们不需要像c / c ++那样手动分配和释放内存。

垃圾收集器将帮助开发人员释放内存。 Xamarin.Android正在使用c#语言,因此它需要CLR来帮助处理内存管理(Native Android based on ART and Dalvik)。

Here是调用GC时的条件:

  

当满足下列条件之一时,就会发生垃圾收集:

     

1.系统物理内存较低。这可以通过OS的低内存通知或主机指示的低内存来检测。

     

2.托管堆上已分配对象使用的内存超过可接受的阈值。在该过程运行时,该阈值会不断调整。

     

3.调用GC.Collect方法。几乎在所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行。此方法主要用于独特的情况和测试。

我认为memory churn将证明所调用的GC没有固定的间隔。

关于您的问题:

  

在没有垃圾收集器清洁的情况下按下按钮100次是否可行?

它基于您的Android系统环境(您的应用是前台还是后台?是否有足够的内存?)。但最终将是gc。

所以,关于内存问题,我认为内存泄漏和OOM(主要是由于Bitmap)应该得到更多的关注。并且应该避免内存流失,因为它会影响Android渲染(UI Performance)。