J-S-08 자바 성능의 핵심 JVM 힙 영역과 GC 동작 원리

글 정보
카테고리
Programming/Java/Starter
태그
JavaLevel2

1. JVM, GC 그리고 객체

JVM이 관리하는 메모리 영역 중, 애플리케이션 성능에 가장 지대한 영향을 미치는 곳은 단연 힙(Heap) 영역입니다.

우리가 new 키워드로 생성하는 대부분의 객체가 이곳에 저장되기 때문입니다.

이 거대한 힙 영역을 효율적으로 관리하기 위해 JVM은 가비지 컬렉터(GC) 를 고용했습니다.

GC는 더 이상 사용되지 않는 객체를 찾아내고 지우는 역할을 수행합니다.

그렇다면 GC는 어떤 기준으로 메모리를 관리할까요? 여기서 등장하는 것이 바로 '세대 단위 컬렉션 이론'입니다.

2. 세대 단위 컬렉션 이론

GC는 모든 객체를 동일하게 취급하지 않습니다.

효율적인 관리를 위해 객체의 생존 주기에 관한 몇 가지 가설을 전제로 설계되었습니다.

이러한 가설은 실제 통계로도 증명되었습니다. IBM의 연구에 따르면, 일반적으로 첫 번째 GC 수행 시 약 98%의 객체가 소멸한다고 합니다. HotspotVM은 이 점을 착안하여 Eden 영역과 Survivor 영역의 비율을 8:1:1로 설계했습니다.

3. Heap 영역의 상세 구조

힙 영역은 객체의 생존 기간에 따라 크게 Young Generation과 Old Generation으로 나뉩니다.

3-1. Young Generation (젊은 세대)

생명 주기가 짧은 객체들이 머무는 곳입니다.

3-2. Old Generation (오래된 세대)

Young Generation에서 오랫동안 살아남은 객체들이 이동해 오는 영역입니다.

3-3. Permanent & Metaspace (메타 정보 영역)

4. JVM 메모리 옵션 가이드

서버를 운영할 때 자주 보게 되는 JVM 옵션들을 정리했습니다. 각 옵션이 서로 겹치거나 충돌할 때 우선순위가 적용될 수 있으니 주의가 필요합니다.

운영 팁: 헬스 체크와 STW 서버의 상태를 확인하는 L4/L7 스위치의 헬스 체크(Health Check)가 실패하는 경우가 있습니다.
만약 힙 메모리 사용량을 기준으로 헬스 체크를 하거나, Full GC로 인해 Stop The World(STW, 모든 작업 중단) 시간이 길어지면, 서버는 멀쩡히 살아있음에도 불구하고 '응답 없음'으로 간주되어 서비스에서 제외될 수 있습니다.
GC 튜닝 시 이 점을 꼭 고려해야 합니다.

5. 대표적인 GC 알고리즘의 진화

GC는 역사가 깊은 만큼 다양한 알고리즘으로 발전해 왔습니다.

5-1. Mark and Sweep (표시하고 쓸어담기)

1960년대에 제안된 가장 기초적인 방식입니다.

5-2. Mark and Copy (표시하고 복사하기)

Mark and Sweep의 파편화 문제를 해결하기 위해 1969년 로버트 페니첼이 제안했습니다.

5-3. Mark and Compact (표시하고 압축하기)

Old Generation 처럼 객체가 많이 살아남는 영역을 위해 1974년 에드워드 루더스가 제안했습니다.