Garbage Collection – 1부

1. GC(Garbage Collection)

응용 프로그램의 메모리 부족을 방지하려면 더 이상 필요하지 않은 Java 힙의 개체를 회수해야 합니다.

이 프로세스를 가비지 수집 (GC)이라고 합니다.

일반적으로 GC 프로세스의 첫 번째 단계는 연결할 수 있는 개체를 표시 하는 것인데,

이는 개체가 여전히 사용 중임을 의미합니다.

다음 단계는 표시되지 않은 개체를 제거하여 메모리를 회수하는 것입니다 .

마지막 단계는 힙이 심하게 조각난 경우 힙 을 압축 하는 것입니다.



1.1 GC 주기

GC 주기는 일련의 GC 작업을 포함하는 반복 가능한 프로세스입니다.

이러한 작업은 Java 힙의 전체 또는 일부를 처리합니다.

전체 Java 힙에서 작동할 때 이 주기를 전역 GC 주기 라고 합니다 .

힙의 일부에서 작동할 때 이 주기를 부분 GC 주기 라고 합니다 .



1.1.1 전역 GC

전역 GC 주기는 다음 규칙에 따라 명시적으로 또는 암시적으로 트리거될 수 있습니다.

  • 할당 실패 또는 과세 임계값 도달 과 같은 내부 메커니즘으로 인해 발생하는 경우 글로벌 GC 주기가 암시적으로 트리거됩니다 .
  • System.gc()전역 GC 주기는 애플리케이션 호출에 의해 직접 시작 되거나 힙 덤프를 요청할 때와 같이 간접적으로 시작되는 경우 명시적으로 트리거됩니다 .



1.1.2 부분 GC

부분 GC 주기는 특정 GC 정책의 제어 하에서만 암시적으로 트리거됩니다.

GC 프로세스는 응용 프로그램의 개입 없이 작동하도록 설계되었습니다.

예를 들어 System.gc()를 호출 하여 주기를 트리거하거나 종료자를 사용하여 메모리에서 개체를

정리하는 방법으로 개발자는 GC 동작을 예측하려고 해서는 안 됩니다 .

이러한 작업은 응용 프로그램의 성능을 저하시킬 수 있습니다.



2. GC의 원리

GC 작업을 하는 가비지 콜렉터(Garbage Collector)는 다음의 역할을 합니다.

  1. 메모리 할당
  2. 사용중인 메모리 인식
  3. 사용하지 않는 메모리 인식

  • 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 한다면 OOM 발생.
  • 메모리 영역을 인식하지 못하면 hang 걸림.



* JVM 메모리 구조

Hotspot Heap Structure

자바는 크게 3가지의 메모리영역으로 구분됩니다

  • Young : 생성된지 얼마 안된 객체들이 저장되는 장소로 2개의 공간으로 나뉨.
  • eden : 새로운 키워드 메모리를 할당하여 객체를 생성할 때
  • survivor space : Eden space에서 자바 가비지 컬렉션 이후에 살아남은 객체를 담고 있는 풀
  • Old : Young Generation의 가비지 수집 이후에 살아남은 개체를 보유
  • Perm : 응용 프로그램에서 사용되는 클래스와 메서드를 설명하기 위해 JVM이 필요로 하는 메타데이터가 포함되며 Major GC 영역.



3. GC의 종류

GC는 수행되는 영역에 따라 Minor GC 와 Major GC(Full GC) 로 구분.



3.1 Minor GC

New/Young 영역의 GC를 Minor GC라고 부릅니다.

Eden 영역은 자바 객체가 생성되자마자 저장되는 곳으로,

생성된 객체는 Minor GC가 발생할 때 Survivor 영역으로 이동됩니다.

위 그림처럼 Survivor 영역은 Survivor1과 Survivor2로 나뉘는데

Minor GC가 발생하면 Eden과 Survivor1에 활성 객체를 Survivor2로 복사합니다.

그리고 활성이 아닌 객체는 자연히 Survivor1에 남아있게 되고, Survivor1과 Eden 영역을 클리어합니다.

다음번 Minor GC가 발생하면 같은 원리로 Eden과 Survivor2 영역에서 활성 객체를 Survivor1으로 복사한합니다.

계속 이런 방법을 반복적으로 수행하면서 Survivor 영역에서 오래된 객체는 Old 영역으로 옮기게 됩니다.

이런 방식을 Copy & Scavenge라고 하며, 속도가 매우 빠르고 작은 크기의 메모리를 콜렉팅하는데 아주 효과적입니다.

  • Minor GC는 자주 일어나기 때문에 걸리는 시간이 짧은 알고리즘이 적합합니다.



3.2 Major GC(Full GC)

Old 영역의 가비지 콜렉션을 Major GC라고 합니다.

Major GC에 사용되는 알고리즘은 Mark-sweep-compact 라는 알고리즘입니다.

이 알고리즘은 전체 객체들의 참조를 확인하면서 참조가 연결되지 않은 객체를 표시합니다.

이 작업이 끝나면 사용되지 않는 객체를 모두 표시하고 이 표시된 객체를 삭제합니다.

Major GC는 속도가 매우 느리며, Major GC가 일어나는 도중에는 순간적으로 자바

애플리케이션이 멈춰 버리기 때문에 애플리케이션의 성능과 안정성에 아주 큰 영향을 줍니다.

GC 종류 Minor GC Major GC
대상 Young Generation Old Generation
실행 시점 Eden 영역이 꽉 찬 경우 Old 영역이 꽉 찬 경우
실행 속도 빠르다 느리다

  • Mark-sweep-compact 알고리즘
  • Old 영역으로 이동된 객체들 중 살아 있는 객체를 식별. (Mark)
  • Old 영역의 객체들을 훑는 작업을 수행하여 쓰레기 객체를 식별. (Sweep)
  • 필요 없는 객체들을 지우고 살아 있는 객체들을 한 곳으로 수집 (Compact)

  • Stop The World

Garbage Collection는 Garbage Collector가 Heap 영역의 메모리를 JVM이 판단해 더이상 사용되지 않는 인스턴스는 자동으로 할당 된 메모리를 삭제하는 역할을 하는 행위입니다.

메모리를 복사하고 해제 하는 행위를 실행 하기 위해서는 자바 어플리케이션은 GC를 실행하기 위한 Thread를 제외하고 이외의 모든 Thread는 멈추고 GC가 완료된 이후에나 다시 Thread가 실행 상태로 돌아가게 됩니다.

이와 같이 이외의 모든 Thread의 작업이 멈추는 상태를 Stop The World라고 하고 모든 GC 알고리즘은 Stop The World 상태에 부딪히게 됩니다.

GC 튜닝이라고 하면 이와 같은 Thread의 작업이 멈추는 시간을 최소한으로 줄이는 행위라고 보면 됩니다.

참고사이트

Leave a Comment