我已经查看过有关此主题的其他帖子,但尚未找到我正在寻找的答案。我试图在几个Xamarin Android应用程序中评估内存使用情况,并让自己在这个问题上相当困惑。
为了我自己的利益,我正在使用最基本的应用程序进行初始测试。有两项活动。第一个活动有一个启动第二个活动的按钮。然后我点击硬件后退按钮,然后我回到第一个活动。我将发布代码,但这就是它的全部内容。
我已添加:
var builder = new StrictMode.VmPolicy.Builder();
var policy = builder.DetectActivityLeaks().PenaltyLog().Build();
StrictMode.SetVmPolicy(policy);
在我的两项活动的OnCreate内部尝试查看任何违规行为或活动是否泄露。我观察到的是超时我点击第二个活动的后退按钮,我得到一个控制台输出
[StrictMode] class md5774612d1059550a86887b889cb974a69.SecondActivity;实例= 2;极限= 1 [StrictMode] android.os.StrictMode $ InstanceCountViolation:class md5774612d1059550a86887b889cb974a69.SecondActivity;实例= 2;极限= 1 [StrictMode]在android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)
这将继续增加"实例"每次我加载下一个活动并再次点击后退按钮。我不明白为什么存在多个实例。是不是因为垃圾收集者没有花时间清理以前的活动?或者即使在这个简单的应用程序中,我是否真的有内存泄漏的活动?如果我在屏幕的onResume中调用System.GC.Collect(),我不再看到多个实例违规。显然我不想告诉垃圾收集器什么时候做它的工作,所以如果问题只是它还没有解决它,我认为这没关系?但是,我应该遵循哪些更好的做法来确保我的活动释放所有内存?谢谢你的任何建议。
以下两项活动的代码。
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();
}
}
}
第二项活动
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++);
}; }
}
}
答案 0 :(得分:0)
您可以在开发人员选项中设置不要保留活动,以强制ART / Dalvik尽快清理活动以进行测试。
就个人而言,我在许多地方使用GC.Collect
迫使Mono(以及ART / Dalvik)扫描内存。其中大多数都与遍历Java / C#Bridge的图像/位图相关,最终得到的是一个位于&#34; living&#34;在两个虚拟机中,因此消耗了两倍的内存......
参考:https://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/