-
Java - String pool이란?프로그래밍 언어/Java 2021. 1. 3. 19:00
String Pool
자바에서 String은 특별하게 String pool이 있어서 거기서 관리가 된다고 하는데, String이 어떻게 관리되는지 한 번 알아보자. String은 자바를 만드신 분들이 특별히 많이 사용될 것을 감안하여 자바의 성능을 위해 특별관리 대상이 되었다고 한다.
작동 방법
먼저 String Pool은 JDK1.7 부터는 Heap Memory 영역에 존재한다. 그리고 일정 크기의 pool을 할당 받을 것이다.
String이 선언되면 String pool에 반드시 string literal이 생겨난다. 그리고 추후에 같은 값을 찾는 경우가 생기면 해당 값이 있는지 확인 한 후에 메모리 주소를 반환해 준다.
디자인 패턴
이 패턴은 Flyweight Design pattern이 사용된 사례라고 볼 수 있다. FDP는 공유를 통해 대량의 객체들을 효과적으로 다루는 방법이다. 모바일 기기나 임베디드 시스템 같은 저용량 메모리에서 사용되는 소프트웨어들에게는 필수적인 디자인 패턴이다.
궁금증
그렇다면 String을 선언할 때 new를 사용하는 방법과 그냥 =를 사용해서 선언하는 방법이 있는데, new를 사용하면 새로운 메모리가 Heap에 선언되는데 이 경우에는 어떻게 되는가? 라는 질문이 생길 수 있다. 이 경우에는 Head에도 메모리가 실제로 올라간다. 그리고 값은 String pool을 참조한다.
Garbage Collection
String pool에 새로운 문자열이 계속해서 생긴다고 했는데 그렇다면 Garbage Collection은 어떻게 이루어지는 것인가? String pool은 어떻게 관리가 되는 것인지에 대한 궁금증도 생긴다. 결론만 말하자면 일반 GC와 똑같은 적용을 받는다. String pool에 선언된 값 들 중에서 참조되고 있지 않은 값은 GC의 대상이 돼서 메모리를 비우게 된다.
Memory running out
String pool이 꽉차면 어떻게 될까? 아마 에러를 뿜어내면서 프로그램이 멈출 것이다. String pool의 사이즈는 jvm option에서 변경할 수 있는데 대략 60000 정도의 값을 기본적으로 할당 받고 있다. 아래의 방법으로 사이즈를 변경할 수 있다.
-XX:StringTableSize=4901
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java - Iterator가 존재하는 이유 (0) 2021.01.06 Java - Try Catch문의 오버헤드 (0) 2021.01.04 Java - String과 String Builder (0) 2021.01.03 Java - Stream이란? (0) 2021.01.03 Java - Enum에 대해서 (3, 마지막) (0) 2021.01.01