Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 힙 메모리와 문자열 상수 풀(String Constant Pool)의 차이점 완벽 정리

자바에서 메모리를 이해하려면 힙 메모리(Heap Memory)문자열 상수 풀(String Constant Pool)의 역할과 차이를 정확히 알아야 합니다. 두 영역은 밀접하게 연관되어 있지만, 각각 다른 목적과 동작 방식을 가지고 있습니다.

힙 메모리(Heap Memory)란?

  • 힙 메모리는 애플리케이션 실행 중 모든 자바 클래스 인스턴스와 배열에 필요한 메모리가 할당되는 런타임 데이터 영역입니다.
  • 힙은 JVM이 시작될 때 생성되며, 애플리케이션이 실행되는 동안 객체 할당량에 따라 크기가 늘어나거나 줄어들 수 있습니다.
  • 초기 힙 크기는 -Xms VM 옵션으로 지정할 수 있습니다. 가비지 컬렉션(GC) 전략에 따라 힙은 고정 크기 또는 가변 크기로 운영될 수 있습니다.
  • 최대 힙 크기는 -Xmx 옵션으로 설정하며, 별도로 지정하지 않으면 기본 최대 힙 크기는 64MB입니다.

문자열 상수 풀(String Constant Pool)이란?

  • String 클래스는 문자열 객체를 효율적으로 재사용하기 위해 '문자열 상수 풀'이라는 특별한 메모리 영역을 사용합니다.
  • new 키워드 없이 리터럴 방식으로 생성된 String 객체(예: String s = "java";)는 힙 내부의 문자열 상수 풀 영역에 저장됩니다.
  • 문자열 상수 풀의 핵심 특징은, 풀에 이미 동일한 문자열 상수가 존재하면 새 객체를 만들지 않고 기존 객체를 그대로 재사용한다는 점입니다. 이를 통해 중복 객체 생성을 방지하고 메모리 사용을 최적화합니다.

두 영역의 관계와 차이점

문자열 상수 풀은 독립된 공간이라기보다 힙 메모리 안에 존재하는 특수한 영역으로 이해하는 것이 좋습니다. 반면 new 키워드로 생성한 String 객체는 상수 풀이 아닌 일반 힙 영역에 별도의 객체로 저장됩니다.

또한 intern() 메서드를 호출하면 힙에 있는 String 객체를 상수 풀의 동일한 리터럴과 연결하여 참조를 통일할 수 있습니다. 따라서 문자열 비교 시 == 연산자는 참조(주소)를 비교하므로 주의해야 하며, 값 자체를 비교하려면 반드시 equals() 메서드를 사용하는 것이 안전합니다.

정리

  • 힙 메모리: JVM이 관리하는 런타임 데이터 영역으로, 모든 객체와 배열이 할당되는 공간 (-Xms/-Xmx로 크기 조절 가능)
  • 문자열 상수 풀: 힙 내부에서 문자열 리터럴을 재사용하기 위한 특수 영역으로, 동일한 문자열의 중복 생성을 방지