인생을 코딩하다.

[JAVA] 상수 풀(String Pool)은 GC가 될까? 본문

Java

[JAVA] 상수 풀(String Pool)은 GC가 될까?

Hyung1 2022. 4. 8. 22:05
728x90
반응형

상수 풀(String Pool)은 GC가 될까요?

JVM 내부구조를 다시 보던 중에, 문득 "상수 풀은 GC가 될까?" 라는 생각이 떠올랐습니다.

  • 자바에서 보통 static은 GC가 되지 않는데, 상수풀도 GC가 안되려나? 
  • 자바에서 보통 string 객체의 사용량이 가장 큰데 상수풀이 GC가 되지 않는다면 메모리에 큰 이슈가 발생하지 않을까?
  • 큰 이슈가 발생할 수도 있으니, JVM에서 상수풀이 GC가 되도록 최적화하는 옵션을 설정해두지 않았을까?

하는 생각들을 했었습니다.

 

https://www.baeldung.com/java-string-pool에서 답을 얻을 수 있었습니다.

 

Before Java 7, the JVM placed the Java String Pool in the PermGen space, which has a 
fixed size — it can't be expanded at runtime and is not eligible for garbage collection.

The risk of interning Strings in the PermGen (instead of the Heap) is that we can get 
an OutOfMemory error from the JVM if we intern too many Strings.

From Java 7 onwards, the Java String Pool is stored in the Heap space, which is 
garbage collected by the JVM. The advantage of this approach is the reduced risk of 
OutOfMemory error because unreferenced Strings will be removed from the pool, thereby 
releasing memory.

자바 7 이전에 JVM은 자바 스트링 풀을 PermGen 공간에 배치했는데, 이 공간은 런타임에 확장할 수 없고 가비지 
수집에 적합하지 않다.

힙 대신 PermGen에서 문자열을 인터네이트할 경우 너무 많은 문자열을 인터네이트할 경우 JVM에서 Out Of Memory 
오류가 발생할 수 있습니다.

Java 7 이후부터는 Java String Pool이 Heap 공간에 저장되는데, 이는 JVM이 수집한 가비지입니다. 
이 접근 방식의 장점은 참조되지 않은 문자열이 풀에서 제거되어 메모리를 방출하기 때문에 메모리 부족 오류가 발생할 
위험이 줄어든다는 것입니다.

Java7 이후에 String Pool이 Heap 영역으로 이동하고 나서부터는 상수풀에서도 GC가 수행되네요. 따라서 메모리 부족 오류 위험도 줄어들었다고 합니다.

728x90
반응형
Comments