- 메모리 관련 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역중에서 필요없게 된 영역을 자동으로 해제하는 기능
- 동적 할당된 메모리 영역 가운데 어떤 변수도 가리키지 않는 메모리 영역을 탐지하여 자동으로 해제한다.
- 객체가 null인 경우, 블럭안에 생성된 객체, 부모 객체가 null이 된 자식 객체 가 GC대상이 된다.
- Java, C#, 일부 스크립트 언어들은 GC 기법을 염두하며 설계됨
장점 | 단점 |
---|---|
이미 동적 할당된 메모리를 해제한 영역에 접근하게 되는 버그를 예방할 수 있다. | 어떤 메모리를 해제해야 할 지 결정해야할 때에 사용되는 알고리즘에 의해 시간과 비용이 든다. |
이미 해제된 메모리를 또 다시 해제하는 오류를 줄일 수 있다. | GC가 행동하는 타이밍이나, 점유시간을 사전에 예측하기 어렵기 때문에 실시간 시스템에는 적합하지 않다. |
더 이상 사용하지 않는 메모리 영역을 해제하지 않고 남겨진 것이 쌓이게 되는 메모리 누수 를 예방할 수 있다. |
단점으로 지적된 실시간 시스템 에서 사용된다면 치명적인 오류를 발생시킬 수 있다.
군사목적의 프로그래밍 중 비행시스템 등에서 실시간으로 목표물을 향해 날아가는 중간에 GC가 돟작한다면 알고리즘의 동작이 멈추어 목표물을 찾지 못하기 때문에 실시간 시스템에서 GC는 지양해야한다.
Heap영역은 크게 2가지로 나뉩니다. (Permanent Generation 제외)
-
Young Generation - 객체 사용이 짧은 객체들이 모여있는 곳
-
종류
-
Eden
-
Survivor 2개
-
-
새롭게 생성된 객체가 위치한다.
-
매우 많은 객체가 생성되었다가 사라지는 곳이다.
-
이 지역에서 객체가 사라지면, MinorGC 가 발생했다고 한다.
-
-
Old Generation (Tunured Space) - 오래 사용되는 객체들
- Young영역에서 살아남은 객체가 이 곳으로 복사된다.
- Young영역보다 메모리가 크게 할당되어 상대적으로 Young영역보다 상대적으로 GC는 적게 발생한다.
- 이 지역에서 객체가 사라지면 MajorGc (Full GC) 가 발생했다고 한다.
-
[Non-Heap] Permanent Generation (PermGen)
- 이 영역에서는 JVM에 의해서 사용되는 클래스와 메서드 객체 정보를 담고있다.
- JDK8부터 PermGendms Metaspace로 교체된다.
-
Minor GC, Major GC가 실패한다면 Full GC 가 발생할 수도 있다.
-
진행 과정
여러 연구를 진행한 결과 애플리케이션에서 객체가 생성되고 사라지는 패턴은 다음 2가지 특성은 가진다.
- 대부분의 생성된 객체는 금방 사용하지 않는다.
- 객체들은 대개 오랜시간동안 남아있지 않는다. (객체가 짧게 사용됨)
이러한 특성을 가지고 있어 Heap영역을 두 가지로 나누고, GC 알고리즘도 이에 기반하여 설계됨
각 영역마다 실행되는 GC는 다르다.
- Minor GC
- Young영역에서 발생
- 트리거 되는 시점 : Eden이 Full이 된 경우
- Major GC
- Old영역에서 발생
- 트리거 되는 시점 : Minor GC가 실패하는 경우
- Full GC
- Young Generation + Old Generation + MetaSpace(PermGen) 영역 (전체)
- 트리거 되는 시점 : Minor GC, Major GC가 실패하는 경우
- Serial
- Parallel
- Parallel Old (Parallel Compacting GC)
- Concurrent Mark & Sweep (CMS)
- G1 (Garage First)
- JDK 7u4부터 도입
- JDK9부터 기본 GC로 변경
ps) stop-the-world : GC에서 자주 사용되는 용어, GC를 실행하면 JVM이 애플리케이션 실행을 멈추는 현상
GC가 일어나면 GC를 실행하는 쓰레드를 제외한 모든 쓰레드를 정지시키기 때문이다. 이러한 경우엔 애플리케이션 성능에 많은 영향을 준다...
GC: 메모리에서 더 이상 사용하지 않는 영역(쓰레기)를 자동으로 처리해주는 기술 (매우 편리하지만 단점도 존재함)