我有一个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();
}
答案 0 :(得分:3)
虽然Xamarin剖析器仍在预览中,但它帮助我了解了我们在应用程序中遇到的内存问题。阅读你的最后评论我可以确认Xamarin Insights(v1.10.1)有一个巨大的内存签名(甚至可能泄漏)。在我们从代码中删除它之后 - 应用程序表现得非常快!
底线 - 使用分析器识别内存问题,如果您的应用中使用了Xamarin Insights,我建议将其删除,直至另行通知。