1. 개요
IBM Java(JVM)의 GC 정책 옵션을 정리한 글이다. IBM J9/OpenJ9 계열 JVM에서는 보통 -Xgcpolicy:<정책명> 형식으로 GC 정책을 지정한다.
GC 정책은 애플리케이션의 처리량, 응답 시간, 힙 크기, 실시간성 요구 사항에 따라 선택해야 한다. 아래 내용은 각 정책의 특징을 간단히 비교하기 위한 요약이다.
2. gencon
- Generational Concurrent의 약자이다.
- 일반적인 서버 애플리케이션에서 널리 사용하는 세대별 GC 정책이다.
- 힙을 주로 짧게 살아남는 객체 영역과 오래 살아남는 객체 영역으로 나누어 관리하며, 동시성 작업을 통해 긴 정지 시간을 줄이는 것을 목표로 한다.
3. balanced
- 64비트 환경에서만 사용할 수 있으며, 4GB 이상의 힙 메모리를 사용할 때 권장된다.
- 힙을 region이라고 하는 동일한 크기의 영역으로 나누어 사용한다. Region은 수천 개까지 늘어날 수 있다.
- 전체 힙을 한 번에 처리하기보다 region 단위로 관리해 큰 힙에서의 GC 정지 시간을 완화하는 데 초점을 둔다.
4. metronome
- 실시간 처리에 유리한 GC 정책이다.
- GC 스레드의 수는
-Xgcthreads옵션으로 설정할 수 있다. - Alarm 스레드의 수는 변경할 수 없다. 단 1개만 사용한다.
- 짧고 예측 가능한 pause time이 중요한 환경에서 고려할 수 있다.
5. optavgpause
- Optimize for average pause time을 의미한다.
- Concurrent mark와 Concurrent sweep 단계를 사용한다.
optthruput보다 pause time이 짧은 편이다. 하지만 그 반대로 처리량은 다소 떨어질 수 있다.
6. subpool
- 현재는 더 이상 사용되지 않는다.
optthruput과 동일하다고 보면 된다.
7. optthruput
- Optimize for throughput을 의미한다.
- 애플리케이션 처리량을 우선하는 GC 정책이다.
- GC가 동작하는 동안 애플리케이션 스레드가 비교적 길게 멈출 수 있으므로, 짧은 응답 시간이 중요한 서비스보다는 배치 작업처럼 처리량이 중요한 환경에 더 적합하다.
8. 확인 방법
실제로 어떤 GC 정책이 적용되었는지는 JVM 시작 옵션과 GC 로그를 함께 확인하는 것이 좋다. 예를 들어 옵션을 명시할 때는 다음과 같은 형식을 사용한다.
-Xgcpolicy:gencon
운영 환경에서는 단순히 정책 이름만 보고 결정하기보다, 동일한 부하 조건에서 GC 로그의 pause time, 전체 처리량, 힙 사용량 변화를 비교해 선택하는 것이 안전하다.