기본 콘텐츠로 건너뛰기

4월, 2010의 게시물 표시

Dalvik VM: GC Heap에 대한 Overview

Dalvik VM 은 Java VM과 마찬가지로 garbage collection 되는 heap을 제공한다. 즉, 할당된 메모리에 대해 명시적으로 메모리 해지를 할 필요가 없다. 하지만, Dalvik GC heap의 내부 구현을 들여다보면 기존 Sun JDK가 제공하던 GC heap과는 상당히 다른 구현방법을 따르고 있음을 알 수 있다. 이런 차이로 Java 코드 작성 시 주의해야 할 점 이 생긴다. 이 글에서는 Dalvik의 GC heap의 구조와 객체가 생성되어 메모리를 할당받는 방식에 대해 살펴보도록 하겠다. (실제 garbage collection이 이루어지는 과정에 대해서는 다음 글에서 다루도록 한다.) GcHeap - Garbage Collected Heap 구조체 Dalvik 은 내부 Heap을 관리하기 위해 GcHeap이라는 구조체를 사용한다. 이 구조체의 주요 멤버 변수들을 살펴보면서 GC Heap의 디자인에 대해 살펴보도록 하자. HeapSource *heapSource; heapSource 에는 GC Heap이 사용하는 메모리 공간에 대한 정보를 저장한다. Heap 메모리의 포인터, 초기 크기, 최대 크기 등의 정보를 관리한다. GC Heap에서 사용되는 Heap 메모리는 dlmalloc이라는 오픈소스 메모리 관리자를 사용하여 구현되어 있다. dlmalloc의 create_mspace 함수를 호출하여 생성된 mspace 포인터를 HeapSource로 관리한다. (참고. dlmalloc 이란?) dlmalloc은 State University of New York at Oswego 교수님이신 Doug Lee 가 작성한 오픈소스 메모리 관리자이다. Doug Lee가 Solaris나 기존 UNIX 환경에서 사용하던 메모리 관리자에 불만을 느끼고 성능 및 fragmentation 이슈를 최소화한 메모리 관리자를 목표로 개발한 오픈소스 코드이다. Android는 GC Heap에서 객체를 allocation하고 free 하는

Dalvik VM: Precise GC or Conservative GC ?

Dalvik VM이 garbage collection을 하는 과정 중 모든 thread의 stack frame을 뒤져서 레지스터가 가리키는 객체들을 marking한다. (marking한다는 것은 이 객체가 살아있으므로 GC하지 않겠다라고 표시하는 것이라고 알아두자. 더 자세한 내용은 추후 다른 글에서 다루어보도록 하자) 위 그림을 보면서 이해해보도록 하자. Thread는 curFrame에 현재 stack frame 주소를 가지고 있다. stack frame은 register 값들을 저장하고 있는데 위 그림에서는 rvalue라고 표현하고 있다. 레지스터는 object에 대한 reference를 가지고 있을 수 있다. 이 경우 해당 object는 현재 사용되고 있는 것이므로 GC 과정에 없어지지 않도록 살아있음을 표시하는 marking을 한다. 이 그림에서는 object에 직접 marking하는 것으로 표현하고 있지만 실제로는 HeapBitmap이라고 하는 bit vector에 marking한다. Register에 저장된 값이 object에 대한 reference인지 아니면 다른 값 (예를 들면, 상수 값) 인지 어떻게 판단할 수 있을까? 이 판단 방법에 따라 Precise GC 혹은 Conservative GC의 구분이 이루어진다. Precise GC란 어떤 방법에 의해서든 object에 대한 reference 값을 정확하게 파악하여 잘못된 marking이 이루어지지 않게 하는 방법이다. 이와 달리 Conservative GC는 레지스터의 값의 패턴을 대충 파악하여 이 값이 object reference로 판단할만하면 marking하는 방식이다. 그러므로, 레지스터 값이 object에 대한 reference가 아닌데도 잘못 marking하는 경우가 생길 수 있다. Dalvik VM은 위 코드와 같이 register의 값(rval)이 0이 아니고 하위 2 bits의 값이 0이면 이를 object에 대한 reference로 가정하고 marking을 시도한다. 이런

Android: Compound 컨트롤 구현

