constant pool을 조사할 때 나를 너무나 헷갈리게 만들었던 존재
String pool,, 도대체 너는 누구냐
약 30개 이상의 블로그 포스팅, 스택오버플로우 글등을 찾아보았다.
사람들 사이에서 String Constant Pool, String Pool 등의 이름으로 불리는 이녀석은 사실 다른 메모리 공간이다.
당신이 알고있던 String Pool이 Method 영역의 그것이라면 당신은 잘못된 지식을 가지고 있다.
String Constant Pool
이는 틀린 표기법이다. Run-Time Constant Pool
이 올바른 표기법이다.
Each run-time constant pool is allocated from the Java Virtual Machine's method area (§2.5.4). The run-time constant pool for a class or interface is constructed when the class or interface is created (§5.3) by the Java Virtual Machine.
Oracle 공식 문서에 의하면 Run-Time Constant Pool 은 메서드영역에 포함되어 있다고 한다.
Run-Time Constant Pool
A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table.
Oracle JVM에 String
만 저장하는 상수 풀은 존재하지 않는다.
Method Area
에 존재하는 상수풀은 클래스 파일부터, 숫자 리터럴, 문자열 리터럴, 런타임에서 확인해야하는 메서드 및 필드 참조까지 여러 종류의 상수가 저장되어 있는 공간이다.
public class Test {
public static void main(String[] args) {
String str = "Java";
String str2 = new String("Java");
int num1 = 1231231232;
float num2 = 123.123123f;
Integer num3 = new Integer(1223);
}
}
실제로 위의 코드를 컴파일 한 뒤, 바이트 코드를 분석하면 상수풀에는 아래와 같이 여러가지 상수들이 저장되어 있는 것을 확인할 수 있다.
String Pool
이녀석은 뭐랄까 딱히 틀린 표기라고 하기에도 애매하고 아니라고 하기에도 애매한 녀석이다.
JVM Runtime Data Area
의 Heap
영역에 존재하는 String pool은
문자열 리터럴로 생성한 객체가 저장되는 공간이라고한다.
String str = new String("Java").intern();
위의 코드를 통해 String pool이라는 공간에 “Java”
를 할당할 수 있다.
그렇다면 intern
메소드를 따라가보자.
API reference for Java Platform, Standard Edition
intern
Returns a canonical representation for the string object.
A pool of strings, initially empty, is maintained privately by the class String.When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
오라클 java docs에서는 해당 공간을 A pool of strings
라고 한다.
음,, 해당 포스팅을 하려고 마음먹기 전의 나였어도 string pool이라고 불렀을 것 같다.
하지만 공식문서에서 딱히 string pool이라고 명명하진 않는 것 같으니 A pool of strings이 올바른 표기법 이지 않을까 생각한다.
결론
사실 문제는 이름이 아니라 몇몇 사람들이 Run-Time Constant Pool
을 constant pool
과 string pool
(혹은 Sting Constant Pool
)로 분리하여 설명한다는 것이다.
나 또한 조사하면서 아주 혼란 스러웠다.
(위의 String pool 관련 사진은 올바른 정보이다.)
일부 잘못된 설명(메소드 영역에 있는 string pool,,)의 string pool
(혹은 String Constant Pool
)은
Method 영역의 Run-Time Constant Pool
이며
진짜 string pool
은 Heap영역의 a pool of strings
이다.
헷갈리지 말자!!!!
'의문과 실험' 카테고리의 다른 글
[Java] 싱글톤과 Static은 뭐가 다를까? (0) | 2023.07.03 |
---|---|
[JAVA] Vector는 Thread-Safe 한가? (0) | 2023.04.21 |
[JAVA] 자바는 Call by Reference 지원 안해. 참조변수를 넘기는 경우는 뭘까? (0) | 2023.04.04 |
[JAVA] int num = 1; num이 가리키는 메모리는 '값'을 가지는가? (0) | 2023.04.02 |
[JAVA] int num = 1; num은 어떻게 '값'을 가지며, 비교될까 (0) | 2023.03.27 |