GC;Garbage Collection 이란?
자바의 메모리 관리 방법 중의 하나
JVM의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스
*JVM 메모리 영역에서 Heap 영역은 객체가 생성되어 저장되는 공간이다.
(new 키워드로 생성된 객체들이 저장됨)
- 다른 영역
- Method 영역
→ 클래스 정보 저장공간
- Stack 영역
→ 메서드 실행 시 사용되는 공간(지역변수, 호출정보 등)
[장점]
→ Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있음
→ 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에 대해 관리하지 않아도 되어 오로지 개발에만 집장할 수 있음
*C/C++에서는 이런게 없어서 개발자가 수동으로 메모리 할당과 해제를 해줘야 했었음
*파이썬, 자바스크립트, Go 등에도 가비지 컬렉션이 기본 내장 되어있음
→ 가비지 컬렉션에 대해 제대로 학습하면, 자바 외의 다른 언어의 가비지 컬렉션 동작에 대해서도 어느정도 통달
[단점]
자동으로 처리해준다 해도 메모리가 언제 해제되는지 정확하게 알 수 없어서 제어하기 힘듦
가비지 컬렉션이 동작하는 동안, 다른 동작을 멈추기 때문에 오버헤드가 발생됨
*오버헤드 : 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간이나 메모리 등
⇒ 이를 Stop-The-World 라고 함
STW;Stop-The-World
GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상
GC가 동작하는 동안 GC관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있음 ⇒ 이 시간을 최소화 시키는게 중요함
⇒ 따라서 GC가 너무 자주 실행되는것도 소프트웨어 성능 하락을 초래할 수 있음
ex) exploler은 GC를 너무 자주 실행시켜 성능에 문제를 일으키는 것으로 악명 높았음
⇒ 실시간 동작이 중요한 프로그램은 GC사용이 부적절 할 수 있음
따라서 개발자가 애플리케이션 사용성을 유지하며 효율적으로 GC를 실행하는 최적화 작업을 해줘야함
⇒ 이를 GC 튜닝이라 한다.
GC는 어떻게 힙 영역을 관리하나요?
모든 객체는 처음에 Young Generation에 생성된다.
*Young Generation의 공간은 Old Generation에 비해 상대적으로 좁기 때문에 빠르게 메모리 상의 객체를 찾고 제거할 수 있다. (Young Generation에서 발생되는 GC를 Minor GC라고 한다)
1-1. 정확히는 Young Generation에서 Eden 영역에 위치하게 된다.
1-2. 객체가 계속 생성되어 Eden 영역이 꽉 차게 되면 Minor GC가 실행된다.
1-2-1. Mark 동작을 통해 reachable 객체를 탐색한다.
1-2-2. Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동한다.
1-2-3. Eden 영역에서 사용되지 않는 객체(unreachable)의 메모리를 해제(sweep)한다.
1-3. 살아남은 모든 객체들의 age(Survivor 영역에서 살아남은 횟수)값이 1씩 증가한다.
*만약 age값이 임계값에 다다르면 Promotion(Old 영역으로 이동) 여부를 결정한다.
1-1, 1-2, 1-3 과정이 반복됨.
Old Generation은 길게 살아남(age 임계값 도달)은 메모리들이 존재하는 공간이다.
객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 Major GC(Full GC)가 발생한다.
⇒ Old 영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한꺼번에 삭제함
⇒ 하지만 공간이 Young Generation에 비해 크기 때문에 메모리 상의 객체 제거에 많은 시간이 걸림
*Young Generation에서는 GC가 0.5-1초 사이에 끝나서 애플리케이션에 크게 영향을 안주지만,
Old Generation에서는 Young Generation GC에 비해 10배 이상의 시간을 사용함
⇒ 이때 STW 문제가 발생하게된다!!
⇒ Major GC가 일어나면 Thread가 멈추고 Mark and Sweep 작업을 하느라 CPU에 부하를 주기 때문에 멈추거나 버벅이는 현상이 일어난다.