我正在追踪我的Xamarin Android项目中的内存使用和泄漏,并决定从一个简单的页面开始。
启动仪表板/启动活动时,我有21.790 MB的已分配内存和堆大小为26.016 MB。
当我打开帮助活动时,我只需使用OnCreate方法创建一个活动,如下所示:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.HelpActivity);
ActionBar.SetDisplayHomeAsUpEnabled(true);
_quickstartGuideLinearLayout = FindViewById<LinearLayout>(Resource.Id.quickstart_guide_layout);
_quickstartGuideLinearLayout.Click += ViewQuickstart;
_usermanualLinearLayout = FindViewById<LinearLayout>(Resource.Id.user_manual_layout);
_usermanualLinearLayout.Click += ViewUserManual;
}
然后在OnDestroy中:
protected override void OnDestroy()
{
if (_quickstartGuideLinearLayout != null)
{
_quickstartGuideLinearLayout.Click -= ViewQuickstart;
_quickstartGuideLinearLayout.Dispose();
_quickstartGuideLinearLayout = null;
}
if (_usermanualLinearLayout != null)
{
_usermanualLinearLayout.Click -= ViewUserManual;
_usermanualLinearLayout.Dispose();
_usermanualLinearLayout = null;
}
base.OnDestroy();
}
当显示帮助活动时,内存使用量将增加到22.102 MB,当我单击后退或操作栏向上按钮时,它将仅下降到22.078 MB。
如果帮助活动被破坏,为什么它不会回到21.790 MB?
答案 0 :(得分:3)
我似乎通过将Dispose()添加到我的OnDestroy()来修复它,如下所示:
protected override void OnDestroy()
{
base.OnDestroy();
Dispose();
}
修改强> 没关系,似乎这纯粹是因为我将GC.Collect()与Dispose()一起调用。删除Dispose()没有任何负面影响所以我猜我的原始问题只是基于这样一个事实:小的无关紧要的内存增加量并没有导致Mono GC运行,这本质上是应该如何运行的。
修改强> 每个Xamarin支持: 没有必要在OnDestroy()上的活动上调用Dispose。通过FindViewById找到的对象应该通过在每个上调用.Dispose()以及通过 - = MyEventHandler删除事件处理程序来处理OnDestroy;