Translate

[MAT][Android] 힙덤프(Heap Memory Dump) 의 sPreloadedDrawables 객체 분석




Android 의 Heap Memory Dump 를 생성해서 분석하게되면 정말 간단한 소스인데도 이상하게 Heap Memory를 많이 사용하고 있는 것을 볼 수 있다.



Android Project 를 생성시 아래의 링크와 같이 기본 소스가 생성이 된다.
https://github.com/1004lucifer/Android_HelloWorld

그냥 단순히 Activity 하나에 문자열 하나만 있는 앱인데도
Heap Memory 를 7MB 이상 사용을 하고 있었다. (HeapMemoryDump 파일 다운로드)





MAT 를 이용해서 HeapDump 를 열면 처음에 아래와 같이 보인다.






Leak Suspects 선택 시 다음과 같이 보여지는데 sPreloadedDrawables 객체에서 7.6MB를 사용하는걸 볼 수 있다.






sPreloadedDrawables 객체안에 NinePatch, Bitmap 들이 들어있는 것을 볼 수 있다.






해당 NinePatch, Bitmap 들을 이미지로 추출하면 다음과 같은 이미지들이 있다.
Android App 에서 기본적으로 사용되는 이미지라는걸 알 수 있다.
(추출방법은 다음과 같다. 링크)















외국에서 다른사람들도 이게 뭐지?? 하며 찾아봤나보다.
1. http://stackoverflow.com/questions/12674484/how-to-find-out-ids-or-names-of-preloaded-system-drawables-bitmaps-from-memory
2. http://stackoverflow.com/questions/9653457/locating-and-remedying-cause-of-large-heap-size



예상했던대로 기본시스템 리소스가 미리 로드가 된 것이고 sPreloadedDrawables 가 사용하는 메모리를 줄일 수 있는 방법은 없다고 한다;;


이 블로그에 쓰기위한 테스트환경은 Android 4.1.2 를 사용했는데 Android 5 버전에서의 HeapDump 를 보면 sPreloadedDrawables 객체가 17.8MB 를 사용하는것을 확인했었다.
이미지를 뽑아보면 위와같은 이미지가 있는데 이미지 사이즈가 어마어마했다.
(해상도가 높으니 그런 듯 싶다.)



아무튼 최신 단말기에서는 늘어난 Ram 용량만큼 각각의 App 에서 기본적으로 가지고 있는 시스템 리소스가 너무 많이잡아먹기 때문에 동시에 구동 가능한 App 은 예전 단말기와 비교했을 때 크게 차이나지 않을까 싶다.


댓글