Java

[Java] String Constant Pool & String.intern()

DH_0518 2024. 4. 6. 01:16

 

String Constant Pool

 

String Constant Pool은 이전 글에서 짧게 다룬 적이 있다

 

 

[Java] 문자열 클래스

String Class String 클래스의 구조 String은 문자열을 내부적으로 byte[]로 저장한다. JDK 9 이전에는 char[], JDK 9부터는 메모리 효율성을 위해 byte[]로 저장하게 되었다 // String.class (Java 8) public final class Stri

kdh0518.tistory.com

 

Java에서 문자열 리터럴(그 자체로 값을 나타내는 표현)을 저장하는 독립된 영역을 'String Constant Pool'이라고 한다. 스트링 상수 풀의 특징은 다음과 같다.

 

String Constant Pool

  • 문자열 리터럴 인스턴스를 중복없이 저장하고, 동일한 문자열 리터럴이 호출되면 미리 저장해둔 인스턴스를 반환해준다
    • 이를 통해 문자열의 불변성을 유지하고 메모리 사용을 최적화 할 수 있다
  • String Constant Pool에 문자열이 저장되는 조건
    • 소스코드에 리터럴로 문자열을 선언한 경우
    • String 객체에 intern() 메서드를 사용한 경우
    • 동적으로 생성되는 문자열(소스코드로 선언한 것이 아닌, ORM이나 MyBatis 등으로 DB나 File 등 외부에서 읽어 들이는 String)은 대상이 아니다
  • Heap 영역에 위치한다
    • Java 6까지는 Perm 영역에 위치했는데, Perm 영역은 고정된 사이즈이고 메모리 관리가 불가능해서 OutOfMemoryException을 발생시킬 수 있다
    • 따라서 Java7부터 SCP의 위치가 Heap 영역으로 변경되었고, 참조되지 않는 인스턴스의 경우 GC의 대상이 되기에 효율적인 메모리 관리가 가능해졌다
  • Heap 영역에 위치하지만, Runtime Constant Pool에서 참조되고있는 인스턴스라면 GC의 대상이 되지 않는다
  • 문자열 리터럴을 저장하는 공간이기에 new를 사용해서 String 객체를 생성하면 저장되지 않고, 같은 값이더라도 다른 객체로 간주된다.
  • New로 생성한 String 객체의 경우 intern() 메서드를 통해서 String Constant Pool에 강제로 넣을 수 있고, 이후에는 값이 같다면 같은 객체로 간주한다

https://deveric.tistory.com/123

 

 

 

 

 

String.intern()

 

 

그렇다면 이전 글에서 간단하게 소개만 하고 넘어간 intern() 메서드에 대해서 더 자세하게 알아보자

 

intern

  • SCP(StringConstantPool)에서 특정 문자열을 조회하여 동일한 인스턴스가 존재하는 경우 반환, 아닌 경우 SCP에 문자열을 등록하고 반환하는 메서드, 혹은 이러한 과정 자체를 이르는 말이다
  • 동일한 문자열인지를 비교할때는 equals 메서드를 사용한다(객체비교)
  • Runtime Constant Pool과 관련 없이 intern()된 객체들은 GC의 대상이다
  • intern()을 사용해서 강제로 SCP에 등록하기 위해서는, 객체를 생성해야하고 SCP 전체를 조회해야한다.
    • 따라서 객체를 생성하고, 런타임시에 SCP 전체를 조회하며 하나씩 equals를 수행하는 과정에서 오버헤드가 발생한다
      (리터럴 문자열은 컴파일 과정에서 이미 SCP에 등록되기 때문에 intern과 다르게 오버헤드가 발생하지 않는다)
    • 결국 성능적으로 이득이 없거나 이득이 있더라도 다른 컴파일러 최적화를 통해 달성되기에 intern()은 잘 사용되지 않는다

new로 선언한 String 객체를 강제로 SCP에 넣어줌으로써 메모리를 절약할 수 있다고 생각할 수 있지만, 결국 오버헤드 때문에 성능 저하가 발생할 수 있으므로 되도록 지양하는 것이 좋다

 

 

 

 

 

 

 

 

 

Reference

 

Interned String in Java | 👨🏻‍💻 Tech Interview

Interned String in Java 자바(Java)의 문자열(String)은 불변(immutable)하다. String의 함수를 호출을 하면 해당 객체를 직접 수정하는 것이 아니라, 함수의 결과로 해당 객체가 아닌 다른 객체를 반환한다. 그

gyoogle.dev

 

[Java] 많이 헷갈려하는 String constant pool과 Runtime Constant pool, Class file constant pool

String Constant Pool과 Constant Pool 이 두 가지는 완전히 다른 개념입니다. 용어가 비슷한 형태이기 때문에 이 두 가지를 혼용하여 헷갈리는 경우가 많습니다만, 저장되는 위치부터 저장하는 데이터의

deveric.tistory.com

 

Java의 String.intern() 살펴보기 - Increment

며칠 전에 String 클래스 문서를 정리하면서 intern 메서드에 관해 짧게 다룬 적이 있었습니다. 그 후에 실제로 intern 메서드가 어떻게 동작하는 지 궁금해서 짧게나마 찾아본 내용을 정리해봅니다.

www.latera.kr

 

String.intern()

String은 두 가지 생성 방식이 있고 각각의 차이점이 존재한다.new 연산자를 이용한 방식리터럴을 이용한 방식두 가지 방식에는 큰 차이점이 있다. new를 통해 String을 생성하면 Heap 영역에 존재하게

velog.io