jvm young generation

1 분 소요

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가 출동함.

  1. 생존 체크: Eden이랑 현재 쓰고 있는 Survivor(예: S0) 뒤져서 살아있는 놈만 골라냄.
  2. 이사(Copying): 살아남은 애들을 비어있는 다른 Survivor(S1)로 싹 옮김.
  3. 나이 측정: 옮겨갈 때마다 객체 이마에 나이(Age)를 1씩 적어줌. (Survivor 내에서도 죽는 놈들 속출함)
  4. 청소: 남은 쓰레기들은 통째로 삭제.

철칙: 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 영역으로 가는데, 이 밸런스 붕괴되면 서버 터짐.