Xamarin android内存消耗在使用达到一定阈值后无限增长

时间:2014-12-31 14:42:05

标签: android memory xamarin

我有一个Xamarin android应用程序,似乎当应用程序的内存使用量达到某个阈值140mb到160mb时,应用程序将迅速开始占用更多内存,就像在无限循环中一样。我可以在调试器输出中看到垃圾收集器不断尝试释放内存,但它似乎不起作用。内存使用率似乎无限制地增长。在我决定杀死应用程序之前,我看到它已经超过500mb的内存。我永远不会得到一个内存异常,这真的很奇怪。从我可以看出,没有特定的代码片段,这可能发生在我可以在各种屏幕上,同样的事情会发生。我已经在多个设备上进行了测试,因此我知道它不仅仅是我设备的问题。我试图展示一些代码,但我没有任何罪魁祸首。

我的应用程序中使用的可能导致问题的组件包括ReshSharp客户端,.net Webclients,使用位图,带有3个选项卡的TabHost,位置管理器以及通过摄像头拍摄照片。我对这一点感到困惑,非常感谢任何帮助。

编辑: 我可能已经缩小了其中一个问题的范围。我在一个tabhost里面有一个摄像机活动来拍照,我有一个照片拍摄方法,在拍摄照片后调用,拍完几张照片后问题就出现了。这是方法

    public void OnPictureTaken(byte[] data, global::Android.Hardware.Camera c)
    {
        GC.Collect();
        Bitmap b = BitmapExtensions.DecodeBitmapFromArray(data, WIDTH, HEIGHT);

        Matrix matrix = new Matrix();
        matrix.SetRotate(RotationDegrees, WIDTH / 2f, HEIGHT / 2f);

        var bitmapScalled = Bitmap.CreateBitmap(b, 0, 0, WIDTH, HEIGHT, matrix, true);

        var d = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/MyApp/";
        if (!Directory.Exists(d))
            Directory.CreateDirectory(d);

        file = d + Guid.NewGuid().ToString() + ".jpg";

        System.IO.StreamWriter sw = new System.IO.StreamWriter(file);
        bitmapScalled.Compress(Bitmap.CompressFormat.Jpeg, 70, sw.BaseStream);
        sw.Close();

        global::Android.Locations.Location location = CameraLocationManager.GetLastKnownLocation(CameraLocationManager.GetBestProvider(new Criteria() { Accuracy = Accuracy.Fine }, true));

        Intent intent = new Intent(this, typeof(EditPhotoActivity));
        intent.PutExtra("LastKnownLocation", JsonConvert.SerializeObject(LastKnownLocation));
        intent.PutExtra("Filename", file);
        //StartActivity(intent);
        StartCamera(); // restart camera preview
        b.Recycle();
        b = null;
        sw.Dispose();
        bitmapScalled.Dispose();
        bitmapScalled = null;
        // clean up
        GC.Collect();
    }

1 个答案:

答案 0 :(得分:3)

虽然Xamarin剖析器仍在预览中,但它帮助我了解了我们在应用程序中遇到的内存问题。阅读你的最后评论我可以确认Xamarin Insights(v1.10.1)有一个巨大的内存签名(甚至可能泄漏)。在我们从代码中删除它之后 - 应用程序表现得非常快!

底线 - 使用分析器识别内存问题,如果您的应用中使用了Xamarin Insights,我建议将其删除,直至另行通知。