String Constant Pool, feat. Runtime Constant Pool

2024. 11. 2. 00:24·💻 Dev/Java & OOP
목차
  1. String Constant Pool이란?
  2. String Constant Pool과 Runtime Constant Pool
  3. Runtime Constant Pool
  4. 왜 영역이 다른가?

      
String str = "hello";
String str2 = "hello";
System.out.println(str == str2); // true

위 코드에서 str == str2의 결과는 뭘까?

동등성과 동일성을 배웠다면 false로 예상했겠지만 결과는 true다.

 

"어라 자바에서 객체는 ==이 아니라 .equals()로 비교해야 문자열 비교가 되는 거 아니었나?"

그 이유는 JVM이 String Pool을 사용하기 때문이다.

 

String Constant Pool이란?

우선 Contant Pool이란 클래스 내에 사용되는 상수들을 담아놓은공간이다.

클래스 파일(.class)안에 테이블 형태로 들어가 있다.

 

이 Constant Pool에서 문자열 리터럴만을 별도로 관리하는 공간이 String Pool(String Constant Pool)이다.


      
String str = "hello";

str을 리터럴로 선언하게 되면 JVM은 String Pool이라는 곳에 "hello" 값과 동일한 문자열이 있는지 확인한다. 존재하지 않으면 String pool에 새롭게 추가한다.


      
String str = "hello";
String str2 = "hello";

이어 "hello"라는 값을 가진 문자열을 리터럴로 다시 생성하면 String Pool에 저장되어 있던 "hello"객체를 참조하여 재사용한다. (str2 = str1;)


      
String str3 = new ("hello"); // 별도의 Heap 메모리에 저장

하지만 new 키워드를 사용하면, 같은 문자열이라도 항상 새로운 객체가 힙(heap) 메모리에 생성된다.

 

때문에 문자열을 사용할 때는 메모리 관점에서 리터럴로 생성하는 게 좋다.

 

또 동적으로 생성되는 문자열(DB에서 조회해 오는 String, 파일에서 읽어 들인 String)의 경우에도 String Pool에 저장되지 않는다.

그러므로 동일한 문자열이어도 == 로 비교하면 결과는 false가 나오므로 문자열 비교를 위해서는 equals(동등연산)으로 비교해야 한다.

 

Java 7 버전부터 String Pool이 Method 영역에서 Heap 영역 내부로 옮겨지게 되면서 String pool에서도 GC가 수행되게 되어 메모리 부족 오류 위험 또한 줄어들게 되었다. 이로 인해 String Constant Pool은 Runtime에서 많은 양의 String 객체를 생성하게 되더라도 효율적인 메모리 관리가 가능해졌다.

 

String Constant Pool과 Runtime Constant Pool

String Constant Pool은 힙 영역, Runtime Constant Pool은 메서드 영역에 저장된다고 알고 있었다.
String Constant Pool은 Runtime Constant Pool의 하위 개념인데 왜 둘의 저장 위치가 다를까?라는 궁금증이 생겼다. (GC 공부하다가 왜 여기까지 나왔는지 모르겠지만)

 

Runtime Constant Pool

자바에서 Runtime Constant Pool은 클래스의 정적 데이터(클래스 메타데이터) 즉,
클래스 및 메서드 레벨의 다양한 상수(숫자 상수, 메서드 참조, 필드 참조 등)를 저장하는 곳이다.
각 클래스와 인터페이스마다 고유의 Runtime Constant Pool이 존재하며, JVM은 이를 통해 클래스 로드, 메서드 호출, 필드 접근 등의 작업을 수행한다.

 

왜 영역이 다른가?

 

Runtime Constant Pool

런타임 상수 풀은 메서드 영역(Java 7까지는 PermGen, Java 8부터는 Metaspace)에 저장된다.
런타임 상수 풀은 클래스별로 존재하는데, 클래스 및 인터페이스의 상수 뿐만 아니라 메서드와 필드에 대한 모든 레퍼런스에 대한 정보를 가지고 있다.

 

String Constant Pool

String 객체는 기존 객체를 재사용하지 않고 생성할 때마다 새로운 객체가 생성되는 불변 객체이다.

보통 문자열은 동적으로 생성되는 경우가 많고, 필요하지 않은 문자열을 가비지 컬렉션을 통해 정리할 수 있기 때문에 문자열 상수 풀을 힙 영역에 따로 두고 재사용하는 것이다.

 

 

 

요약하자면!

String Constant Pool은 Runtime Constant Pool의 논리적 하위 개념이지만, JVM의 메모리 관리 최적화를 위해 물리적으로 서로 다른 영역에 저장된다!

 

 

 

 

참고
런타임 데이터 영역(Runtime Data Area)에 대해

저작자표시 비영리 (새창열림)

'💻 Dev > Java & OOP' 카테고리의 다른 글

JDK 8에서 Perm 영역이 삭제된 이유  (0) 2024.11.25
가비지 컬렉터(GC) feat.힙 영역  (0) 2024.11.23
자바는 Call by Value만 사용한다.  (0) 2024.11.22
BigDecimal이란?  (0) 2024.10.30
Immutable(불변성), StringBuffer와 StringBuilder  (0) 2024.10.29
자바 코드의 메모리 영역(스택&힙)  (0) 2024.10.29
  1. String Constant Pool이란?
  2. String Constant Pool과 Runtime Constant Pool
  3. Runtime Constant Pool
  4. 왜 영역이 다른가?
'💻 Dev/Java & OOP' 카테고리의 다른 글
  • 가비지 컬렉터(GC) feat.힙 영역
  • 자바는 Call by Value만 사용한다.
  • BigDecimal이란?
  • Immutable(불변성), StringBuffer와 StringBuilder
현주먹
현주먹
대구 불주먹 출신 현주먹의 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (176)
      • 👶🏻 CS (15)
        • Operating System (7)
        • DB (5)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • DB&JPA (6)
        • Test Code (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (71)
        • 후기 및 회고 (10)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
        • 📖 가상 면접 사례로 배우는 대규모 시스템 설계 .. (9)
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL repository
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 태그

    백준
    오블완
    데브클럽
    티스토리챌린지
    TDD 클린 코드 with Java
    C
    99클럽
    NextSTEP
    에프랩 후기
    개구리책
    jsp 2.3 웹 프로그래밍: 기초부터 중급까지
    til
    JPA
    2025스프링캠프
    자바의정석
    코딩테스트준비
    에프랩
    항해99
    자바의신절판
    f-lab 후기
    개발자멘토링
    ==와 equals()
    오라클
    코테스터디
    로또 미션
    객체지향
    인프런 특정문자뒤집기
    jsp
    개발자취업
    F-Lab
  • hELLO· Designed By정상우.v4.10.2
현주먹
String Constant Pool, feat. Runtime Constant Pool

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.