jvm young generation
Overview
지난 포스트에서 Heap, Stack, Metaspace 다뤘음. 이번엔 Heap 상세 구조 파헤치기. 왜 Heap이 제일 중요하냐? GC(청소부)가 하루 종일 여기서 쓰레기 줍고 다니기 때문임. 서버 느려지는 원인 90%는 여기서 나옴. 그중에서도 앞마당인 Young Generation을 알아보겠음.
Young 영역 구조
Heap은 크게 Young(신입)이랑 Old(고인물)로 나뉨. Young 영역은 다시 세 칸으로 쪼개짐.
- Eden (신생아실):
new로 객체 만들면 무조건 여기로 들어옴. 근데 98%는 금방 죽어서 사라짐. - Survivor 0 / 1 (생존자 대기실): Eden에서 안 죽고 살아남은 ‘운 좋은’ 애들이 잠시 머무는 곳임.
한 줄 요약: 태어나면 Eden, 한 번이라도 살아남으면 Survivor.
Minor GC 동작 (청소 주기)
Eden 영역이 꽉 차면? Minor GC가 출동함.
- 생존 체크: Eden이랑 현재 쓰고 있는 Survivor(예: S0) 뒤져서 살아있는 놈만 골라냄.
- 이사(Copying): 살아남은 애들을 비어있는 다른 Survivor(S1)로 싹 옮김.
- 나이 측정: 옮겨갈 때마다 객체 이마에 나이(Age)를 1씩 적어줌. (Survivor 내에서도 죽는 놈들 속출함)
- 청소: 남은 쓰레기들은 통째로 삭제.
철칙: Survivor 0이랑 1 중 한 곳은 반드시 비어 있어야 함. 한쪽으로 싹 몰아넣어야 메모리 중간중간 구멍 뚫리는 ‘파편화’가 안 생김.
Promotion (경로당으로 이사)
Survivor 사이를 퐁당퐁당 이사 다니며 끈질기게 살아남아 15살(기본값)을 먹었다?
“아 님은 여기서 놀 짬이 아니네요. 큰 물로 가십쇼.”
하면서 Old 영역으로 보내버리는데 이걸 Promotion(승격)이라고 함. 오래 살 놈들은 따로 모아서 가끔만 청소하겠다는 전략임.
실무에서 터지는 이유
이거 튜닝 잘못하면 서버 나락 감.
- Eden이 너무 작으면?
- 청소부(GC)가 너무 자주 옴. 서버가 찔끔찔끔 자꾸 멈춤.
- Survivor가 너무 작으면?
- 애들이 15살도 안 됐는데 자리 없어서 Old 영역으로 강제 이사감.
- 그럼 Old 영역 꽉 차서 Full GC(진짜 큰 청소) 터짐.
- 결과: 서버 멈춤.
3줄 요약
- 객체는 Eden에서 태어나고, Minor GC 때마다 오디션 봄.
- 살아남으면 Survivor 0, 1 번갈아 이사 가며 나이(Age) 먹음.
- 짬 차면 Old 영역으로 가는데, 이 밸런스 붕괴되면 서버 터짐.