2011-11-10 1 views
0

을 완료 무료 메모리는 샘플 코드 https://github.com/PVoLan/TestActivityDisposeMonodroid은 - 활동이 여기에

우리는이 개 활동을 찾을 수 있습니다. 하나에는 버튼이 두 번째 활동으로 이어집니다. 두 번째 활동에는 30 개의 TextView (복잡한 UI 시뮬레이션)와 뒤로 버튼이 있습니다.

앞으로 및 뒤로 활동을 전환하면 GREF 수량이 빠르게 증가합니다. 오버 클러킹 2k 한도 및 충돌 응용 프로그램을 앞뒤로 클릭하는 데 약 60 시간이 걸립니다.

Android 로그는 저장소에서 찾을 수 있습니다. 로그에서 볼 수 있듯이 GREF 오버플로는 TextViews (1543 GREF)로 인해 발생합니다. 또 다른 GREFS은 다음과 같습니다

  • 버튼 (55 GREFs) -에서는 backButton, 분명히
  • OnClickListenerImplementor (55 GREFs) - backButton.Click의 listenters
  • activity2에 (54 GREFs)
  • 의도 (54 GREFs) - 활동 우선

우리가 볼 수있는 그래서, 활동 자원이 해제되지 않을 때 작업 완료 (들의 OnDestroy가 호출 있지만) 어떻게이 모든 GREFs가 제대로 확보 할 수 있습니다?

답변

1

프로세스에 GC가 두 개 (Dalvik & Mono) 있으며 둘 다 다른 메모리가 얼마나 많은 메모리를 사용하는지 알 수 없습니다. 예를 들어, 모든 모노 TextView 인스턴스에 대해 정말 작은 물체 (Java.Lang.Object에서 크게 IntPtr 및 기타 지원 분야) 인보고 :

바운드 유형의 대부분을, 결과의 데이터 멤버가없는입니다
namespace Java.Lang { 
    public class Object { 
     IntPtr handle; 
     // ... 
    } 
} 
namespace Android.Widget { 
    public class TextView : Java.Lang.Object { 
     // ... 
    } 
} 

, C# 래퍼는 아주 작습니다. Mono는 Object.handle과 관련된 Java 객체가 있으며 (더 중요한 것은) 객체가 참조하는 메모리 양을 알지 못합니다.

따라서, 당신은 가끔 도움을 필요

// https://github.com/PVoLan/TestActivityDispose/blob/master/Test/Activity2.cs 
public class Activity2 { 
    // ... 
    protected override void OnDestroy() 
    { 
     Android.Util.Log.Info("----------", "Destroy"); 
     base.OnDestroy(); 
     GC.Collect(); 
    } 
} 

추가 된 GC.Collect() 호출 모노의 GC를 실행하고 쓰레기 개체를 수집 할 수있는 기회를 제공 할 것입니다. 해당 줄을 추가 한 후 "Hello World, Click Me!"를 반복해서 누릅니다. 그리고 "뒤로"는 93-126 grefs (당신이 어떤 활동을하고 있느냐에 따라)에서 수평을 이룹니다.

+0

이것은 테스트 샘플에서 작동하지만 실제 프로젝트에서 예기치 않은 예외가 발생합니다. [here here] (http://stackoverflow.com/questions/7599737/monodroid-gc-collect-fails-without-any-reason) . monodroid에서 GC에 대한 몇 가지 문제점에 대해 들었습니다. 이 질문이 게시되었을 때, 나는 monodroid 1.0.2 버전을 사용했습니다. 이제 최신 베타 버전 (업데이트 된 4-5 일 전)을 사용하지만 문제는 여전히 실제입니다. – PVoLan

+0

@PVoLan : 기기를 재부팅하고 도움이되는지 확인하십시오. – jonp

+0

에뮬레이터를 다시 부팅하고 깨끗한 HTC를 사용하려고했습니다. 효과가 없습니다. 나는 또한 테스트 샘플에서 예외를 나타 내기 위해 노력하고 있지만 여전히 그것을 잡을 수 없다. 내가 너에게 통보 할께. 내가 성공하면 – PVoLan

관련 문제