首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin内存-严格模式instances=2;limit=1

Xamarin内存-严格模式instances=2;limit=1
EN

Stack Overflow用户
提问于 2016-10-07 17:19:15
回答 1查看 722关注 0票数 0

我查了一些关于这个问题的其他帖子,但还没有找到我想要的答案。我试图在几个Xamarin Android应用程序中评估内存使用情况,并在这个问题上感到相当困惑。

为了我自己的利益,我正在使用最基本的应用程序,我可以在这个初步的测试。有两项活动。第一个活动有一个按钮来启动第二个活动。然后单击“硬件后退”按钮,然后返回到第一个活动。我会把代码发出去,但仅此而已。

我补充说:

代码语言:javascript
复制
        var builder = new StrictMode.VmPolicy.Builder();
        var policy = builder.DetectActivityLeaks().PenaltyLog().Build();
        StrictMode.SetVmPolicy(policy);

在OnCreate内部,我的两个活动都试图看到任何违规行为,或者活动是否泄漏。我观察到的是超时--我点击第二个活动的后退按钮,我得到一个控制台输出

md5774612d1059550a86887b889cb974a69.SecondActivity;instances=2;limit=1 StrictMode android.os.StrictMode$InstanceCountViolation: class md5774612d1059550a86887b889cb974a69.SecondActivity;instances=2;limit=1 StrictMode at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

这将继续增加“实例”,每次我加载下一个活动,并再次按后退按钮。我不明白为什么会存在多个实例。这仅仅是因为垃圾收集器没有花时间清理之前的活动吗?或者,即使在这个简单的应用程序中,我真的有活动的内存泄漏吗?如果我在屏幕的System.GC.Collect()中调用onResume,就不会再看到多个实例违规。很明显,我不想告诉垃圾收集器什么时候做它的工作,所以如果问题是它还没有解决它,我认为这是可以的?但是,我是否应该遵循更好的实践来确保我的活动释放所有的内存?谢谢你的建议。

以下两项活动的代码。

代码语言:javascript
复制
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Content;

namespace Test.Droid
{
[Activity (Label = "Test.Droid", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
    int count = 1;

    protected override void OnCreate (Bundle savedInstanceState)
    {
        base.OnCreate (savedInstanceState);

        var builder = new StrictMode.VmPolicy.Builder();
        var policy = builder.DetectActivityLeaks().PenaltyLog().Build();
        StrictMode.SetVmPolicy(policy);
        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button> (Resource.Id.myButton);

        button.Click += delegate {
            Intent intent = new Intent(this, typeof(SecondActivity));
            StartActivity(intent);
        };
    }

    protected override void OnResume()
    {
        base.OnResume();
        //System.GC.Collect();
    }
}
}

第二次活动

代码语言:javascript
复制
using System;
using Android.App;
using Android.Widget;
using Android.OS;
namespace Test.Droid
{
[Activity(Label = "Test.Droid")]
public class SecondActivity : Activity
{
    int count = 1;

    public SecondActivity()
    {

    }

    protected override void OnCreate(Bundle savedInstanceState)
    {

        base.OnCreate(savedInstanceState);

        var builder = new StrictMode.VmPolicy.Builder();
        var policy = builder.DetectActivityLeaks().PenaltyLog().Build();
        StrictMode.SetVmPolicy(policy);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button>(Resource.Id.myButton);

        button.Click += delegate
        {
            button.Text = string.Format("{0} clicks!", count++);
        };      }

}
}
EN

回答 1

Stack Overflow用户

发布于 2016-10-07 20:10:09

您可以在开发人员选项中设置不保留活动,以强制ART/Dalvik尽快清理活动以进行测试。

就我个人而言,我在许多地方使用GC.Collect来强制Mono (因此是ART/Dalvik)扫描内存。其中大部分是与遍历Java/C#桥的图像/位图相关的,最终得到的是两个VM中的“活”位图,从而消耗了两倍的内存.

参考文献:collection/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39922762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档