안드로이드 개발 질문/답변
(글 수 45,052)
listview에서 soft/weak reference를 조함해서 (인터넷 나온대로) 이미지 목록을 만들었습니다.
그런데 스크롤 하면 중간에 퉁, 퉁, 튀는(순간순간 멎는) 현상이 일어납니다.
LogCat으로 보니깐,
gc_external_alloc 가비지 컬렉팅때 그러더라고요
그래서 따른 유사한 기능의 (이미지 목록이 나오는) 리스트뷰가 있는 내장 어플을 봤는데,
거기선 gc_for_malloc 가비지 컬렉팅 메시지가 좀 다르더라구여.
그리고 gc_for_malloc 이것이 나올때는 잘 안튕기더라고요(멎는현상이 인식하지 못할만큼 안튐)
두개 차이점을 알면, 좀더 부드러운 스크롤을 할수 있을거같아서요.
아시는분?
2010.12.07 16:19:15
와;;; 저는 그런 Log 를 신경쓸 생각도 못했는데;;; 그런 차이가 있었군요. 덕분에 좋은 내용을 알게 되었습니다.
Oracle 의 JVM 의 메모리 관련 문서 중에 다음과 같은 내용이 있더군요.
Object Allocation 에는 두 가지 종류가 있다.
비교적 작은 Object (2~128KB) 를 Allocation 하는 경우에는 TLA(Thread Local Area) 에 Object 가 Allocation 되며, 이 공간은 개별 Thread 마다 고유한 공간이기 때문에 다른 Thread 와의 동기화 등을 신경 쓸 필요가 없으며, 훨씬 빠르다.
큰 Object 의 경우에는 Heap 에 직접 추가되는데, Heap 은 두 영역 young space 와 old space 로 나누어져 있다. young space 에서 오래동안 사용되는 object 는 old space 로 이동되고, young space 는 통채로 비워지는 식으로 GC 가 이루어진다. 만일 old space 가 꽉찬 경우에는 old space 에 위치한 개별 object 들의 사용여부를 판별하여, GC 여부를 결정해야 한다. 따라서 young space 의 GC 작업 보다, old space 의 GC 작업이 훨씬 느리다. 그리고 큰 Object 의 경우에는 운이 나쁜경우, young space 로 가지 못하고 바로 old space 에 allocation 될 수도 있다. (old 쪽이 공간에 여유가 더 있나 봅니다.)
따라서, 정리하면 이렇겠네요. gc_external_alloc 은 아마도 old space 를 GC 할 때 발생하는 LOG 혹은 TLA 영역이 아닌 JVM 전역 heap 을 GC 할 때 발생하는 로그로 판단되며, 당연히 gc_for_malloc 보다는 훨씬 느릴 것 같습니다. 이를 방지하기 위해서는;;;? 저장하는 이미지 목록의 size 를 줄이셔야 되지 않을까요? 아니면;;; 혹시나 cache 하는 이미지의 수를 제한해서 미리미리 recycle 을 걸어 주면, Heap 의 young space 가 비어서 좀더 빠른 GC 작업이 일어나지 않을까 싶습니다.
참고:
http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html
2010.12.07 16:49:54
아. 그렇군요. 역시 구글 신. 좋은 정보 감사합니다~~
그러니까 softreference 를 사용하는 경우 JVM 의 가용 메모리가 부족할 때 까지, 무조건 Heap 을 차지하게 됨으로 항상 old space 에 대한 GC 작업이 수행되나 보네요.
그냥 머리속으로만 생각해 보면,
softreference 를 사용하면서 HashMap 의 사이즈를 제한해 두고, 그 이상 아이템이 쌓일 경우 예전 아이템들은 softreference 를 해지하고 weakreference 형식으로 변환해서 추가 적인 캐시를 마련하는 식으로 구현 되면 어떨까 싶네요;;; (잡설입니다..;;;)
2010.12.07 18:33:30
복합적인 문제가 있었습니다.
제가 새로 개발한 소스가 적용이 안되고 기존소스를 쓰고있었내요.
Thread가 안돌아가다 보니깐, GC일경우, 메인Thread가 멈짓 했었내요.
Thread를 돌리니 GC가 일어나도 멈춤이 없어졌습니다.
물론 GC가 일어날때 움찔 하지만, 순정 내장 어플 정도의 움찔이라 괜찮습니다.
또한 기존 코드가 softreference만 쓰고 있었는데,
변경된 소스에 weakreference와 혼용해서 쓰니깐 괜찮내요. 확실히 GC 호출빈도가 낮아지내요.
여튼...여러가지 복합적인 실수로 인해 좋은것을 알게되었습니다.



