저는 Android 애플리케이션에서 발생할 수있는 메모리 누수를 추적 해왔고, 무엇을해야할지 모르겠습니다. 먼저, 내가하려고하는 것을 설명 할 것입니다.Gallery 내부의 ListView로 안드로이드 메모리 누수가 발생했습니다.
나는 Eclair (2.1, API 레벨 7) 및 HTC Incredible 실행 진저 브레드 (2.3.7, API 레벨 10)에서 테스트하고 있습니다. LogCat을 관찰 한 결과 응용 프로그램의 최대 힙 크기는 약 32MB라고 가정합니다.
연락처가 여러 개인 주소록을 만들려고합니다. 왼쪽과 오른쪽으로 스크롤하여 페이지 간을 이동하고 스크롤을 위아래로 스크롤하여 현재 페이지를 탐색합니다. 이를 수행하기 위해 나는 Gallery
어댑터를 사용하여 연락처 목록을 ListView
으로 변경합니다.이 어댑터의 어댑터는 하나의 연락처를 RelativeLayout
으로 변경합니다.
모든 것이 정상적으로 작동하는 것 같지만 기본 (외부) 메모리가 부족합니다. 갤러리를 스 와이프하면 빨리이 표시됩니다. 나는 Gallery
주위를 한동안 스왑 한 후 HPROF 덤프를 만들어 MAT로 가져 왔습니다. 히스토그램에서, 나는 내 연락처 ListView
에 의해 전적으로 개최되었다 내 연락처 RelativeLayout
의 몇 백을 찾았습니다. 여기에 내가 그 ListView
의 [절단] 매트 merge_shortest_paths 출력에서 보았을 때 내가 무엇을 발견 :
android.view.ViewRoot$1
+ this$0 android.view.ViewRoot
+ mAttachInfo android.view.View$AttachInfo
+ mScrollContainers java.util.ArrayList
+ array java.lang.Object[303]
+ [110], [112], [114], [116], [118], ... com.example.LeakyListView
+ ...and so forth.
그 유출 ListView
의 잡고있는 유일한 방법이 android.view.View$AttachInfo
의 mScrollContainers
필드
이 메모리 누수는 어떻게 해결합니까? 또는 적어도이 참조 사슬은 어떻게 만들어졌으며 ViewRoot
, AttachInfo
및 mScrollContainers
은 무엇입니까?
간단한 테스트 케이스로 분리하여 여기에 곧 게시 할 예정이지만, 대화를 시작하기에 충분할 것으로 기대하고 있습니다.
는 u는 나에게 당신이 사용하고있는 이미지의 최대 크기를 알 수 있습니까? –
각 연락처 이미지는 32x32입니다. 샘플 데이터의 경우 각 "페이지"에는 10 개의 연락처가 있으며 7 개의 페이지가 있습니다. 나는 [Fedor의 lazylist] (https://github.com/thest1/LazyList)와 비슷한 ImageLoader를 사용하고 있으며 소스 이미지는 각각 약 37x37입니다. –
이제 정확히 똑같은 문제가 있습니다. –