자바에서 메모리를 이해하려면 힙 메모리(Heap Memory)와 문자열 상수 풀(String Constant Pool)의 역할과 차이를 정확히 알아야 합니다. 두 영역은 밀접하게 연관되어 있지만, 각각 다른 목적과 동작 방식을 가지고 있습니다.
힙 메모리(Heap Memory)란?
- 힙 메모리는 애플리케이션 실행 중 모든 자바 클래스 인스턴스와 배열에 필요한 메모리가 할당되는 런타임 데이터 영역입니다.
- 힙은 JVM이 시작될 때 생성되며, 애플리케이션이 실행되는 동안 객체 할당량에 따라 크기가 늘어나거나 줄어들 수 있습니다.
- 초기 힙 크기는
-XmsVM 옵션으로 지정할 수 있습니다. 가비지 컬렉션(GC) 전략에 따라 힙은 고정 크기 또는 가변 크기로 운영될 수 있습니다. - 최대 힙 크기는
-Xmx옵션으로 설정하며, 별도로 지정하지 않으면 기본 최대 힙 크기는 64MB입니다.
문자열 상수 풀(String Constant Pool)이란?
- String 클래스는 문자열 객체를 효율적으로 재사용하기 위해 '문자열 상수 풀'이라는 특별한 메모리 영역을 사용합니다.
new키워드 없이 리터럴 방식으로 생성된 String 객체(예:String s = "java";)는 힙 내부의 문자열 상수 풀 영역에 저장됩니다.- 문자열 상수 풀의 핵심 특징은, 풀에 이미 동일한 문자열 상수가 존재하면 새 객체를 만들지 않고 기존 객체를 그대로 재사용한다는 점입니다. 이를 통해 중복 객체 생성을 방지하고 메모리 사용을 최적화합니다.
두 영역의 관계와 차이점
문자열 상수 풀은 독립된 공간이라기보다 힙 메모리 안에 존재하는 특수한 영역으로 이해하는 것이 좋습니다. 반면 new 키워드로 생성한 String 객체는 상수 풀이 아닌 일반 힙 영역에 별도의 객체로 저장됩니다.
또한 intern() 메서드를 호출하면 힙에 있는 String 객체를 상수 풀의 동일한 리터럴과 연결하여 참조를 통일할 수 있습니다. 따라서 문자열 비교 시 == 연산자는 참조(주소)를 비교하므로 주의해야 하며, 값 자체를 비교하려면 반드시 equals() 메서드를 사용하는 것이 안전합니다.
정리
- 힙 메모리: JVM이 관리하는 런타임 데이터 영역으로, 모든 객체와 배열이 할당되는 공간 (-Xms/-Xmx로 크기 조절 가능)
- 문자열 상수 풀: 힙 내부에서 문자열 리터럴을 재사용하기 위한 특수 영역으로, 동일한 문자열의 중복 생성을 방지