JVM Heap 메모리 구조 완벽 정리와 튜닝을 위한 기초 지식

지난 포스팅에서는 JIT 컴파일러가 어떻게 Java의 실행 속도를 끌어올리는지 알아보았습니다. 코드가 빠르게 실행되는 것도 중요하지만, 엔터프라이즈 환경에서 서버가 멈추지 않고 안정적으로 돌아가기 위해서는 ‘메모리 관리’가 필수적입니다.

Java 애플리케이션에서 OutOfMemoryError(OOM)가 발생하거나 원인 모를 서버 지연 현상이 나타날 때, 가장 먼저 들여다봐야 할 곳이 바로 JVM 힙(Heap) 메모리입니다. 이번 글에서는 객체들이 살아가고 소멸하는 무대인 힙 메모리의 세부 구조를 완벽하게 정리하고, 성능 튜닝을 위한 가장 기초적인 지식을 살펴보겠습니다.

1. JVM 힙(Heap) 메모리란 무엇인가?

JVM의 런타임 데이터 영역 중 힙(Heap)은 애플리케이션 실행 중 생성되는 모든 인스턴스(객체)와 배열이 동적으로 할당되는 공간입니다.

  • 스레드 간의 공유: 스택(Stack) 영역이 각 스레드마다 개별적으로 할당되는 것과 달리, 힙 영역은 JVM 내의 모든 스레드가 공유합니다. 따라서 동시성(Concurrency) 문제의 주된 발생지이기도 합니다.
  • 가비지 컬렉션(GC)의 주 무대: 우리가 new 키워드로 생성한 객체들은 모두 이곳에 쌓입니다. 사용이 끝난 쓰레기 객체들을 주기적으로 치워주는 가비지 컬렉션(Garbage Collection)이 일어나는 공간이 바로 이 힙 영역입니다.

2. 세대별(Generational) 힙 메모리 구조

자바 개발자들은 오랜 경험을 통해 한 가지 중요한 사실을 발견했습니다. 바로 “대부분의 객체는 생성된 지 얼마 되지 않아 쓰레기(Unreachable)가 된다”는 것입니다. 이를 ‘약한 세대 가설(Weak Generational Hypothesis)’이라고 부릅니다.

이 가설을 바탕으로 JVM은 힙 영역을 객체의 생존 기간(Age)에 따라 크게 두 가지 세대로 나누어 효율적으로 관리합니다.

  • Young Generation (젊은 세대): 새롭게 생성된 객체들이 처음으로 할당되는 영역입니다. 이 영역은 다시 하나의 Eden 공간과 두 개의 Survivor(0, 1) 공간으로 나뉩니다. 객체들은 Eden에 생성되었다가 살아남을 때마다 Survivor 영역으로 이동합니다. 이곳에서 가득 차서 발생하는 쓰레기 수집을 Minor GC라고 부르며, 매우 빠르고 빈번하게 일어납니다.
  • Old Generation (오래된 세대): Young Generation에서 여러 번의 Minor GC를 겪고도 살아남은 ‘오래된 객체’들이 최종적으로 이동(Promotion)하는 영역입니다. 오래 유지되는 캐시 데이터나 애플리케이션 수명과 함께하는 싱글톤 객체들이 이곳에 자리 잡습니다. 이 영역이 꽉 차서 발생하는 쓰레기 수집을 Major GC (또는 Full GC)라고 부르며, 이때 시스템 전체가 일시 정지하는 Stop-The-World 현상이 길게 발생해 성능 저하의 주범이 됩니다.

3. 메모리 튜닝을 위한 필수 JVM 옵션(Flag)

힙 메모리 구조를 이해했다면, 시스템 자원에 맞게 힙 사이즈를 조절하는 튜닝이 필요합니다. 실무에서 가장 기본적으로 설정하는 두 가지 JVM 옵션은 다음과 같습니다.

  • -Xms (Initial Heap Size): JVM이 시작될 때 운영체제로부터 최초로 할당받는 힙 메모리의 크기입니다.
  • -Xmx (Maximum Heap Size): JVM이 사용할 수 있는 최대 힙 메모리의 크기입니다.

💡 성능 최적화 팁: 프로덕션(운영) 환경에서는 -Xms-Xmx의 값을 동일하게 설정하는 것이 권장됩니다. 애플리케이션 실행 중에 힙 메모리가 부족해져 운영체제에 추가 메모리를 요청하고 할당받는 과정 자체가 막대한 시스템 리소스를 소모하고 멈춤 현상을 유발하기 때문입니다. 시작부터 최대치를 할당해 두면 이러한 오버헤드를 방지할 수 있습니다.

결론: GC 튜닝의 뼈대를 세우다

이번 포스팅을 통해 힙 메모리가 Young Generation과 Old Generation으로 나뉘어 있으며, 객체의 수명에 따라 관리된다는 점을 이해하셨을 것입니다. 힙 구조를 아는 것은 앞으로 다가올 가장 핵심적인 성능 개선 작업인 ‘GC(가비지 컬렉션) 튜닝’을 위한 필수 전제 조건입니다.

기초 개념 시리즈를 마무리하며, 다음 섹션부터는 본격적인 메모리 관리 기법을 다루겠습니다. 이어지는 포스팅에서는 힙 메모리 위에서 동작하는 ‘[6번] 가비지 컬렉션(GC)의 기본 원리와 세대별 메모리 관리 과정’에 대해 상세한 시나리오와 함께 알아보겠습니다.

댓글 남기기