2019년 8월 5일 월요일

Java - 문자열 풀링(String Pooling, String.intern())

String Pooling은 메모리를 아끼는 작업으로써 완전히 같은 값을 가진 문자열이 서로 다른 메모리 주소에 저장되지 않도록 해준다. 이는 Java에서 String이 불변(immutable) 객체이기 때문에 가능한 장치다. JDK는 String.intern() 메서드를 통해 이러한 기능을 제공한다. Java에서 생성자가 아닌 리터럴(" ") 형식으로 선언된 String 객체는 알아서(?) Pooling 되는데 아마 String.intern()이 내부적으로 호출되는 구조를 갖을 것이다.

Java 6 버전에서는 String.intern()을 권장하지 않았다. String Pool이 PermGen 메모리 영역에 저장되었기 때문인데, PermGen 영역은 GC 대상이 아닐 뿐더러 고정된 크기(기본값 32~96MB)를 갖고 실행된다. String Pool이 커지면 OutOfMemory 에러가 발생할 수 있는 것이다. 충분히 큰 사이즈를 초기에 지정해 사용하는 방법이 있었지만 (-XX:MaxPermSize=256m) 신중한 사용을 필요로 했다.

Java 7 버전부터 String Pool은 힙 영역에 저장된다. 참조되지 않는 문자열은 GC에 의해 회수되기 때문에 메모리를 보다 효율적으로 사용할 수 있게 되었다. String Pool은 고정된 크기의 해시 맵으로 구현되는데 -XX:StringTableSize=N 설정으로 맵의 크기를 변경할 수 있다. 참고로 Java 7u40 부턴 기본 60013의 크기로 동작한다. 왜 60000이 아니고 60013이냐, 맵의 크기는 소수(prime number)로 지정하는 것이 성능에 도움이 된다고 한다.

댓글 없음:

댓글 쓰기