🎈 개요
기술 면접을 준비하고 보던 도중, 한 면접관님께서 이런 질문을 하셨습니다.
Q.문자열을 String str = "hello"; 라고 선언하면 어떻게 되나요?
A.JVM 메모리 내의 Heap 영역에 있는 String Constant Pool에 저장이 됩니다.
Q.String Constant Pool이 Heap영역에 저장되는게 맞아요??
저는 당연히 Heap 영역 내부에 저장되는거 아니야? 라고 생각했습니다.(블로그를 통해서 학습 하신분은 반은 맞다. 라고 생각하실 수 있을거 같아요, 보통 Heap안에 PermGen안에 String Constant Pool이 있다고 설명함)
정확히, JAVA 7까지는 Permgen에 저장되고 JAVA 8 이후부터는 NativeMemory 내부의 Metaspace에 저장이 됩니다.
그러면서 계속 자료를 찾아보다 아래와 같은 그림을 발견합니다.

❓ 그럼 JVM Memory에 Heap 영역에 Permanent Generation이 있는게 맞잖아?
위의 그림은 JVM Memory Architecture 검색하면 흔하게 나오거나, 국내 블로그나 포스팅들을 보면 위와 같이 Heap 영역안에 Permgen이 있고, Permgen 내부에 String ConstantPool이 있다고 하는 그림을 많이 보셨을겁니다.

new String()을 통해 생성하면 Heap 영역에 데이터가 생성되니까 메모리 낭비로 인해 절대 사용하지 마라.
맞는 말 입니다. 하지만, 이 그림은 잘못됐습니다.
🤦♂️ Heap와 PermGen은 다른 영역이다.

위와 같이 PermGen은 Heap영역에 있지 않습니다. Java는 Heap Memory와 Non-Heap Memory 두 가지 종류의 메모리를 관리합니다. Oracle GC 개발자 블로그에서는 아래와 같은 장표를 통해서 Permanent Generation 영역은 힙 영역이 아닌걸 확인할 수 있는 구조로 포스팅을 했습니다.

그렇기 때문에 Heap Memory OOM과 Non-Heap Memory OOM은 서로 다릅니다.

❤️ 결론
1. String Constant Pool은 Java 7까지는 Perm 영역에 관리된다. 이후에는 Native Method 내부 MetaSpace에서 관리
2. Perm 영역은 Heap 영역과 다른 Non-Heap Memory다.
3. Permanent Generation은 OOM도 Heap 영역과 다르다.
4. 이제 누가 String Constant Pool에 대해서 설명해달라고 하면, JVM Memory 내에 위치한 Non-Heap Memory인 PermGen 영역에 String Constant Pool이 위치한다고 말해주자.
[reference]
https://deveric.tistory.com/123
https://blog.naver.com/simjunbo/221080829920
https://stackoverflow.com/questions/41358895/permgen-is-part-of-heap-or-not
https://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html
그 외 국내 블로그
'Languege > Java & Spring' 카테고리의 다른 글
| [Spring Transaction] TransactionManager 동작방식 (0) | 2025.01.24 |
|---|---|
| [Java] jdk 17 - toList의 함정 (0) | 2024.11.14 |
| Stream 사용법 (0) | 2023.11.15 |
| RestAssured session 사용시 default value 저장 (0) | 2023.05.17 |