ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CS] Unmanaged Language VS Managed Language
    CS 2023. 5. 8. 10:08

    1. Unmanaged Language VS Managed Language

    • UnManaged Language
    TestA(){
    	class* a = new class()
    }
    • 힙 영역에 잡혀진 메모리를 직접 관리 가능
    • 블록문 벗어났을 때 수동으로 지우지 않으면 메모리가 남아 있는다.

     

    • Managed Language
    TestB(){
    	class b = new class();
    }
    • 힙 영역에 잡혀진 메모리가 Garbage Collector에서 자동으로 관리
    • 블록문 벗어나면 메모리가 남아 있지만 GC가 감지한다.

     

    • 스택 영역은 Managed / UnManaged 다 동일한 방식으로 구현
    TestC(){
    	class c;
    }
    • 블록문 벗어나면 알아서 해제가 된다.
    • 힙 영역은 런 타임에 크기가 결정됨 - 사용자의 동적 할당
    • 스택 영역은 컴파일 타임에 크기가 결정됨 - 지역 변수 / 매개 변수

     

    2. UnManaged Language의 예시와 동작 원리

    • 자기가 힙에 생성한 메모리는 프로그램 내에서 반드시 자신이 삭제해야 한다. (UnManaged Language)⇒ 메모리를 delete하지 않으면 누수가 발생하게 되고, 메모리 누적이 App 자체에 할당된 Heap 메모리를 넘어가면 그 유명한 out of memory! 라는 문구와 함께 App 사망
    • ⇒ A와 B가 동일한 메모리를 가리키고 있으면 하나를 지운 경우에 다른 하나가 접근 시 crush 발생
    Class* A = new Class();
    Class* B = new ClasS();
    B = A; // B 메모리에 접근 할 수 없어 지울 수 없기 때문에 문제 발생!
    => code 빌드 후 실행

     

    3. Managed Language의 예시와 동작 원리

    • 쓰여진 코드를 byte code로 변호나 후 VM이 실행 가능한 모든 OS에서 동작 가능하게 만든 중간 단계 머신 ex) Java : 자바 가상 머신 (JVM), C#: 공통언어런타임(CLR)
    • B가 기존에 가지고 있던 메모리 주소를 잃어버리면 VM내부의 Garbage Collector가 그 주소를 보관하고 있다가 일정 시간이 지나면 자동으로 삭제한다.
    • 자기가 힙에 생성한 메모리는 특별히 지우지 않더라도 블록이 지나가면 알아서 삭제된다.
    Class* A = new Class();
    Class* B = new ClasS();
    B = A; // B 메모리에 접근 할 수 없어 지울 수 없기 때문에 문제 발생!
    => code 빌드 후 실행

     

     

    4. 결론

    구현에 필요한 환경과 용도에 따라 적절한 언어를 선택하는 것이 중요

    Compact한 메모리 관리가 필요하고 빠른 연산이 필요한 경우 Unmanaged Language가 적합

    메모리 제약이 크지 않고, 대용량 서비스를 안정성 있게 다루ㅏ어야 하는 경우 Managed Language가 적합

    두 언어들의 차이에 대한 올바른 사용 경험이 있다면, 개발자로 성장하는 데 큰 도움이 될 것!

     

     

     

     

     

     

Designed by Tistory.