Return to Video

04-02 Memory,_GC,_and_Performance

  • 0:00 - 0:03
    이제 저희 코드가 빨라졌으니
  • 0:03 - 0:05
    메모리에 대해 조금 더 얘기해봐요
  • 0:05 - 0:08
    특히 메모리가 시스템 성능에 어떤 영향을 미치는지 말이에요
  • 0:08 - 0:13
    하드웨어에 친숙한 고성능 언어로 알려진
  • 0:13 - 0:15
    C, C++, Fortran 같은 프로그래밍 언어는
  • 0:15 - 0:18
    프로그래머가 메모리를 직접 관리하도록 해요
  • 0:18 - 0:22
    메모리를 할당하는 건 프로그래머의 몫이죠
  • 0:22 - 0:26
    메모리 사용이 끝나면 반납하는 것도 마찬가지입니다
  • 0:26 - 0:30
    메모리를 언제, 얼마만큼 할당할지를 직접 결정하니
  • 0:30 - 0:35
    메모리 관리의 효율성은 여러분의 능력에 달려있어요
  • 0:35 - 0:37
    책임이 막중하죠
  • 0:37 - 0:39
    게다가 대부분의 프로그래머들은
  • 0:39 - 0:42
    그 많은 메모리 조각들을 잘 관리하지도 못해요
  • 0:42 - 0:46
    생각해보세요
    제품 개발은 지저분하고 정신없는 작업이에요
  • 0:46 - 0:49
    그래서 메모리 반납은 제대로 이루어지지 않죠
  • 0:49 - 0:53
    이런 반납되지 않은 메모리 조각을 메모리 누수라고 해요
  • 0:53 - 0:55
    가만히 앉아서 리소스만 잡아먹게 됩니다
  • 0:55 - 0:58
    더 좋은 용도로 쓰일 수 있는 리소스를 말이죠
  • 0:58 - 1:02
    메모리 누수로 인한 문제, 스트레스, 그리고 금전적 손해를 줄이기 위해
  • 1:02 - 1:05
    메모리 관리 언어가 생겼어요
  • 1:05 - 1:09
    메모리 관리 언어의 런타임은 할당된 메모리를 추적하고
  • 1:09 - 1:13
    애플리케이션이 더 이상 필요하지 않은 메모리는
    다시 시스템으로 반납합니다
  • 1:13 - 1:16
    프로그래머가 건드리지 않아도 말이죠
  • 1:16 - 1:20
    메모리 관리 환경에서 메모리를 회수하는 예술, 아니 기술은
  • 1:20 - 1:22
    Garbage collection(GC)이라고 불러요
  • 1:22 - 1:27
    GC의 개념은 1959년에 존 맥카시가
  • 1:27 - 1:30
    LISP 프로그래밍 언어의 문제를 해결하기 위해 만들었어요
  • 1:30 - 1:32
    GC의 기본적 원칙은 다음과 같아요
  • 1:32 - 1:37
    첫째, 프로그램에서 더 이상 접근할 수 없는 데이터 객체 찾기
  • 1:37 - 1:40
    코드에서 더 이상 참조하지 않는 메모리 주소 같은 것 말이죠
  • 1:40 - 1:44
    둘째, 이런 객체가 사용하던 리소스 회수하기
  • 1:44 - 1:46
    이론적으론 간단하지만 순식간에 많이 복잡해집니다
  • 1:46 - 1:51
    2백만 줄의 코드와 4GB만큼의 메모리 주소 할당이 있다면 말이죠
  • 1:51 - 1:53
    생각해보세요 GC는 정말 복잡할 수 있어요
  • 1:53 - 1:57
    지금 당장 여러분의 프로그램에서 2만 개의 메모리 할당이 있다면
  • 1:57 - 1:58
    필요하지 않은 메모리들은 어떤 건가요?
  • 1:58 - 2:04
    아니면 필요하지 않은 메모리를 수거하기 위한
    GC 이벤트는 언제 실행해야 하나요?
  • 2:04 - 2:06
    이것들은 실제로 매우 어려운 문제들입니다
  • 2:06 - 2:10
    다행히도 GC 기술이 50년에 걸쳐 개선되고 보완된 덕분에
  • 2:10 - 2:15
    안드로이드 런타임의 GC는
    McCarthy의 기존 아이디어보다 더 세련된 기능을 수행합니다
  • 2:15 - 2:19
    최대한 거슬리지 않고 빠르게 수행되도록 제작되었어요
  • 2:19 - 2:21
    안드로이드 런타임의 메모리 힙은
  • 2:21 - 2:23
    스페이스라는 단위로 나누어져 있습니다
  • 2:23 - 2:24
    메모리 할당의 종류와
  • 2:24 - 2:27
    시스템이 메모리를 정리할 수 있는 가장 효율적인 방법으로 나눕니다
  • 2:27 - 2:28
    추후에 발생할 GC 이벤트에 대해서 말이죠
  • 2:28 - 2:30
    새로운 객체가 메모리에 할당되면
  • 2:30 - 2:34
    객체의 특징을 고려해 가장 적절한 스페이스로 배정해요
  • 2:34 - 2:37
    배정 방법은 안드로이드 런타임 버전에 따라 달라요
  • 2:37 - 2:39
    자 이제 중요한 부분을 말씀드릴게요
  • 2:39 - 2:41
    각 스페이스는 크기가 정해져있어요
  • 2:41 - 2:42
    객체가 추가적으로 메모리를 할당받으면
  • 2:42 - 2:44
    스페이스의 총 크기를 기록해요
  • 2:44 - 2:52
    스페이스가 커지면 시스템은 추후의 메모리 할당을 위해 GC를 실행해요
  • 2:52 - 2:54
    하지만 GC 이벤트 진행 방식은 바뀌어요
  • 2:54 - 2:57
    안드로이드 런타임 버전에 따라 말이죠
  • 2:57 - 3:01
    예를 들어 Dalvik에서의 GC 이벤트는
    stop-the-world(앱 정지) 이벤트에요
  • 3:01 - 3:05
    즉 GC 이벤트가 완료되기 전까지 다른 작업도 멈추는 거죠
  • 3:05 - 3:07
    하지만 이 방법은 문제가 발생할 수 있어요
  • 3:07 - 3:11
    GC의 실행 시간이 길어지거나
    여러 GC 이벤트가 연이어 발생하면 말이죠
  • 3:11 - 3:14
    기기의 프레임 타임을 많이 사용하게 되니까요
  • 3:14 - 3:19
    안드로이드 개발자들은 GC 이벤트를 최대한 빠르도록
    설계하는데 심혈을 기울였어요
  • 3:19 - 3:21
    성능에 대한 영향을 최소화하기 위해 말이죠
  • 3:21 - 3:25
    이런 노력에도 불구하고 애플리케이션 성능에
    문제를 일으킬 수 있습니다
  • 3:25 - 3:30
    우선 애플리케이션이 한 프레임에서 GC를 수행하는 시간이 길수록
  • 3:30 - 3:33
    다른 로직 계산들이 사용할 수 있는 시간이 줄어들어요
  • 3:33 - 3:35
    16ms의 총 렌더링 시간 중 말이죠
  • 3:35 - 3:38
    그렇기 때문에 하나의 긴 GC나 여러개의 연속적인 GC가 있다면
  • 3:38 - 3:43
    프레임 처리 속도가 16ms를 넘어갈 수 있어요
  • 3:43 - 3:47
    그러면 사용자는 렉이나 튀는 현상을 경험하죠
  • 3:47 - 3:50
    두 번째로 여러분의 코드 흐름이
  • 3:50 - 3:52
    보다 자주 GC를 일으킬 수 있고
  • 3:52 - 3:55
    혹은 너무 긴 GC를 일으킬 수도 있다는 점을 기억하세요
  • 3:55 - 4:00
    예를 들어 루프의 깊숙한 곳에서 객체를 대량으로 할당하면
  • 4:00 - 4:03
    객체들이 메모리 힙을 오염시키고
  • 4:03 - 4:06
    짧은 시간 내에 많은 GC들을 쳐내야 할 거예요
  • 4:06 - 4:09
    이 과도한 메모리 압박으로 말이죠
  • 4:09 - 4:12
    그리고 메모리 관리가 잘 된 환경에 있다 하더라도
  • 4:12 - 4:14
    메모리 누수는 일어날 수 있어요
  • 4:14 - 4:17
    물론 다른 언어보단 발생하기 어렵지만요
  • 4:17 - 4:20
    이런 메모리 누수는 힙에서 자리를 차지하고
  • 4:20 - 4:21
    GC 이벤트에서도 반납되지 않아
  • 4:21 - 4:24
    다른 자료가 사용할 수 있는 메모리가 줄어
  • 4:24 - 4:28
    GC가 더 자주 발생하게 됩니다
  • 4:28 - 4:29
    이게 현실이에요
  • 4:29 - 4:32
    한 프레임에서 발생하는 GC 이벤트의 개수를 줄이시려면
  • 4:32 - 4:36
    여러분 애플리케이션의 메모리 사용을 최적화해야 해요
  • 4:36 - 4:41
    코드를 보면 메모리 문제가 어디서 발생하는지 찾기 어렵지만
  • 4:41 - 4:45
    안드로이드 SDK는 이 문제를 해결하기 위한
    강력한 툴 몇 가지를 제공하죠
  • 4:45 - 4:46
    한번 볼까요
Title:
04-02 Memory,_GC,_and_Performance
Description:

04-02 Memory,_GC,_and_Performance

more » « less
Video Language:
English
Team:
Udacity
Project:
ud825 - Android Performance
Duration:
04:47

Korean subtitles

Revisions Compare revisions