개발중인 앱의 메모리 누수를 파악하기 위해 4 일 동안 모든 노력을 다했지만 오래 전에는 이해가되지 않았습니다.
내가 개발중인 앱은 사회적 성격을 띠고 있으므로 활동 프로필 (P)을 생각하고 데이터와 함께 활동을 나열합니다 (예 : 배지 (B)). 프로필에서 배지 목록, 다른 프로필, 다른 목록 등으로 이동할 수 있습니다.
따라서 P1-> B1-> P2-> B2-> P3-> B3 등과 같은 흐름을 상상해보십시오. 일관성을 위해 동일한 사용자의 프로필과 배지를로드하고 있으므로 각 P 페이지는 동일합니다. 각 B 페이지.
문제의 일반적인 요지는 각 페이지의 크기에 따라 조금씩 탐색 한 후 임의의 위치 (비트 맵, 문자열 등)에서 메모리 부족 예외가 발생합니다. 일관성이없는 것 같습니다.
내가 기억이 부족한 이유를 알아 내기 위해 상상할 수있는 모든 일을했지만 아무것도 생각하지 못했습니다. 내가 이해하지 못하는 것은 로딩시 메모리가 부족하고 대신 충돌하는 경우 Android가 P1, B1 등을 죽이지 않는 이유입니다. onCreate () 및 onRestoreInstanceState ()를 통해 다시 돌아 오면 이러한 초기 활동이 죽고 부활 할 것으로 예상합니다.
이것은 말할 것도없고-내가 P1-> B1-> 뒤로-> B1-> 뒤로-> B1을해도 여전히 충돌이 발생합니다. 이것은 일종의 메모리 누수를 나타내지 만 hprof를 덤프하고 MAT 및 JProfiler를 사용한 후에도 정확히 찾을 수 없습니다.
웹에서 이미지로드를 비활성화하고 (그리고이를 보완하고 테스트를 공정하게 만들기 위해로드 된 테스트 데이터를 늘 렸습니다) 이미지 캐시가 SoftReferences를 사용하는지 확인했습니다. Android는 실제로 가지고있는 몇 가지 SoftReference를 해제하려고하지만 메모리가 부족해지기 직전입니다.
배지 페이지는 웹에서 데이터를 가져 와서 BaseAdapter의 EntityData 배열로로드하고이를 ListView에 공급합니다 (실제로 CommonsWare의 우수한 MergeAdapter를 사용 하고 있지만이 배지 활동에서는 어쨌든 어댑터가 1 개뿐입니다. 이 사실을 어느 쪽이든 언급하고 싶었습니다).
나는 코드를 살펴본 결과 누출되는 것을 찾을 수 없었습니다. 내가 찾을 수있는 모든 것을 지우고 무효화했고 심지어 System.gc () 왼쪽과 오른쪽까지도 앱이 충돌합니다.
스택에있는 비활성 활동이 왜 거두어지지 않는지 여전히 이해가 안되며 그 사실을 알아 내고 싶습니다.
이 시점에서 나는 도움이 될 수있는 힌트, 조언, 해결책을 찾고 있습니다.
감사합니다.
outOfMemory
오류입니다. 감사!