Я создаю приложение 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
удалить из памяти?