본문 바로가기

GC

[GC] GC 시작하기 - 2(Old 영역)

Old 영역에 대한 GC

Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행한다. GC 방식에 따라 처리 절차가 달라지는데, JDK 7 기준으로 아래 5가지 방식이 있다.(JDK 9인가 10에 GC 알고리즘 관련 업데이트 된 내용이 있었다. 추후 조사해보자)

  • Serial GC
  • Parallel GC
  • Parallel Old GC(Parallel Compacting GC)
  • Concurrent Mark & Sweep GC(이하 CMS)
  • G1(Garbage First) GC

 

Serial GC

Old 영역의  GC는 mark-sweep-compact이라는 알고리즘을 사용한다. 이 알고리즘의 첫 단계는 Old 영역에 살아있는 객체를 식별(Mark)하는 것이다. 그 다음에는 힙(heap)의 앞 부분부터 확인하여, 살아있는것만 남긴다(Sweep). 마지막 단계에서는 각 객체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눈다(Compaction).

 

정리하면,

mark-sweep-compact 알고리즘

- mark : 살아있는 객체만 식별

- sweep : 힙의 앞 부분부터 확인하여 살아있는것만 남김

- compact : 객체 존재하는 부분, 존재하지 않는 부분으로 나눔

 

SerialGC는 싱글 스단드로 수행하기 때문에 적은 메모리와 CPU 코어 갯수가 적을 때 적합한 방식이다. 즉, CPU 코어가 하나만 있을 때 사용하기 위해 만든 방식이므로 운영서버에서는 절대 사용시 애플리케이션 성능이 많이 떨어지므로 절대 사용하지 않도록 한다.

 

Parallel GC

Parallel GC는 Serial GC와 기본적인 알고리즘은 같다. 그러나 Serial GC는 GC를 처리하는 스레드가 하나인 것에 비해, Parallel GC는 GC를 처리하는 쓰레드가 여러 개이다. 그렇기 때문에 Serial GC보다 빠르게 객체를 처리할 수 있다. Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 유리하다. Throughput GC라고도 부른다.

 

Parallel Old GC

Parallel Old GC는 JDK 5 update 6부터 제공한 GC 방식이다. 앞서 설명한 Parallel GC와 비교하여, Old 영역의 GC 알고리즘만 다르다. 이 방식은 mark-summary-compoaction 단계를 걸친다. Summary 단계는 앞서 GC를 수행한 영역에 대해서 별도로 살아있는 객체를 식별한다는 적에서 mark-sweep-compaction의 sweep 단계와 다르며, 약간 더 복잡한 단계를 거친다.

 

CMS GC

그림 1. CMS GC 알고리즘

1) Initial Mark 단계

 : stop-the-world pause 시작 -> 클래스 로더에서 가장 가까운 객체 중 살아있는 객체만 찾고 끝냄 -> stop-the-world pause 해제함

2) Concurrent Mark 단계

: 1)에서 표시한 객체에서 참조하고 있는 객체들을 따라가면서 확인함(stop-the-world pause 없음)  

3) Remark 단계

: stop-the-world pause 시작 -> 2)에서 추가 되거나 참조가 끊긴 객체 확인

4) Concurrent Sweep 단계

 : 쓰레기 정리(stop-the-world pause 없음)

 

특징

- Concurrent Mark 단계는, stop-the-world pause 작업 없이 별도의 스레드로 App이 실행중인 상태에서 동시에 진행

Concurrent Sweep 단계 또한 stop-the-world pause 작업 없이 동시에 진행됨.

- Compaction 단계가 기본적으로 제공되지 않음

 

장점

- 이로인해, stop-the-world 시간이 매우 짧음

- 모든 App의 응답속도가 매우 중요할 때 CMS GC를 사용하며, Low Latency GC 라고도 부른다

 

단점

- 다른 GC 방식보다, 메모리와 CPU를 더 많이 사용한다

- Compaction 단계가 없기 때문에, 조각난 메모리가 많아 Compaction 작업을 별도로 실행하면 다른 GC 방식의 stop-the-world 시간보다 compaction에 필요한 stop-the-world 시간이 더 길기 때문에 Compaction 작업이 얼마나 자주, 오랫동안 수행되는지 확인해야 함

 

G1 GC

그림 2. G1 GC의 레이아웃

G1 GC를 이해하려면 지금까지의 Young 영역과 Old 영역에 대해서는 잊는것이 좋다.

그림에서 보다시피, G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가 해당 영역이 꽉차면 다른 영역에 객체를 할당하고 GC를 실행한다. 즉, 지금까지 설명한 Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식이라고 이해하면 된다. G1 GC는 CMS GC를 대체하기 위해 만들어 졌다.

 

장점

- 지금까지 설명한 어떤 GC보다도 빠르다

 

단점

- 아직 안정화가 이루어지지 않았다.(JDK 6~7 시절에 쓰여진 단점이라 지금은 확인 필요함.)

 

최종 정리

GC 알고리즘 요약
Serial GC

mark-sweep-compact 알고리즘

- 싱글 스레드

- 싱글 스레드이므로, 운영 서버에 적합하지 않음(성능 안나옴)

Parallel GC

mark-sweep-compact 알고리즘

- 멀티 스레드

Throughput GC라고도 부름

Parallel Old GC

mark-summary-compoaction 알고리즘

- 사용하는 알고리즘이 다르다는것 외에는 Parallel GC와 동일

CMS GC

Initial Mark > Concurrent Mark > Remark > Concurrent Sweep

- stop-the-world pause 시간이 매우 짧음

Compaction 단계가 기본적으로 제공되지 않음 -> 메모리 단편화 심함 -> 결국엔 Compaction 진행 필요 -> 위 GC 수행시간보다, Compaction의 stop-the-world pause 시간 매우 많이 걸림

G1 GC

바둑판의 각 영역에 객체를 할당하고 GC를 실행

Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식

CMS GC를 대체하기 위해 만들어 졌음

'GC' 카테고리의 다른 글

[GC] GC 시작하기 - 1 (GC 과정, Minor GC)  (0) 2019.06.23