반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함


Understanding the Utility of Garbage Collection



Garbage collection은 메모리 관리와 관련 된 건데요. dynamic 하게 할당하고 자동으로 recycle 하도록 하는 겁니다. 만약 프로그램에 의해 사용되어지는 메모리가 더 이상 사용되어 지지 않게 됐다면 시스템 적에서 자동적으로 recover 되는 겁니다. Garbage collection은 garbage collector 에 의해 수행 됩니다. 메모리 할당과 recycle을 위해 잘 보고 있다가 할당하고 있던 프로그램이 더 이상 사용하지 않게 되면 다른 어플리케이션에 그것을 할당하는 거죠. Garbage collector는 메모리 할당이 특정 한계점에 도달하면 자동으로 invoke 됩니다. 그래서 이 Garbage collector 는 개발자가 메모리 블럭의 할당 해제를 직접 하지 않아도 알아서 메모리 누수나 아니면 너무 일찍 할당 해제해 생기는 문제점들을 사전에 막아 줍니다.



안드로이드에서 메모리 관리는 Dalvik의 garbage collector가 처리 합니다. mark 하고 sweep 하는 방법으로 작동 합니다. 즉 메모리가 어떤 객체에 의해 사용되어 지만 mark 를 하고 그 mark 된 객체는 garbage collect되지 않도록 하는 식이죠) mark 되지 않은 객체들은 sweep 되서 다른 어플리케이션이 사용할 수 있도록 메모리를 free 시킵니다. garbage collecton task는 대개 100에서 200 ms 가 소요 됩니다. 그리고 garbage collection을 하는 동안 어플리케이션의 퍼포먼스는 떨어지게 됩니다. 실행되고 있는 어플리케이션은 이 marking 과 sweeping 작업이 진행되는 동안 suspend 될 겁니다. 작고 아주 짧게 살아있는 object들을 많이 가지고 있는 어플리케이션들은 이 garbage collector를 더욱 자주 실행시키는 결과를 초래할 겁니다. 이렇게 garbage collector 가 너무 자주 실행되는 것을 방지하기 위해 Android SDK 는 allocation tracker 라는 DDMS(Dalvik Debug Monitor service)의 한 부분인 아주 유용할 tool을 제공합니다.



Note
기술적으로 안드로이드에는 garbage collection 이 없습니다. 왜냐하면 안드로이드는 C 언어를 기반으로 한 Operating System 이기 때문이죠. 여기서는 Dalvik runtime내에서 사용되는 Garbage Collection에 대해 얘기하고 있는 겁니다.



DDMS는 안드로이드 SDK를 다운로드 하면 그 안에 딸려서 있는 아주 강력한 디버깅 툴 입니다. DDMS는 이클립스 IDE의 오른쪽 위에 있는 DDMS 아이큰을 선택하거나 Window - Open Perspective - DDMS 옵션을 선택하시면 실행할 수 있습니다.



DDMS를 실행할 때 자동적으로 연결된 Android device나 실행중인 에뮬레이터에 연결 됩니다.



아래는 DDMS를 실행 시켰을 때의 화면 입니다. 




DDMS 의 왼쪽 위에는 Devices 라는 탭이 있습니다. 이것은 컴퓨터에 연결된 디바이스들을 보여 줍니다. 에뮬레이터도 해당 되구요. 그 중 하나를 선택하면 오른쪽에 그에 대한 정보가 나옵니다. 이 Devices 탭 안에는 아래와 같은 아이콘들이 있습니다.

Debug - 디버깅을 하기 위해 사용


Update Hean - 해당 프로세스의 heap information을 볼 수 있도록 함. 이 아이콘을 클릭하고 난 후 오른쪽 pane 의 heap tab을 사용 해 heap 정보를 볼 수 있다.


Dump HPROF file - 메모리 누수를 감지할 수 있는 HPROF 파일을 보여준다.


Cause GC - Gabage collection procedure를 시작 시킨다.


Update Threads - 해당 프로세스의 쓰레드 정보를 보여 준다. 이 아이콘을 클릭 한 후 오른쪽 pane의 Thread 텝을 클릭하면 이 쓰레드 정보를 볼 수 있다.


Start Method Profiling - 다른 메소드들이 몇번 호출 됐는지를 알 수 있다. 그리고 각각이 얼마나 시간을 소비 했는지도 알 수 있다.


Stop Process - 해당 프로세스를 stop 시킨다.


Screen Cpature - 디바이스나 에뮬레이터의 screen 을 capture 한다.


Dump View Hierarchy for UI Automator - screen level trace를 capture 하기 위해 특정 파일을 prompt 한다. CPU frequency changes, CPU idle events, CPU load, Disk I/O 등등의 이벤트들을 Trace 한다. 그리고 이런 trace 는 파일로 저장된다.



그리고 오른쪽 pane 에는 아래와 같은 tab들이 있습니다.

Thread - 해당 프로세스에 있는 쓰레드에 대한 정보를 보여 준다.
Heap - 그 프로세스의 Heap 정보를 보여 준다. Cause GC 버튼을 선택하면 Garbage collection 프로세스가 시작한다. object type과 할당된 메모리의 크기 등이 표시된다. object type을 선택하면 bar graph가 표시 몇개의 object들이 할당됐고 얼마나 메모리를 차지하고 있는지 등에 대한 정보들을 보여 줄 것이다.



Allocation Tracker - 어플리케이션에 할당당된 object들을 추적한다. Start Tracking 버튼을 클릭하면 여러분이 분석하고자 하는 코드를 실행시키기 위해 어플리케이션과 interact 하게 될 것이다. Get Allocations 버튼을 클릭하면 어플리케이션에 할당된 object들의 리스트를 보게 된다. 이 리스트는 위쪽에 표시되는데 만약 그 object중에 하나를 선택하게 되면 그 할당을 이끌고 있는 track trace가 그 아래쪽에 표시될 것이다. 할당된 object의 타입 뿐만 아니라 쓰레드, 클래스, 파일, 그리고 어떤 라인인지에 대한 정보도 볼 수 있다. Stop Tracking 버튼을 클릭하면 데이터를 모두 clear 하고 restart 할 것이다.






반응형

Comment