Проблема в том, что в процессе присутствуют два ГХ (Dalvik & Mono), и ни один из них не знает, сколько памяти использует другой.Например, все, что Mono видит для TextView
экземпляров, представляет собой действительно маленький объект (в основном IntPtr
и другие вспомогательные поля из Java.Lang.Object
):
namespace Java.Lang {
public class Object {
IntPtr handle;
// ...
}
}
namespace Android.Widget {
public class TextView : Java.Lang.Object {
// ...
}
}
То есть для большинства связанных типов, нет данных, являющихся следствием, а оболочки C # довольно крошечные.Mono не знает - и не может знать - что есть объект Java, связанный с Object.handle
, и (что более важно), сколько памяти ссылается на этот объект.
Следовательно, вам иногда нужнопомогите ему:
// https://github.com/PVoLan/TestActivityDispose/blob/master/Test/Activity2.cs
public class Activity2 {
// ...
protected override void OnDestroy ()
{
Android.Util.Log.Info("----------", "Destroy");
base.OnDestroy ();
GC.Collect ();
}
}
Добавленный вызов GC.Collect()
даст GC Mono возможность выполнить и собрать объекты мусора.После добавления этой строки, несколько раз нажав «Hello World, Click Me!»и "Back" выравнивается на 93-126 grefs (в зависимости от того, какую деятельность вы выполняете).