-
[JVM] 가비지 컬렉터와 메모리 할당 전략 (2) - 클래식 가비지 컬렉터DevBook/JVM 밑바닥까지 파헤치기 2025. 3. 18. 00:23
클래식 가비지 컬렉터
*신세대용
1. 시리얼 컬렉터
- 가장 기초적이고 오래된 컬렉터, JDK 1.3.1 전까지 핫스팟 가상 머신의 구세대용 컬렉터로는 유일한 선택지였음
- '단일 스레드'로 동작
- 하나의 GC 스레드가 모두 처리한다.
- GC가 시작되면 '회수가 완료될 때까지 다른 모든 작업 스레드가 멈춰 있어야 한다'
- 특징
- 시리얼 컬렉터는 최신 JDK에서도 꾸준히 지원하고 있음
- 다른 컬렉터의 단일 스레드 알고리즘보다 간단하고 효율적이라는 이점이 있음
- 가용 메모리가 적은 환경에서는 알고리즘 자체가 요구하는 메모리 사용량이 가장 적음
- 단일 코어 프로세서 또는 코어 수가 적은 환경이라면 시리얼 컬렉터는 스레드 상호 작용에 의한 오버헤드가 없음
- -XX:+UseSerialGC 매개변수 추가하여 사용 가능
시리얼 컬렉터: 신세대 GC, 시리얼 올드 컬렉터: 구세대 GC 2. 파뉴 컬렉터
- 여러 스레드를 활용해 시리얼 컬렉터를 병렬화한 버전
- 메모리 회수에 멀티스레드를 이용한다는 점만 제외하면 나머지는 시리얼 컬렉터와 완전히 같음
- 컬렉터 제어용 매개변수(-XX:SurvivorRatio, -XX:PretenureSizeThreshold 등), 컬렉션 알고리즘, 스톱 더 월드, 객체 할당 규칙, 회수 전략 등
- 단일 코어 프로세서에서는 시리얼 컬렉터보다 성능이 떨어짐
- 참고
- JDK 7 전까지의 시스템들에서 신세대용 컬렉터로 인기가 높았음
- 시리얼 컬렉터를 제외하고 CMS 컬렉터와 조합하여 사용할 수 있는 유일한 컬렉터였기 때문
- G1 컬렉터의 등장으로 파뉴는 CMS에 통합됨
- G1 가비지 컬렉터가 등장하여 CMS를 밀어내고 계승자가 되었음
- G1은 힙 전체를 대상으로 하는 컬렉터여서 더는 신세대용 컬렉터와 협력할 필요가 없게 됨
- G1이 모든 컬렉터를 완벽히 대체하기를 원했기 때문에, '파뉴+시리얼 올드' 조합과 '시리얼+CMS' 조합을 지원하지 않게 됨
- G1 가비지 컬렉터가 등장하여 CMS를 밀어내고 계승자가 되었음
- JDK 7 전까지의 시스템들에서 신세대용 컬렉터로 인기가 높았음
추가) 병렬과 동시
더보기- 병렬(parallel) : GC 스레드들 사이의 관계 설명
- GC 스레드 다수가 동시에 함께 작업을 수행한다는 뜻
- 이때 사용자 스레드는 정지 상태
- 동시(concurrent) : GC 스레드와 사용자 스레드 사이의 관계 설명
- GC 스레드와 사용자 스레드가 동시에 일을 진행한다는 뜻
- 사용자 스레드가 멈춰 있지 않아서 어플리케이션은 서비스 요청에 여전히 응답할 수 있음
- GC 스레드가 시스템 자원 일부를 점유하므로 어플리케이션 처리량은 평소보다 낮아질 수 있음
3. 패러렐 스캐빈지 컬렉터 (PS 컬렉터)
- 신세대용 컬렉터
- mark-copy 알고리즘에 기초하며 여러 스레드를 이용해 병렬로 회수하는 등 파뉴 컬렉터와 유사함
- 처리량을 제어하는 게 목표
- CMS 같은 컬렉터는 GC 동안 사용자 스레드의 일시 정지 시간을 최소로 줄이는 데 집중함
- 처리량이란?
- 프로세서가 사용자 코드를 실행하는 데 사용하는 시간과 프로세서가 소비하는 총 시간의 비율
- 처리량 = 사용자 코드 실행 시간 / (사용자 코드 실행 시간 + 가비지 컬렉터 실행 시간)
- ex) 가상 머신이 일을 완료하기까지 사용자 코드와 GC에 쓴 시간이 총 100분
- 이때 GC에 1분이 소요되었다면, 처리량은 99%가 됨
관련 매개변수
더보기- -XX:MaxGCPauseMillis
- 정지 시간의 최대값 지정 (0보다 큰 값 설정)
- 컬렉터는 메모리 회수에 소요되는 시간이 이 설정값을 넘지 않도록 함
- 주의)
- 해당 값을 작게 설정한다고 해서 시스템의 GC가 무조건 빨라지는 것은 아님
- GC로 인한 정지 시간을 줄이면 처리량이 낮아지고, 신세대의 크기가 더 작게 할당됨
- 500MB 메모리보다 300MB 메모리를 회수하는 쪽이 빠르듯이 신세대의 크기가 작아야지 줄어든 정지 시간 내 수행 가능함
- 용량이 줄어든 만큼 더 자주 회수해야 함
- 따라서 정지 시간은 줄었지만 처리량 역시 줄어드는 것
- -XX:GCTimeRatio
- 어플리케이션의 총 실행 시간에 대한 GC 시간의 비율
- 해당 값이 N이라면, 가비지 컬렉터가 사용자 코드 실행 시간의 1/(1+N) 이상 소비하지 않게 해달라는 뜻
- 기본값 99
- -XX:+UseAdaptiveSizePolicy
- 일종의 스위치 매개변수로, 해당 매개변수를 켜면 신세대의 크기(-Xmn), 에덴과 생존자 공간의 비율(-XX:SurvivorRatio), 구세대로 옮겨갈 객체의 크기(-XX:PretenureSizeThreshold) 등 세부 설정용 매개변수들을 일일이 지정하지 않아도 됨
- 가상 머신이 성능 모니터링 정보를 수집하여 최적의 정지 시간과 최대 처리량을 제공할 수 있도록 모든 매개변수의 값을 동적으로 조율해줌
- 힙의 최대 크기를 지정하는 -Xmx 같은 기본적인 메모리 정보만 설정해 두고, 최대 정지 시간(-XX:MaxGCPauseMillis)이나 처리량(-XX:GCTimeRatio)에 대한 목표만 설정하면 됨
- PS 컬렉터를 파뉴 컬렉터와 차별화하는 중요한 특성
*구세대용
1. 시리얼 올드 컬렉터
- 시리얼 컬렉터의 구세대용 버전
- 단일 스레드 컬렉터이며 mark-compact 알고리즘 사용
2. 페러렐 올드 컬렉터
- PS 컬렉터의 구세대용 버전
- 멀티스레드를 이용한 병렬 회수를 지원하며 mark-compact 알고리즘을 기초로 구현됨
- 처리량이 중요하거나 프로세서 자원이 부족한 상황이라면 PS와 페러렐 올드 조합을 고려해보자
- -XX:+UseParallelGC 매개변수 지정하여 사용
'DevBook > JVM 밑바닥까지 파헤치기' 카테고리의 다른 글
[JVM] 가상 머신 실행 서브시스템 (1) - 클래스 파일 구조 (0) 2025.03.29 [JVM] 가비지 컬렉터와 메모리 할당 전략 - 메모리 할당과 회수 전략 (0) 2025.03.27 [JVM] 가비지 컬렉터와 메모리 할당 전략 (2) - 클래식 가비지 컬렉터 > G1 GC (0) 2025.03.18 [JVM] 가비지 컬렉터와 메모리 할당 전략 (1) - 기본 알고리즘 (0) 2025.03.17 [JVM] 자동 메모리 관리 - 자바 메모리 영역과 메모리 오버플로우 (1) 2025.03.15