본문 바로가기

Java/Java

(JAVA) Interning of String in JAVA

String Interning은 각각의 구별되는 String 값(반드시 Immutable 해야 한다.)의 복사본 하나만 저장하는 기법이다.
intern() 메서드를 사용함으로써 똑같은 값을 가지는 문자열은 같은 메모리를 공유한다는것을 보장받을 수 있다.

JAVA 7 이전 버전 기준

그림으로 도식화 하자면 이러한 방식으로 흘러간다.

 

 

이러한 방식은 우리의 프로그램의 메모리 사용을 줄여주는데 효과적이다.

그러나 주의해야할 점이 있다. 그러한 캐시 방식은 힙 메모리 영역과 비교했을 때

크기가 제한된 JVM (PERGEN 영역)에 의해 관리되므로 중복 값이 너무 많지 않은겨우 intern() 메서드를 사용하지 말아야 한다.

또한 가장 치명적인 단점은 GC에 의해 관리되어지지 않는다는 점이다. 

  • OOM 발생 가능성이 커진다.

(JAVA 7이전 버전 기준)


JAVA 7 버전 기준

JAVA 7 버번에는 String pooling 로직에 대대적인 혁신이 일어났다.
String Pool이 Heap 메모리 영역으로 옮겨졌다는 것이다.

 

JAVA8 버전부터는 PERGEN 영역이 아예 없어진다. - Native 영역으로 이동 Metaspace 영역으로 대체

 

 

https://johngrib.github.io/wiki/java8-why-permgen-removed/

 

JDK 8에서 Perm 영역은 왜 삭제됐을까

 

johngrib.github.io

 

이것이 시사하는 바는 크게 두 가지이다.

  1. 더 이상 별도의 고정된 크기의 메모리 영역에 의해 제한받지 않아도 된다.
  2. GC의 관리를 받지 않은 PERGEN 영역에서 GC의 관리를 받는 힙 영역으로 옮겨졌다는 것을 의미한다.

 

우리의 프로그램에서 String의 값을 참조하는 것이 없어진다면 GC가 사용하지 않는 것으로 판명하여 해당 String을 제거한다.

또한 튜닝을 통하여 힙 메모리 영역의 크기를 관리할 수 도 있다.

 

이미 선언된 문자열 값이 있다면 선언된 것을 참조하기 때문에 메모리를 절약할 수 있고 해당 문자열이 사용되지 않는다면 GC에 의해 소멸되고 훨씬 더 좋아졌다고 볼 수 있다.

References

https://www.geeksforgeeks.org/interning-of-string/

 

Interning of String in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.baeldung.com/java-string-pool

 

Guide to Java String Pool | Baeldung

Learn how the JVM optimizes the amount of memory allocated to String storage in the Java String Pool.

www.baeldung.com

 

http://java-performance.info/string-intern-in-java-6-7-8/

 

String.intern in Java 6, 7 and 8 - string pooling  - Java Performance Tuning Guide

This article will describe how String.intern method was implemented in Java 6 and what changes were made in it in Java 7 and Java 8.

java-performance.info

https://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang-string-intern

 

Is it good practice to use java.lang.String.intern()?

The Javadoc about String.intern() doesn't give much detail. (In a nutshell: It returns a canonical representation of the string, allowing interned strings to be compared using ==) When would I use...

stackoverflow.com