마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

갤럭시 s3의 메모리 스펙이, 512MB에서 1GB인데, 어째서 120~180MB 정도의 메모리 사용량도 못견디는 걸까요?

0 추천

메모리 누수 수정 작업에 들어갔습니다.

 

프로파일러로 메모리 사용량이랑, 힙사이즈 둘러보고 있는 중인데요.

 

역시 비트맵 부분, res>Drawable폴더에 들어있는 PNG 이미지 파일들이랑, OOM이

 

엄청난 영향을 주는 것이 아닌가 생각하고 있고, 다들 Drawable폴더에 있는 이미지 파일의

 

파일 사이즈를 줄여야 한다고 조언해주시더라고요. 근데, 이미지 파일 크기라고 해봐야

 

5~20KB 수준이더라고요. 이게 그렇게 큰 영향을 주는건가요? 이미지 파일 크기가 MB단위도 아니고,

 

겨우 20KB 정도인데, 이게 메모리 사용량에 큰 영향을 주는건가요?

 

제가 갖고 있는 이미지들은 전부 버튼 이미지에 사용되는 이미지들 뿐이고,

 

버튼의 대부분은 TextView를 사용해서 만들었습니다. DrawableTop 속성을 사용해서 이미지를 추가하고,

 

텍스트가 그 밑에 출력되도록 TextView에 텍스트 속성값도 줬습니다.

 

그런데 갤럭시 s3에서 이 이미지들이 엄청 크게 출력 되더라구요.

 

갤럭시 s5부터는 이미지 크기가 정상적으로 나오긴 했지만, 느린건 여전하더라구요.

 

안드로이드 메니페스트에서 라지힙도 이미 바꿔준 상태인데도 불구하고, 여전히 앱이 불안정하네요.

android:largeHeap="true"

 

갤럭시 S3랑 S5에서 해봤는데, 두 기기 전부, 앱이 엄청 느리게 작동하고, 다른 액티비티를 켜자마자, 앱이 강제종료 되더라구요.

 

S5에서는 강제 종료 될때도 있고, 잘 작동할때도 있네요. 지금 테스트 해보니, 지금은 튕기지 않고, 잘 작동합니다. 속도도 꽤 잘나오는데, 아까는 왜그랬는지 모르겠네요. 음... 생각해보니 라지힙 설정 후에, 잘 돌아가기 시작한것 같네요. 그래도 특정 부분에서, 느려지는 현상이 없지 않아 있습니다.

상쾌한 (1,890 포인트) 님이 2021년 4월 19일 질문
상쾌한님이 2021년 4월 19일 수정
질문 제목에는 120 ~ 180MB의 메모리를 앱이 사용하고 있다고 하셨다는 질문내용에는 마치 5-20KB의 메모리를 사용하는 것 처럼 서술을 하셔서 이해하기에 따라서 헷갈릴 수도 있을 것 같아요. 아마도 이미지 한개의 사이즈가 약 20KB정도 되고 이걸 리스트에서 한꺼번에 뿌려서 전체적인 메모리 사용량 120 ~ 180MB인 것도 같고, 이미지를 확대해서 보여주면서 메모리가 사용량이 그만큼 늘어날 것일 수도 있을 것 같아 보이는데요. 내 앱에서 메모리를 얼마나 사용할 수 있을지는 OS의 몫입니다. 즉, 해당 디바이스의안드로이드 OS와 하드웨어 스펙에 따라 달라질 수 있다는 말입니다. 제가 알기로는 s3 나 s5같은 구형폰은 님이 말씀하신 120 ~ 180MB 정도면 거의 맥시멈에 해당할 수도 있을 것 같습니다. 그리고 어떻게 이미지 로딩을 구현하셨는지도 중요할 것 같습니다. 만약 이미지를 할당하고 제대로 해제해 주지 않았다면, 금방 메모리 관련 문제가 생길 수도 있으니까요.
그렇군요... 메모리 사용량이 일정하지가 않고, 점점 늘어나는 형태라, 손볼 곳이 많은것 같습니다. 덤프를 해보면, 거의 대부분 drawable에 관한 메시지 뿐이라, 이런 이미지에 관한 문제라면 glide 라이브러리를 사용하는게 맞는건가요? 리사이클러뷰를 스크롤할때, 이미지가 있으면, 버벅이는 증상이 생깁니다. 이를 자세히 얘기하자면, 네스티드 스크롤 기능이 작동하여, 숨겨져 있던 최상단 최하단의 앱바들이 나타날때부터 시작해서, 스크롤이 버벅이면서 뚝뚝 끊기는 증상이 일어납니다. 반대로 이 앱바들이 숨겨진 이후부터 시작해서, 스크롤할때 버벅임이 완전히 사라집니다. 또, 드로우어레이아웃으로 만든 메뉴창이 화면에 나타나는 도중에 뚝뚝 끊기면서 나타나는 문제도 있습니다. 여기에도 drawable폴더에 만들어놓은 drawable_drawable_image 리소스 파일들을 많이 사용했습니다. 본래 이 drawable 리소스 파일에 사용된 png형식의 이미지 파일들은 512px사이즈에 5~20KB파일크기 인데, 리소스 파일 내부에서 그 크기를 32dp x 32dp로 조정해서 xml코드 영역내로 호출하여 사용하고 있습니다.
이런식으로요.

<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <item
        android:drawable="@drawable/check"
        android:width="32dp"
        android:height="32dp"/>

</layer-list>


                    <TextView
                        android:id="@+id/search"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:layout_gravity="center"
                        android:paddingTop="4dp"
                        android:layout_weight="1"
                        android:background="?attr/selectableItemBackground"
                        android:drawableTop="@drawable/drawable_search"
                        android:gravity="center"
                        android:text="검색"
                        android:textSize="14dp"
                        android:textColor="#000000" />

마지막으로 궁금한 것은, 저 말고 다른 분들도 이런 방식으로 하다가 저랑 똑같은 문제를 겪고 glide 라이브러리를 사용하시는 분들이 많나요?
스파크님의 답변은 항상 감을 잡게 해주시네요. 답변 감사합니다. ^^
덕분에 구글 검색으로 해결 방법은 모두 알아냈습니다. ^^v
이미지 로딩을 사용 앱에 적용하는데 자체 코드를 사용하는 경우는 많지 않으리라 생각됩니다. Picasso나 Glide 같은 정도의 결과물을 만드는데 많은 시간이 걸리기 때문입니다. Glide만 해도 수많은 개발자들이 다년간 컨트리뷰트를 해오고 있는 라이브러리입니다. 이미 많은 개발자들에게 검증된 라이브러리이므로 공부 목적이나 라이브러리 개발 목적이 아니면 가져다 사용하는게 여러모로 이득이라고 생각됩니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...