String 클래스는 문자열 클래스입니다. String 클래스 객체를 생성하는 아래와 같은 코드를 작성하면 조금 특이하게도

String hello = "world";

아래와 같은 방식으로 값을 찾습니다.

  1. String 값 “world” 가 String Constant Pool에 있는지 탐색
  2. 있다면 주소값 반환
  3. 없으면, String 클래스 내부의 native 메서드인 intern() 를 통해 String constant pool에 값 저장
  4. 주소값 반환

String Constant Pool 은 intern 된 문자열 정보를 저장하는 곳이며, GC 에서 얘기하는 Old 영역에서 살아남은 객체가 영원히 남아있는 곳은 아닙니다. 이 영역에서 GC가 발생할 수도 있는데, 여기서 GC가 발생해도 Major GC 의 횟수에 포함된다고 합니다.

스크린샷 2022-12-07 오후 4.28.21.png

이와같은 String 의 불변성(immutable) 으로인해, String 클래스는 불변이라고 불리며 메모리에 할당하는 new String(”world”) 와 같은 방식을 사용하지 않아도 됩니다. 만약 이와같이 생성자를 이용하는 경우, 똑같은 문자열이라도 서로 다른 메모리를 가리키기 때문에 동등비교인 == 연산시 true 를 반환하지 않습니다.

스크린샷 2023-03-09 오후 4.33.22.png

Java 버전에 따른 String Constant Pool