WEBVTT 00:00:00.280 --> 00:00:03.010 안드로이드가 사용하는 자바 언어의 가장 큰 장점 중 하나는 00:00:03.010 --> 00:00:05.520 메모리 관리 환경이라는 점이죠 00:00:05.520 --> 00:00:08.400 너무 연연하지 않아도 된다는 뜻이에요 00:00:08.400 --> 00:00:11.060 객체가 생성되고 해제되는 타이밍에 대해서 말이죠 00:00:11.060 --> 00:00:12.620 메모리 관리 환경은 편리하긴 하지만 00:00:12.620 --> 00:00:17.330 보이지 않는 곳에서 성능 문제가 발생할 수 있어요 00:00:17.330 --> 00:00:18.240 잊지 마세요 00:00:18.240 --> 00:00:21.940 안드로이드 런타임의 메모리 힙은 스페이스라는 단위로 나누어져 있어요 00:00:21.940 --> 00:00:23.720 메모리를 차지하는 데이터의 종류와 00:00:23.720 --> 00:00:27.980 시스템이 GC를 최적화할 수 있는 방법을 기준으로 스페이스를 분류해요 00:00:27.980 --> 00:00:30.580 각 스페이스는 메모리 크기가 지정되어 있어요 00:00:30.580 --> 00:00:34.630 객체에 할당된 메모리의 크기가 스페이스의 총 크기에 근접하면 00:00:34.630 --> 00:00:38.050 GC가 실행되어 불필요한 객체를 해제하고 00:00:38.050 --> 00:00:40.182 메모리 일부를 반납해요 00:00:40.182 --> 00:00:43.935 보통 GC 이벤트는 애플리케이션 성능에 큰 문제를 일으키지 않아요 00:00:43.935 --> 00:00:46.749 하지만 GC가 반복적으로 발생하면 00:00:46.749 --> 00:00:48.915 프레임 타임의 큰 부분을 차지하게 됩니다 00:00:48.915 --> 00:00:50.725 GC를 하는 시간이 길어질수록 00:00:50.725 --> 00:00:54.492 렌더링과 오디오 스트리밍 등 다른 작업을 할 시간이 줄어들어요 00:00:54.492 --> 00:00:59.172 개발자가 자주 맞닥뜨리는 GC 관련 성능 문제 중 00:00:59.172 --> 00:01:00.792 메모리 누수라는 상황이 있는데요 00:01:00.792 --> 00:01:04.272 메모리 누수는 애플리케이션이 더 이상 사용하지 않는 객체를 00:01:04.272 --> 00:01:07.402 GC가 가려내지 못하는 상황을 일컫는데요 00:01:07.402 --> 00:01:09.502 결과적으로 불필요한 객체가 해제되지 않고 00:01:09.502 --> 00:01:13.282 스페이스의 소중한 공간을 차지해 다른 객체들이 스페이스를 활용할 수 없게 돼요 00:01:13.282 --> 00:01:14.542 메모리 누수가 지속되면 00:01:14.542 --> 00:01:19.092 메모리 힙의 가용한 공간이 매 세대마다 줄어듭니다 00:01:19.092 --> 00:01:22.230 그래서 GC 이벤트가 더 자주 실행돼요 00:01:22.230 --> 00:01:25.490 프로그램 실행 중 필요한 메모리를 확보하기 위해서 말이죠 00:01:25.490 --> 00:01:28.530 메모리 누수를 찾고 고치는 건 까다로워요 00:01:28.530 --> 00:01:30.040 누수는 아주 간단한 이유로도 발생하거든요 00:01:30.040 --> 00:01:33.790 예를 들어 프로그램이 사용하지 않는 객체에 대해 순회적인 참조를 하면 발생해요 00:01:33.790 --> 00:01:35.410 반면 복잡한 누수도 있어요 00:01:35.410 --> 00:01:39.680 Class loader 객체에 대한 핸들러를 생성한 후 해제해주지 않을 경우처럼 말이죠 00:01:39.680 --> 00:01:42.270 경우가 어떻든 매끄럽고 빠른 애플리케이션은 00:01:42.270 --> 00:01:45.640 메모리 누수의 존재를 인지하고 민감하게 대처해야 해요 00:01:45.640 --> 00:01:48.160 생각해봐요 여러분의 코드는 수많은 기기에서 실행될 테고 00:01:48.160 --> 00:01:49.270 기기마다 제각각 00:01:49.270 --> 00:01:52.150 메모리 크기와 사용량이 다르겠죠 00:01:52.150 --> 00:01:56.420 다행히도 메모리 누수 찾는 작업을 도와주는 간단한 툴이 있어요 00:01:56.420 --> 00:01:57.850 안드로이드 SDK에 말이죠 00:01:57.850 --> 00:01:58.800 함께 살펴볼까요?