기술면접

자바에서 가비지 컬렉션(GC)의 원리를 설명해주세요.

yeeeon89 2024. 5. 5. 11:55

- 자바에서 가비지 컬렉션(GC)은 프로그램이 동적으로 할당한 메모리 중에서 더 이상 사용되지 않는 부분을 자동으로 찾아서 해제하는 메커니즘입니다.  이 과정은 메모리 누수를 방지하고, 프로그램의 안정성을 유지하는 데 도움을 줍니다.  

 

가비지 컬렉션의 기본 원리는 '도달 가능성(Reachability)' 분석입니다. 특정 객체가 '도달 가능한' 상태라는 것은 프로그램의 루트 집합(Root Set)에서 출발하여 참조를 따라갔을 때 도달할수 있는 객체를 의미합니다.  루트 집합에는 지역변수, 활성 스레드, 정적 변수 등이 포함됩니다.  GC는 이러한 루트 집합으로부터 시작하여 참조되는 객체들을 추적하고, 추적되지 않는 객체들을가비지로 판단하여 메모리를 회수합니다.  

 

자바에서는 주로 마크-스위프트(Mark-Sweep), 카피(Copy), 그리고 세대별(Generational) 수집 같은 다양한 컬렉션 알고리즘을 사용합니다. 세대별 수집 알고리즘은 객체의 생명주기를 기반으로 메모리를 관리하는데, 대부분의 객체는 생성된 후 짧은 시간 내에 소멸한다는 가설 하에 설계되었습니다. 이를 통해 효율적으로 메모리를 관리하고, 애플리케이션의 성능을 최적화 합니다.

 

 

 

자바컬렉션(GC)의 대표적인 문제점

  •  개발자가 메모리가 언제 해제되었는지 정확하게 알 수 없다
  • 가비지 컬렉션(GC) 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
  • GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다. 

 

 

 

Minor GC 와 Major GC

JVM의 Heap 영역은 처음 설계될 때 다음의 2가지를 전제로 설계되었다.

  • 대부분의 객체는 금방 접근 불가능한 상태가 된다.
  • 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.

 

즉, 객체는 대부분 일회성이며 메모리에 오랫동안 남아있는 경우가 드물다.

 

 

Minor GC

  • 새롭게 생성된 객체가 할당(Allocation) 되는 영역이다.
  • 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
  • Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다.

MajorGC

  • Young 영역에서 Reachable 상태를 유지하며 살아남은 객체가 복사되는영역이다.  
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큰 가비지는 적게 발생된다.
  • Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC라고 부른다. 

 

가비지 컬렉션 소멸 대상 선정 방법 

 

객체가 Garbage인지를 판단하기 위해 Rechability라는 개념을 사용한다.

어떠한 힙 영역에 할당된 객체가 유효한 참조가 있으면 rechability, 없다면 unrechability로 판단한다.

 

(최초에 참고한 것을 Root Set이라고 칭한다. )