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)로 지정하는 것이 성능에 도움이 된다고 한다.
댓글 없음:
댓글 쓰기