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/
이것이 시사하는 바는 크게 두 가지이다.
- 더 이상 별도의 고정된 크기의 메모리 영역에 의해 제한받지 않아도 된다.
- GC의 관리를 받지 않은 PERGEN 영역에서 GC의 관리를 받는 힙 영역으로 옮겨졌다는 것을 의미한다.
우리의 프로그램에서 String의 값을 참조하는 것이 없어진다면 GC가 사용하지 않는 것으로 판명하여 해당 String을 제거한다.
또한 튜닝을 통하여 힙 메모리 영역의 크기를 관리할 수 도 있다.
이미 선언된 문자열 값이 있다면 선언된 것을 참조하기 때문에 메모리를 절약할 수 있고 해당 문자열이 사용되지 않는다면 GC에 의해 소멸되고 훨씬 더 좋아졌다고 볼 수 있다.
References
https://www.geeksforgeeks.org/interning-of-string/
https://www.baeldung.com/java-string-pool
http://java-performance.info/string-intern-in-java-6-7-8/
https://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang-string-intern
'Java > Java' 카테고리의 다른 글
(JAVA) Method 오버라이딩에 대해서 (0) | 2020.04.15 |
---|---|
(JAVA) Method Overloading에 대해서 (0) | 2020.04.07 |
(JAVA) static keyword in java (0) | 2020.03.04 |
(JAVA) 상속보다는 컴포지션을 사용하자 (0) | 2020.02.27 |
(JAVA) private final 과 private static final (0) | 2020.02.21 |