문자열 JAVA에서의 저장공간

JAVA에서는 스택과 힙 공간이 JVM의 일부입니다. 스택 공간에는 수명이 짧은 특정 값이 포함되고 힙 공간에는 JAVA 객체 및 JRE 클래스가 포함됩니다.

문자열은 힙 영역에 저장됩니다.

String은 클래스이고 JAVA의 문자열은 객체로 취급되므로 String 클래스의 객체는 힙에 저장됩니다.

문자열을 만드는 방법은 2가지가 있습니다.

  1. 문자열 리터널
  2. new 키워드를 사용

문자열 리터널은 "를 이용한 방법입니다.

String s = "hello wolrd"

JVM은 문자열 상수풀을 확인합니다. 문자열이 없으면 새 문자열 인스턴스가 생성되고 풀에 배치됩니다. 동일한 문자열이 있으면 새 개체를 생성하지 않고 동일한 인스턴스에 대한 참조를 반환합니다.

이러한 문자열 인스턴스를 저장하는 캐시를 문자열 상수풀이라고 합니다.

JDK 6까지는 문자열 풀이 PermGen 공간 내에 있었지만 JDK 7 이후부터 힙 영역으로 이동되었습니다.

new를 이용한 객체 생성은 새로운 참조가 생성됩니다.

문자열 풀이 PermGen에서 힙 영역으로 이동한 이유

PermGen 공간은 64MB에 불과합니다. 그리고 PermGen 공간에 문자열 객체를 너무 많이 생성하고 저장하는 문제가 있었습니다. 그래서 문자열 풀이 더 큰 힙 영역으로 이동되었습니다. JAVA에서는 메모리 효율성을 높이기 위해 문자열 리터널 개념이 사용됩니다.