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

아웃오브메모리가 뜹니다.

0 추천
버퍼로 이미지를 3장씩 받아서 출력해주는 부분인데..

 

일단 A엑티비티에서 3장을 보여주고 그 상태에서 3장의 이미지중 한장을 선택하면

 

새로운 액티비티가 떠서 세부 이미지를 또 3장을 불러와서 나열하는 방식입니다.

 

근데 아웃오브메모리가 뜨네요..

 

항상 뜨는건 아니고 어쩌다가 뜹니다.

 

3장 불러오는 이미지는 한장 용량이 1메가 정도입니다.

 

3장이면 3메가..

 

3메가 사용해도 아웃오브메모리가 뜨나요?
갸아악 (21,260 포인트) 님이 2013년 4월 10일 질문

3개의 답변

+1 추천
 
채택된 답변
1. 이미지가 사용하는 메모리 크기는 JPG 파일크기보다는 이미지의 해상도와 관련이 있습니다.

요즘 나오는 디바이스의 카메라 해상도가 보통 5M픽셀입니다. 2592x1944네요.

이런 이미지라면 2592x1944x4=19MB 의 메모리를 사용합니다. (ARGB_8888로 열었을 경우)

보통 요즘 디바이스의 힙 메모리는 보통 64~96MB입니다. 카메라로 찍은 사진 3~4장 밖에 못엽니다. 이 점 감안하셔서 sample size를 줄이던가하는 방식으로 메모리 사용량을 최소화 하세요.

2. 이제 비트맵의 recycle()은 잊으셔도 됩니다. 진저브레드 이전이야 recycle()을 부름과 동시에 pixel memory해제 효과라도 있었지만(진저브레드 이전이라도 recycle() 안불러도 비트맵 자바 객체가 GC될 때 어짜피 recycle()됩니다)  허니콤 이상부터는 바로 해제도 안됩니다. 픽셀메모리도 힙 영역으로 옮겨왔기 때문입니다. 이제 비트맵에 대해 주의하실 점은 메모리 릭이 안나도록 하는 것 정도입니다. 불필요한 비트맵 레퍼런스가 남아있지 않도록 하세요.
레오나 (3,290 포인트) 님이 2013년 4월 10일 답변
갸아악님이 2013년 4월 10일 채택됨
정말 친절하고 자세한 조언 감사드립니다.
고개숙여 감사드립니다.
좋은 수요일 되시기 바랍니다.^^
0 추천
어쩌다가 뜨시는 거라면

Activity 죵료시에 사용한 이미지를 리사이클 처리 하시는지요
jelly (1,630 포인트) 님이 2013년 4월 10일 답변
리싸이클 처리가 무엇인가요?
이미지가 Bitmap이시잖아요 이때 메모리에 올라가 있는데
메모리에서 해제하기 위해서 사용하는 메서드가 있어요

recycle() << 이걸 호출해주셔야 메모리에서 해제 됩니다. 아니면 메모리에 계속 남아 있어서 메모리 부족 현상이 발생하게 되요
근데 만약 B엑티비티에서 뒤로가기해서 다시 A엑티비티로 왓을때
A엑티비티에서 B엑티비티로 이동하기 직전의 이미지를 보여줘야 하는데 메모리에서 이미지가 해제되어 있으면 바로 전 엑티비티(A엑티비)로 갔을때 이미지가 메모리에 없기 때문에 안보이지 않나요?
우선 간헐적으로 뜨기때문에 메모리가 이미지가 그렇게 크지는 않은거 같습니다.
우선 A에서 B로 갈때는 그냥 두셔도 될거 같구요 B에서 종료해서 이전 화면인 A로 갈때 B이미지만 리사이클 처리 하시면 될거 같습니다.

이미지가 커서 A에서도 리사이클 하셔야 된다면 onPause, onResume에서 리사이클, 이미지 재로딩 처리해서 하시면 메모리 활용면에서는 더 좋겠죠?

onResume, onPause가 그러시다면 onAcitivytForResult, 로 처리 하셔도 될거 같구요^^
정말 유익한 조언 감사드립니다.
0 추천
이전 액티비티에 있던 이미지 세개를액티비티 전환시 라이프싸이클이 stop 이나 destroy 되었을 때 리싸이클 해주는걸 잊으신건 아니신지요?...
wifi (1,340 포인트) 님이 2013년 4월 10일 답변
리싸이클 처리가 무엇인지요 ㅠㅠ
...