Wrox에서 최근 출간한 Professional Android Application Development 2nd Edition 책을 보다 compound control을 만드는 방법에 대해 설명한 4장의 내용에 질문이 생겼다. Professional Android Application Development (2nd, Paperback) - Meier, Reto/John Wiley & Sons Inc compound control을 inflate하면 parent에 attach를 한다는데 이게 어떤 의미인지? 내가 작성한 activity에 가져다 쓰려면 어떻게 해야하는지? 관련 자료를 인터넷에서 찾아보니 아래와 같은 유용한 정보들을 찾을 수 있었다. Exploring World of Android Part 3 => 꼭 읽어보시길! Building Custom Components 위 글에서 알려준대로 새로운 컨트롤을 만든 후 activity에서 findViewById 로 이 컨트롤에 대한 reference를 얻으려고 시도하였는데 문제가 생겼다. 아무리해도 null만 리턴되는 것이다. 동일 문제를 Stackoverflow에서 검색해보니 아래와 같은 자료를 찾았다. findViewById() returns null for custom components ... 위 내용대로 custom component를 만들 때 생성자를 아래와 같이 AttributeSet을 가진놈으로 작성하면 문제가 없어진다. public ClearableEditText(Context context, AttributeSet attr) { ... } Android SDK의 View 관련 문서 를 읽어보니 확실히 이유를 알겠다.

iPhone OS 4.0 발표와 멀티태스킹

지난 목요일에 모습을 드러낸 iPhone OS 4.0 에 대한 관심이 뜨겁다. 스마트폰 운영체제 업데이트 하나만으로 이처럼 큰 반향을 일으키다니 역시 Apple이구나 싶다. 이번 발표에서 가장 주목받는 기능은 역시 멀티태스킹이다. 인터넷에서 잠깐 검색해봐도 아래와 같은 뉴스 기사들을 여럿 볼 수 있다. (from macworld.com) "또 창(화면) 하나에 여러 애플리케이션을 띄워 작업(멀티태스킹)할 수 있는 환경이 조성될 것이라는 소식에 ‘아이폰’ 사용자들이 쌍수를 들었다. 멀티태스킹은 전지 소모량을 늘리는 등 ‘아이폰’ 기능에 직접적으로 영향을 끼쳐 애플에 부담을 줬으나 빗발치는 소비자 요구를 외면하기 어려웠던 것으로 보였다." (전자신문) iPhone OS 4.0 발표 동영상을 유심히 살펴본 분이라면 위 기사가 얼마나 성의 없게 쓰여졌는지 알 수 있다. Apple은 예전이나 지금이나 기존 Windows Mobile과 같은 멀티태스킹은 사용자에게 득보다 실이 많을 것으로 보고 iPhone OS 4.0에서는 이와는 다른 방식을 선택하였다. "Developers will have access to seven multitasking services, which will allow tasks to be performed in the background while preserving performance and battery life. " (Apple 사이트에서) 위 글에서 볼 수 있듯이 iPhone의 멀티태스킹은 7개의 서비스를 이용하여 시스템의 성능은 유지하고 배터리 문제도 해결하면서 사용자에게는 기존 멀티태스킹과 유사한 경험을 제공할 수 있도록 한다. 이 7개의 서비스는 각각 "Background Audio, VoIP, GPS, Local Notification, Task Completion, Smart App Switching" 등의 기능을 제공한다. (1개는 뭔지 잘 모르겠다...) 그러므로, 우리가

Tip - Codepad를 이용한 소스 코드 공유

http://codepad.org 는 간단하지만 개발자에게 유용한 서비스를 제공한다. 다른 개발자와 협업을 하다 보면 자주 소스코드에 대해 함께 검토해야 할 경우가 생긴다. 소스 코드를 공유해서 보기 위해서는 메신저나 이메일 등으로 소스 코드를 보내고 나서 채팅을 하거나 전화로 논의한다. (From http://viralpatel.net) http://codepad.org 는 협업 시 필요한 소스 코드 공유를 쉽고 더 효율적으로 할 수 있게 도와준다. 참고로 내가 공유한 string permutation C 소스 코드를 살펴보기 바란다. 공유하고 싶은 소스를 복사해서 Codepad에 제출한다. Codepad가 생성한 permanent link를 협업할 개발자에게 메신저나 이메일로 알려주면 된다. 코드를 함께 보며 논의를 할 수도 있고 혹은 comment기능을 사용하여 서로 의견을 주고받을 수도 있다. 온라인에서 소스 코드를 compile하는 기능도 갖추고 있어 코드에 오류가 있는지도 확인 할 수 있다. Update - 코드 리뷰에 많이 사용하는 Pastebin 도 편리해보인다.