Xamarin Android Действия / фрагменты не собираются сборщиком мусора - PullRequest
0 голосов
/ 10 июля 2020

Я создаю приложение Xamarin Android. Это приложение, похоже, потребляет больше памяти, чем обычные java / kotlin. Я так понимаю, что часть памяти используется самой Xamarin framework. Я провел несколько тестов, чтобы проверить, собираются ли объекты сборщиком мусора.

Чтобы проверить это, я добавил деструкторы к различным объектам ~MyClass(){ }, поставил точки останова, и я смог увидеть C# объектов, заявленных G C. В Fragment / Activities деструкторы не вызывались даже после OnDestroy(). Самый простой пример, демонстрирующий это, - это SplashActivity, который просто запускает MainActivity моего приложения.

  [Activity(Label = "@string/app_name", MainLauncher = true, LaunchMode = Android.Content.PM.LaunchMode.SingleTop, ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait, Theme = "@style/SplashTheme")]
  public class SplashActivity : AppCompatActivity
  {
    MyCSharpClass myObject; // this is not garbage collected
 
    protected override void OnCreate(Bundle bundle)
    {
        myObject = new MyCSharpClass();
     
        base.OnCreate(bundle);
        var intent = new Intent(this, typeof(MainActivity));
        StartActivity(intent);
        Finish();
    }
   
    protected override void OnDestroy() //this is called
    {
        base.OnDestroy();
    }

    ~SplashActivity() // this is not called
    {

    }
}

OnDestroy вызывается немедленно, но деструктор ~SplashActivity() никогда не вызывается. Таким образом, фрагмент / действие и его чистые C# свойства / поля, похоже, остаются в памяти. Я знаю, что это типы Java.Lang.Object, но я ожидал бы, что Android и C# Сборщики мусора будут работать вместе, чтобы очистить объекты.

Как правильно сделать SplashActivity и myObject удалить из памяти?

...