내부적으로 String#intern 메서드를 호출하면서 해당문자열이 String Constant Pool에 존재하는지 확인 후 존재하면 그 주소값을 반환하고, 아니라면 String Constant Pool에 넣고 새로운 주소값을 반환합니다. Item6의 핵심인 불필요한 객체 생성을 피하기 위한 옵션 입니다.
String Constants Pool에 저장하고 사용하는 것을 String Interning 라고 합니다.
검증
s.intern()에서 s와 동등(equals)한 값이 Pool에 있다면 해당 주소를, 없다면 생성한 주소를 반환하는데 이미 변수 b 선언으로 pool에 값이 있어서 b==c는 true라는 결과가 나옵니다.
@DisplayName("이미 Pool에 값이 있다면 같은 주소를 바라본다.")
@Test
public void test2_1(){
String s = new String("aaa");
String b = "aaa";
String c = s.intern();
assertThat(b == c);
}
String Constant Pool 위치 변경
Java 버전에 따라 영역의 특징에 따라 String Constant Pool의 위치가 변경됐다고 합니다.
Java 6이전
Perm(Permenent Generation) 영역에 존재.
Perm은 사이즈가 고정돼있어서 Runtime에 사이즈를 확장할 수 없음. 즉, 너무 많은 String을 생성하면 OOM이 발생함.
Java7부터
Heap 메모리 영역으로 이전.
고정된 메모리 사이즈 때문에 걱정할 일 없음. Heap 사이즈 조절 시 String Constant Pool도 함께 조절됨.
또한 Heap 영역으로 변경함으로써 String Constant Pool의 모든 문자열이 GC의 대상이 될 수 있음.
@kimhanui 코멘트
불필요한 문자열 인스턴스 생성을 피하기 위한 영역
내부적으로
String#intern
메서드를 호출하면서 해당문자열이String Constant Pool
에 존재하는지 확인 후 존재하면 그 주소값을 반환하고, 아니라면String Constant Pool
에 넣고 새로운 주소값을 반환합니다.Item6
의 핵심인불필요한 객체 생성을 피하기 위한
옵션 입니다.검증
s.intern()
에서 s와 동등(equals)한 값이 Pool에 있다면 해당 주소를, 없다면 생성한 주소를 반환하는데 이미 변수 b 선언으로 pool에 값이 있어서b==c는 true
라는 결과가 나옵니다.String Constant Pool
위치 변경Java 버전에 따라 영역의 특징에 따라 String Constant Pool의 위치가 변경됐다고 합니다. Java 6이전
Java7부터
참고
https://starkying.tistory.com/entry/what-is-java-string-pool https://bbchu.tistory.com/13