GC(Garbage Collection), Native Code vs Managed Code

2019. 9. 9. 17:12Programming/C++

Native Code vs Managed Code

  • Native Code: OS에 의해 직접적으로 컴파일 되는 코드(기계어로 동작)
    -> 작성한 코드 그대로 컴퓨터에서 구동
    -> Native한 환경(프로그래머가 직접 메모리 할당/해제)을 갖는 Code
    -> ex. C, C++

  • Managed Code: 인터프리터가 반드시 요구하는 코드
    -> java vm(virtual machine) 이나 .net framework같은 인터프리터가 필요한 코드
    -> Garbage Collection이 메모리를 알아서 Manage 해줌
    -> ex. C#, Java

 


 

Garbage Collection (가비지 컬렉션)

  1. 정의

    : GC라고 쓰며, 메모리 관리 기법 중하나로, 프로그램이 동적으로 할당했던 메모리 영역중에서 필요없어지는 영역을 해제하는 기능

    위에 언급한 것 처럼 네이티브코드는 대체적으로 수동메모리관리를 가성하고 설계되었고, 자바 및 C#같은 매니지코드는 GC를 염두에 두고 설계되어 이미 포함되어있다.

 

  1. 장점

  • 프로그래머가 동적할당한 메모리영역의 전체를 완벽하게 관리하지 않아도 되어, 유효하지 않은 접근/ 이중해제/ 메모리 누수와 같은 버그를 줄이거나 완전히 막을 수 있음.
    • 유효하지 않은 접근(Invalid access) : 이미 해제된 메모리에 접근하는 버그(포인터 해제 -> 새로운 값 할당 -> 잘못된 값 읽어옴 ㅠㅠ)
    • 이중 해제 : 이미 해제된 메모리를 또 다시 해제하는 오류(C에서 free()로 해제 후 다시 free()를 하면 정상종료되지 않음)
    • 메모리 누수(Memory lack) : 더 이상 사용하지 않는 메모리 영역을 해제하지 않고 남겨진것이 쌓여, 누수가 일어남
  1. 단점

  • 어떤 메모리를 해제할지 결정하는데 비용이 듦.(프로그래머가 마음대로 해제하기 어려움이 있고, GC알고리즘이 메모리 해제하는 시점을 추적해야함 -> 오버헤드)
    • 오버헤드: 어떤 처리를 하기 위해 들어가는 간접적인 처리시간/메모리 ex. 처리하는데 필요한 10초 + 안정성 처리 5초(오버헤드) = 완전한 결과 처리 시간 15초
  1. 포인트 추적 방식

    : 대부분의 GC가 사용하는 방식

    한개이상의 변수가 접근 가능한 메모리는 앞으로 사용할 수 있는 메모리로 간주하고, 그 밖의 메모리를 해제하는 방식