2014-12-31 3 views
4

저는 Xamarin android 응용 프로그램이 있으며 응용 프로그램의 메모리 사용량이 특정 임계 값 140MB를 초과 할 때 응용 프로그램이 더 많은 메모리를 차지할 것처럼 보입니다. 무한 루프에 있다면. 디버거 출력에서 ​​가비지 수집기가 반복적으로 메모리를 확보하려고 시도하지만 계속 작동하지 않는 것을 볼 수 있습니다. 메모리 사용량은 겉보기에 제한없이 증가 할 것입니다. 나는 그것이 앱을 죽이기로 결정하기 전에 그것이 메모리의 500mb 이상으로 잘 일어나는 것을 지켜 보았다. 나는 결코 정말로 이상한 메모리 예외를 벗어나지 않는다. 내가 말할 수있는 것에서는 특정 화면에 코드가 없기 때문에 다양한 화면에 나타날 수 있으며 같은 일이 발생합니다. 여러 장치에서 테스트를 마쳤으므로 장치에 문제가있는 것은 아닙니다. 몇 가지 코드를 보여 주려고했지만 범인이 없습니다.Xamarin 안드로이드 메모리 사용량이 특정 임계 값을 초과하면 무한히 증가합니다.

ReshSharp 클라이언트, .net 웹 클라이언트, 비트 맵 사용, 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

'StreamWriter'를'using' 문에 넣고'Dispose','Recycle' 및'Collect' 호출을 모두 제거하려고합니다. 내가 아는 한 프레임 워크까지 정리를 남겨 두는 것이 좋습니다. 그게 효과가 있을지 모르는 시도해라. 또한 문제가되는 영역을 별도의 프로젝트에서 분리하여 메모리 문제가 실제로 발생하는지 확인합니다. –

+0

조언 해 주셔서 감사합니다. 나는 결국 Xamarin.Insights가 문제를 일으키는 것을 알게되었다. 나는 별도의 프로젝트를 만들었고 사진 촬영 프로세스를 완료하기위한 모든 필수적인 코드를 제거했습니다. 문제가 발생하지 않았습니다. Xamarin Insights에 대한 모든 언급을 완전히 제거한 후에는 문제가 사라졌습니다. 이 글을 올렸을 때 Xamarin Insights는 미리보기 상태이며 완전히 안정적이지는 않습니다. 바라건대 그들이 가지고있는 문제는 릴리즈에서 수정 될 것입니다. – rusty8521

답변

3

Xamarin 프로파일 러는 여전히 미리보기에 있지만 응용 프로그램에서 발생한 메모리 문제를 추적하는 데 많은 도움이되었습니다. 마지막 코멘트를 읽으면 Xamarin Insights (v1.10.1)에 엄청난 메모리 서명이 있다는 것을 알 수 있습니다. 코드에서 제거한 후 앱이 빠르게 작동했습니다!

결론 - 프로파일 러를 사용하여 메모리 문제를 확인하고 앱에 Xamarin Insights가 사용 된 경우 추후 통지가있을 때까지 제거하는 것이 좋습니다.

관련 문제