2012-04-20 3 views
2

지도 활동을 다루는 프로젝트를 진행하고 있습니다. MapActivity를 확장하고 다른 작업을 수행하지 않는 하나의 활동 인 MaptestActivity로 구성된 테스트 응용 프로그램을 실행하고있었습니다. 나는 그 장치를 10 번 이상 회전 시켰고 나는 MAT로 힙 덤프를 분석했다. 나는 주된 활동의 2 개의 예가 주변에 매달리고 있다는 것을 알아 차렸다 (누수?). 나는 액티비티를 확장하는 것과 동일한 액티비티로 앱을 재시험했다 : 덤프는 시스템에 의해 유지되는 인스턴스 하나만 보여 주었다. 두 경우의 스크린 샷을 첨부하고 있습니다. 나는 매트에 그다지 다르지 않습니다. 어쩌면 나는 그 결과를 오해하고 있습니다. 그리고 모든 것이 잘 작동합니다. 그것 좀 비켜 줄래? 여전히 두 개의 활동이있는 경우 | "방향을 keyboardHidden"android GoogleMaps memory leaks (?)

+0

이 문제를 해결

이것은 좋은 비디오는? –

+0

아직은 (리플렉션을 사용하여) 작업 중입니다. 나는 (희망을 갖고) 찾으면 해결책을 게시 할 것이다! – Matthew

+0

아직 아무것도 찾았습니까? – njzk2

답변

0

With memory leak은 manifeast 파일

안드로이드에 활동에 아래 줄을 추가 메모리를 교체 한 후 메모리 누수가 발생합니다. MAT를 사용하여 히스토그램을 사용하여 해당 활동이 가비지 수집되는 것을 차단할 수 있습니다. 클래스 이름을 검색하여 찾으십시오. 그런 다음 마우스 오른쪽 버튼으로 클릭하고 목록 개체/들어오는 참조를 선택하십시오. 그러면이 객체의 각 항목이 메모리에 나열됩니다. 이 객체 중 하나를 마우스 오른쪽 버튼으로 클릭하고 Path to GC roots/exclude weak references를 선택하십시오. 이제는 액티비티의 onDestroy가 완료된 후에 무언가가 완전히 정리되지 않는 객체의 계층 구조를 볼 수 있어야합니다. 정적 컨텍스트에 대한 하드 참조와 같은 경우에는이 문제가 발생합니다. 우리의 메모리 문제를 해결하기 위해 weakReferences를 적절한 곳에서 사용하고 onDestroy에서 청크를 깨끗이 정리하는 것과 같은 일을해야했습니다 (리스너를 null로 설정하는 것과 같음).

일반적으로 활동이 비트 맵과 같은 대형 객체를 보유하지 않는 경우 장치의 응용 프로그램 힙 크기를 초과하기 전에 많은 응용 프로그램 사용을 의미하므로 메모리 누수로 "빠져 나갈 수"있습니다. 그러나 모든 활동이 큰 비트 맵을 보유하고 있다고 말하면 누출 활동은 훨씬 더 큰 문제가됩니다. Memory Management for Android Apps 그리고 좋은 기사 : Avoiding Memory Leaks

+0

True로 설정하면 활동이 다시 작성되지 않습니다. 그래도 문제는 해결 방법과 비슷합니다. – Matthew

1

configChanges =

Without memory leak

+0

감사합니다. 그게 내가 한 짓이야. 다음은 homeActivity를 보유하고있는 스크린 샷입니다. [link] (http://postimage.org/image/7vauzrru9/). 그것은 구글 맵스 '개체에 대한 참조를 유지하는 것처럼 보인다. 이전에 말한 것처럼 homeActivity는 MapActivity를 확장하고 다른 작업을 수행하지 않습니다 (지도로드 이벤트가 아닙니다). – Matthew

+0

onDestroy에서 보유하고있는 객체를 지우기 위해 무언가를 호출 할 수 있는지 확인하십시오. 사용할 수있는 메소드가없고 공개 변수가없는 경우이를 지우는 null로 설정할 수없는 경우 리플렉션을 사용하여 문제의 개인 변수에 액세스하여이를 무효화 할 수 있습니다. 이것은 알려진 문제인 것처럼 보입니다. http://stackoverflow.com/questions/5460650/android-mapview-always-causes-an-outofmemoryerror-in-nested-elements – Scott

+0

감사합니다. – Matthew