가비지 컬렉터란?

이인아·2024년 8월 27일
0

java

목록 보기
12/16

가비지 컬렉터란?


  • 가비지 컬렉터란 C#이나 자바에서 메모리 관리를 자동화하여 개발자가 별도로 신경 쓰지 않아도 되게 해주는 시스템이다.

  • 만약 C,C++ 같이 가비지 컬렉터가 없는 언어에서는 어떤 인스턴스를 힙 영역에 할당하고 포인터 변수로 가르킬 때 이 포인터 변수가 다른 인스턴스를 가르키게 된다면 먼저 가르키고 있던 인스턴스에는 접근할 방법이 없어져 제거할수도 사용할수도 없는 메모리 누수가 발생한다.

  • 하지만 C#이나 자바에서는 다르다. 가비지 컬렉터가 힙 영역의 메모리를 주기적으로 검사하여 이런 메모리 누수를 자동으로 해제해주기 때문에 개발자는 메모리 관리에 대해서 덜 신경쓰면서 작업을 진행할 수 있다.


    가비지 컬렉터의 동작 원리


    Alt text

가비지 컬렉터가 동작하면, 다음과 같은 동작을 수행한다.

1. Garbage collector가 Stack의 모든 변수를 스켄하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹

2. Reachable Objec(리스트 안에 객체, 스택 → 힙(리스트) →힙(객체))가 참조하고 있는 객체도 찾아서 마킹 (1, 2 번을 Mark라 부름)

3. 마킹되지 않은 객체를 Heap에서 제거 (Sweep이라 부름)

4. compact를 하는 GC라면, 단편화 된 메모리를 정리


가비지 컬렉터의 비용


  • 실행 시간의 오버헤드 : 가비지 컬렉터는 런타임 중에 메모리를 검사하고, 사용하지 않는 메모리를 해제하는 작업을 수행하기 떄문에 성능에 영향을 미칠 수 있습니다.

  • 메모리 오버헤드 : 가비지 컬렉터가 메모리를 효율적으로 관리하기 위해서는 추가적인 메모리가 필요해 메모리 사용량이 증가할 수 있습니다.


가비지 컬렉터의 단점


  • 예측 불가능한 정지 시간 : 대규모의 힙 메모리를 사용하는 경우 가비지 컬렉터의 실행동안 다른 부분이 일시 중지될 수 있습니다.

  • 자원의 해제 시점 : 메모리가 언제 해제될지 항상 예측할 수 없기 때문에, 즉시 해제해야 하는 경우 문제가 생길 수 있습니다.

  • 리소스 관리 : 가비지 컬렉터는 힙에 할당된 인스턴스의 메모리는 해제하지만 해당 인스턴스가 가진 외부 리소스까지는 해제해 주지 않습니다.

그래서 리소스 관리가 필요한 경우에는 따로 Finalize나 IDisposable를 사용해서 리소스를 해제 해주어야 됩니다.


참조 링크 : youtube

0개의 댓글