android - 简单 Activity 的 Xamarin Android 内存泄漏

标签 android memory memory-leaks xamarin.android xamarin

我正在追踪我的 Xamarin Android 项目中的内存使用情况和泄漏情况,并决定从其中一个简单页面开始。

启动仪表板/启动 Activity 时,我有 21.790 MB 的已分配内存和 26.016 MB 的堆大小。

当我打开帮助 Activity 时,我只是使用 OnCreate 方法创建一个 Activity ,如下所示:

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();
        }

当显示帮助 Activity 时,内存使用量将上升到 22.102 MB,而当我单击返回或操作栏向上按钮时,它只会下降到 22.078 MB。

如果帮助 Activity 被销毁,为什么它不会回到 21.790 MB?

最佳答案

我似乎已经通过将 Dispose() 添加到我的 OnDestroy() 来修复它,如下所示:

protected override void OnDestroy()
        {
            base.OnDestroy();
            Dispose();
        }

编辑: 没关系,这似乎完全是因为我调用了 GC.Collect() 和 Dispose()。删除 Dispose() 没有负面影响,所以我猜我原来的问题只是基于这样一个事实,即少量无关紧要的内存增加不会导致 Mono GC 运行,这本来就是应该的样子。

编辑 根据 Xamarin 支持: 不必在 OnDestroy() 中的 Activity 上调用 Dispose。通过 FindViewById 找到的对象应该通过在每个对象上调用 .Dispose() 在 OnDestroy 中处理,并通过 -= MyEventHandler; 删除事件处理程序;

关于android - 简单 Activity 的 Xamarin Android 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23656378/

相关文章:

linux - meminfo 是对 free mem 的准确观察吗?

iphone - iOS App在启动时崩溃,没有显示任何错误

安卓内存泄漏

c - 我如何使用 free 来释放使用 malloc 进行的堆分配?

android - 带有 Android-Universal-Image-Loader 的 Monodroid

android - 将参数从按钮传递到 android :onClick method

c - 在初始化期间为指针分配字符串值时到底发生了什么?

java - 如何杀死 org.openide.util.Lookup 中的对象

android - 更新我的应用程序时 Android 完全崩溃

android - getString(int resId, Object... formatArgs) 方法中参数的样式文本