[Heap] JVM의 String과 String Pool(String Constant Pool) 알아보기 : String Pool은 어떻게 String을 최적화 하는가? - Kotlin 예제 포함

2021. 3. 1. 10:10· Machine/JVM
목차
  1. 목표
  2. 개요
  3. 예시
반응형

목표

  • String이 Heap 메모리 상에서 어떻게 저장되는지 확인한다.

개요

JVM에서 변수를 저장하게 선언하면 해당 변수는 Heap Area에 저장된다(그림1 참조). String도 Heap Area에 저장되는 것은 마찬가지인데 String은 많이 쓰이는 변수인 만큼 조금 특이한 방식으로 저장된다.

*이것에 익숙하지 않다면 먼저  JVM의 메모리 사용 방식을 보고 오자

그림1. JVM에서 변수의 저장

 

String은 우리가 가장 많이 쓰는 클래스 중 하나이다. String을 효율적으로 사용하기 위해 JVM상에서 String을 다른 객체들과 차별되게 저장되도록 해놓았는데, 그것이 바로 Heap Area 상의 String Constant Pool이다. 

 

예를 들어 다음과 같은 코드가 실행된다고 해보자

val stringA1 = "A"
val stringA2 = "A"
val stringKotlin = "Kotlin World"

위 변수들은 Heap Area에 다음과 같이 저장된다.

그림2. String Constant Pool

 String Constant Pool은 플라이웨이트 패턴을 구현한 대표적인 예로 한 번 저장한 변수를 다시 저장하지 않도록 만들어졌다. 따라서 String을 ""을 이용하여 선언할 경우 먼저 String Constant Pool에 해당 변수가 있는지 확인 후 있으면 기존 값을 참조하도록 주소값을 설정하고, 아니라면 새로운 String은 String Constant Pool에 넣는다. 이러한 과정을 통해 String은 JVM 상에서 매우 효율적으로 동작할 수 있다.

 

 그렇다면, 다른 변수들 처럼 String Constant Pool 바깥에 String을 저장할 수 있는 방법은 없을까? 당연히 있다. ""가 아니라 String 생성자를 이용하여 String을 생성할 경우 Constant Pool 바깥에 생성된다.

val stringABC1 = String(charArrayOf('A','B','C'))

그림3. String 생성자로 String 생성

이렇게 될 경우 더이상 String Constant Pool에 String이 없으므로 같은 String을 생성하더라도 참조되지 않는다.

val stringABC1 = String(charArrayOf('A','B','C'))
val stringABC2 = "ABC"

그림4. String 생성자로 생성과 ""로 생성 차이

 


예시

 Kotlin을 이용해 위를 확인하는 방법은 간단하다. ==와 ===을 이용해 알아보는 것이다. ==는 같은 hashCode 값을 같고 있는지 비교하는 것이고, ===는 같은 주소값을 가지고 있는지 비교하는 것이다. (Java와 다르니 혼동하지 말자)

val stringA1 = "A"
val stringA2 = "A"

stringA1 == stringA2 // true
stringA1 === stringA2 // true

val stringABC1 = String(charArrayOf('A','B','C'))
val stringABC2 = "ABC"

stringABC1 == stringABC2 // true
stringABC1 === stringABC2 // false

위를 보면 ==는 equals연산이 수행되어 hashCode() 값을 비교하여 같은 값을 가질 경우 true를 반환하며 ===는 같은 주소값을 가지는지 여부이므로 stringA1과 stringA2만 true를 반환하고, stringABC1,stringABC2는 false를 반환한다.

그림5. String == & === 비교

 

반응형
  1. 목표
  2. 개요
  3. 예시


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'Machine/JVM' 카테고리의 다른 글
  • JConsole을 활용한 Java Process Code Cache 모니터링
  • 코드 캐시(Code Cache) 사이즈 조정을 통한 JVM 최적화
  • JVM의 JIT(Just In Time Compilation) 컴파일이란? C1, C2 컴파일러를 이용한 최적화
  • [메모리] JVM의 메모리 사용 방식 : JVM의 Static Area와 Heap Area를 중심으로 Kotlin/JVM의 메모리 사용방식을 이해하기
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • java
  • github
  • 코루틴
  • flow
  • kotlin spring
  • Kotlin
  • dagger2
  • Unit Testing
  • GIT
  • github actions
  • compose
  • 유닛 테스팅
  • 코틀린
  • Dependency Injection
  • 안드로이드
  • Class
  • 스프링
  • Android Compose
  • junit
  • Coroutine
  • Jetpack Compose
  • GraphQL
  • Android
  • junit5
  • 의존성 주입
  • Spring boot
  • HTTP
  • gradle
  • Spring
  • junit4

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
[Heap] JVM의 String과 String Pool(String Constant Pool) 알아보기 : String Pool은 어떻게 String을 최적화 하는가? - Kotlin 예제 포함
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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