GC (Garbage Collector) - .net(CLR)

Mark·2022년 2월 13일
0

GC

목록 보기
1/2

학습목표

  • .net garbage collector의 개념특징을 설명할 수 있다.

Garbage Collector(이하 GC)란?

한마디로 표현하자면 자동 메모리 관리라고 말할 수 있습니다.

  • C, C++와 같은 언어는 메모리를 개발자가 관리 해줘야 했지만,
    C#, Java와 같은 언어는 GC가 메모리를 자동으로 관리해 줌으로써
    개발자는 컴퓨터가 무한한 메모리를 가진 것처럼 개발을 할 수 있게 되었다.

  • CLR(Common Language Runtime)이 자동 메모리 관리(Automatic Memory Management)기능을 제공하며 자동 메모리 관리의 중심에는 GC가 있다.

.net GC 과정을 좀 더 자세하게 표현하자면 아래와 같이 설명할 수 있습니다.

1) .net Application이 실행되면 넓은 메모리 공간을 확보하여 관리되고 있는 힙(Managed Heap)을 마련합니다.

2) JIT(Just-In-Time) 컴파일러가 *루트(Root)들을 목록으로 만듭니다.

3) CLR은 루트 목록을 관리하며 상태를 갱신합니다.

4) CLR이 관리하던 루트 목록을 참조하여 GC 실행

개념을 도식화 해보면


GC의 특징

Managed Heap Memory는 3개의(0,1,2) 세대(generation)로 구성되어 있으며,
각각 수명이 다른 다양한 객체를 적절하게 관리하고자 3개의 세대로 분리했습니다.

note) 그림으로 Flow 설명하기

2세대의 Garbage Collection을 Full GC라고 합니다.
0세대의 GC가 수행될 경우 1세대와 2세대의 GC는 이루어지지 않습니다.
1세대의 GC가 수행될 경우 0세대는 GC가 이루어지지만 2세대는 GC가 이루어지지 않습니다.
2세대의 GC가 수행될 경우 0,1 세대 모두 GC가 이루어집니다.

Full GC가 이루어지면 CLR은 Application의 실행을 멈추고 메모리를 확보하려고 합니다.
Full GC의 시간이 길어질 수록 Applcation의 중지시간도 길어지기 때문에 객체가 빨리 소멸할 수 있도록 프로그래밍 해야합니다.

CLR의 GC 매커니즘을 근거한 효율적인 코드 가이드

너무 복작한 참조 관계를 만들지 마세요.

  • GC 이후 살아남은 객체의 세대를 옮길 때 각 필드 객체 간 참조 관계를 일일이 조사해서 참조하고있는 메모리 주소를 전부 수정하기 때문에 많은 비용이 발생하므로 복잡한 참조 관계는 지양합시다.

너무 큰 객체 할당을 피하세요.

  • CLR은 85KB 이상의 대형 객체를 할당하기 위한 LOH(Large Object Heap)이 따로 존재합니다.
    SOH(Small Object Heap)는 해제된 메모리 공간을 정리하지만, LOH는 메모리를 복사하는 비용이 더들기 때문에 해제된 공간을 그대로 방치하므로 공간적인 효율성이 떨어집니다.
    또한 CLR은 LOH를 2세대 Heap으로 간주하기 때문에 GC가 수행되면 Application의 중지를 불러옵니다.

Reference

profile
지적인 힘이 부족하면 나의 불행을 확대 해석한다. 지적인 힘을 기르자!

0개의 댓글