0. ํ์ต ๋ชฉ์
- String Constant Pool ์ด๋ผ๋ ๊ฐ๋ ์ ๋ํด์ ์ดํดํ๋ค.
- String์ ์ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค์๋์ง ์ ์ถํ๋ค.
1. String Constant Pool ์ด๋?
JVM Heap์ ์กด์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ๋ถ๋ณ ๊ฐ์ฒด์ธ String ๋ฆฌํฐ๋ด ์ ์ฉ ์ ์ฅ ๊ณต๊ฐ ์ด๋ค.
ํ๋ก๊ทธ๋จ ๋ด๋ถ์์ ์ ์ธ๋ ๋ชจ๋ String ๋ฆฌํฐ๋ด์ String Constant Pool์ ์ ์ฅ๋๋ค.
2. ํน์ง
- String Literal ๋ง ์ ์ฅ
- Pool์ ์กด์ฌํ๋ ๋ฌธ์์ด์ด ์ฌ ์ ์ธ๋๋ฉด, ์๋ก ํ ๋นํ์ง ์๊ณ ์๋ ๊ฑฐ ์ฌํ์ฉ
(1) String Literal ๋ง ์ ์ฅํ๋ค.
String ๊ฐ์ฒด ์ ์ธ ๋ฐฉ์์ 2๊ฐ๋ก ๋๋๋ค.
// ๋ฆฌํฐ๋ด ๋ฐฉ์ ์ ์ธ
String str1 = "Hello World";
// ๊ฐ์ฒด ๋ฐฉ์ ์ ์ธ
String str2 = new Stirng ("Hello World");
์ฌ๊ธฐ์, ๋ฆฌํฐ๋ด ๋ฐฉ์์ผ๋ก ์ ์ธ๋ ๋ฌธ์์ด์ String Constant Pool
์ ์ ์ฅ๋๊ณ , ๊ฐ์ฒด ๋ฐฉ์์ผ๋ก ์ ์ธ๋ ๋ฌธ์์ด์ ์ผ๋ฐ HEAP์ ์ ์ฅ๋๋ค.
A. ๋ ๋ฐฉ์์ด ์ ์ฅ๋๋ ์์น์ ๋ฐ๋ฅธ ์ฐจ์ด
GC์ ์ฆ์ ๋์์ด ๋๋๊ฐ ์๋๋์ ์ฐจ์ด๊ฐ ์๋ค.
๊ฐ์ฒด ๋ฐฉ์์ผ๋ก ์ ์ธ๋ String ๊ฐ์ฒด๋ ์ผ๋ฐ Heap ์์ญ์ ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ minorGC, majorGC ๋ชจ๋์ ๋์์ด ๋๋ค. ์ฆ ๋ ์ด์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ์์ ๋, GC์ ์ํด ์ ๊ฑฐ๋๋ค.
๋ฆฌํฐ๋ด ๋ฐฉ์์ ๊ฒฝ์ฐ, ์ค์ง fullGC๋ง์ ๋์์ด๋ค. ์ฆ ํด๋น ๊ฐ์ฒด๊ฐ ์ ์ธ๋ ํด๋์ค ์์ฒด๊ฐ ์ธ๋ก๋ฉ ๋์ง ์๋ ์ด์ (์ดํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์ ์ ์๋ ์ผ์ด๋ค.) ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๊ฒ ๋๋ค.
(2) Pool์ ์กด์ฌํ๋ ๋ฌธ์์ด ์ฌํ์ฉ
์์ ์ํฉ์์ ๋ ์งํํด์ str3๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
String str3 = "Hello World";
๊ทธ๋ฌ๋ฉด str3๋ ์ค์ ์ ์ธ๋์ง ์๊ณ , String Constant Pool
์ ์๋ ๊ธฐ์กด์ ์กด์ฌํ๋ "Hello World"๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
์์ ๊ฐ์ด String Literal๋ก ์ ์ธ๋ ๊ฐ์ฒด๋ ํด๋น ๋ฌธ์์ด์ด Pool ๋ด๋ถ์ ์๋์ง ๋จผ์ ํ์ธํ๋ค. ๋ง์ฝ์ ์ด๋ฏธ ์กด์ฌํ๋ฉด ํด๋น ๋ฌธ์์ด์ ๊ทธ๋๋ก ๊ฐ๋ฆฌํค๋ฉฐ ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด ์๋กญ๊ฒ ์์ฑํด์ Pool ๋ด๋ถ์ ํ ๋นํ๋ค.
[!info] ์ฐธ๊ณ
String Constant Pool ์ ํด์ ํ ์ด๋ธ ํํ์ธStringTable
๋ก ์ด๋ฃจ์ด์ ธ ์์.
๋ฐ๋ผ์ ํน์ ๊ฐ์ด Pool ๋ด์ ์๋์ง ์๋์ง ์กฐํํ๋ ๊ฒ์๋ O(1)์ ์๊ฐ ๋ณต์ก๋๊ฐ ๋ค๋ฉฐ ๋น ๋ฅด๋ค.
๋ฐ๋ผ์ ' == ' ํค์๋๋ฅผ ํ์ฉํด ๋๋ฑ ๋น๊ต๋ฅผ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์์ง๋ค.
String str1 = "Hello World";
Stirng str2 = new String("Hello World");
String str3 = "Hello World";
System.out.println(str1 == str2) // false => ๋์ ํ ๋ด๋ถ ๊ฐ์ฒด ์ฃผ์๋ ๋ค๋ฆ.
System.out.println(str1 == str3) // true => ๋์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
(3) intern() ํจ์
String ๊ฐ์ฒด์ ๋ฉค๋ฒ ํจ์์ด๋ฉฐ, Heap์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ String Constant Pool ๋ด๋ถ๋ก ๋ฐ์ด๋ฃ์ด์ฃผ๋ ํจ์์ด๋ค.
String str4 = new String("fool").intern()
๊ณผ ๊ฐ์ด ์ ์ผ๋ฉด, str4๋ ๊ฐ์ฒด ๋ฐฉ์์ผ๋ก ์ ์ธ๋์์ง๋ง Pool ๋ด๋ถ์ ์ ์ฅ๋๋ค.
intern ํจ์๋ minor GC์ ์ํด ์ง์์ง ์ ์๋ ๋์์ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง ๊ฑฐ์ ์ ์ง์์ง๊ฒ ๋ง๋๋ ํจ์์ด๋ฏ๋ก ๋จ๋ฐํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ํ์ด ์๋ค.
3. ์ฅ์
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ
- Thread-Safe
(1) ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ํจ๊ณผ
String Constant Pool์ ์ฐ๋ ๊ฐ์ฅ ํฐ ์ด์ ์ด๋ค.
G1 ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋ฌธ์์ด ์ค๋ณต ์ ๊ฑฐ ๊ธฐ๋ฅ ๋์
์ด๋ผ๋ JDK ํ์ JIRA๋ฅผ ๋ณด๋ฉด, ํด๋น ๊ธฐ๋ฅ์ ๋์
ํ ๊ณ๊ธฐ๋ก, ๋ํ Java ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ 25%์ Heap-Live_data๊ฐ String ๊ฐ์ฒด๋ฅผ ์ํด ์ฌ์ฉ๋๊ณ , ๊ทธ ์ค ์ ๋ฐ ๊ฐ๋์ด ์ค๋ณต ๋ฌธ์์ด๋ก ์กฐ์ฌ๋๋ค๊ณ ๋ฐํ๋ค.
์ฆ ์ค๋ณต๋ ๋ฌธ์์ด๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋นํจ์จ์ ์ผ๋ก ํ์ฉํ๋๊ฒ JVM ๊ธฐ๋ฐ ์๋น์ค๋ค์ ๊ณตํต์ ์ธ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ผ๊ณ ๋ณด์ฌ์ง๋ค.
String Constant Pool์ ๋ฆฌํฐ๋ด ๋ฐฉ์ ์ ์ธ String ๊ฐ์ฒด์ ํํด์ ๋งํผ์ ์ฌํ์ฉ์ด ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง ๊ฐ๋ฅํ๋๋ก ํ์์์ผ๋ก ์ด๋ฌํ ๋ถํ์ํ ์ค๋ณต ๋ฌธ์์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ฌ์ ์ฐจ๋จํ ์ ์๋ค.
(2) Thread-Safe
String ์์ฒด๊ฐ ๋ถ๋ณ ๊ฐ์ฒด์ด๊ณ , String Constant Pool์ ๊ฐ์ฒด๋ค์ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง ๊ฑฐ์ ์ง์์ง์ง ์์ผ๋ฏ๋ก , ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์์ ํ๊ฒ ๊ฐ์ String ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ฉฐ ์์ ํ ์ ์๋ค.
4. ์ญ์ฌ
String Constant Pool์ Java 6 ์ดํ ๋ฒ์ ์์ PermGen ์์ญ์ ์กด์ฌํ๋ค.
ํ์ง๋ง PermGen ์์ญ์ ๊ธธ์ด๊ฐ ๊ณ ์ ๋์ด์๋ค๋ณด๋, String์ ๋ง์ด ์ฐ๋ฉด ์ธ์๋ก OOM(Out Of Memory) ์ค๋ฅ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์ฆ์๋ค.
Java 7 ์ดํ ๋ถํฐ๋ Heap ์์ญ์ผ๋ก ์ฎ๊ฒจ์ ๊ฐ๋ณ ๊ธธ์ด๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๊ฒ ๋์ด ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ก๋ค.
5. ํต์ฌ ์์ฝ
String Constant Pool
์ด๋ ๋ฆฌํฐ๋ด ํ์์ผ๋ก ์ ์ธ๋ String ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.- ๊ฐ์ฒด ๋ฐฉ์์ผ๋ก ์ ์ธ๋ String ๊ฐ์ฒด๋ค์ ๋ชจ๋ Heap์, ๋ฆฌํฐ๋ด ๋ฐฉ์ ์ ์ธ String ๊ฐ์ฒด๋ค์ ๋ชจ๋ String ์์ ํ์ ์ ์ฅ๋๋ค.
- ์ด๋ฏธ ํ์ ์กด์ฌํ๋ ๋ฌธ์์ด์ด ์ฌ์ ์ธ ๋์์ ๊ฒฝ์ฐ, ํด๋น String ๋ณ์๋ ๊ธฐ์กด์ ํ์ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ๋ง ํ ๋ฟ ์๋ก String ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋๋ค.
- ์ด๋ฌํ ์ ์ฅ ์์น ์ฐจ์ด๋์ ๊ฐ์ฒด ๋ฐฉ์์ minorGC์ ๋์์ด ๋์ด ๋ ์ด์ ์ฐธ์กฐ๋์ง ์์ผ๋ฉด ์ ๊ฑฐ๋๋ ๋ฐ๋ฉด, String Constant Pool์ ์ ์ฅ๋ ๊ฐ์ฒด๋ ํด๋์ค๊ฐ ์ธ๋ก๋ฉ๋์ง ์๋ ํ ์ญ์ ๋์ง ์๋๋ค.
intern()
ํจ์๋ ๊ฐ์ฒด ๋ฐฉ์ ์ ์ธ String ๊ฐ์ฒด๋ฅผ String constant Pool ์์ ๋ฐ์ด๋ฃ๋ ๊ฒ์ด๋ค.- ์ฅ์ ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌํ์ฉ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฝ๋๊ณ , String์ Thread Safeํ๊ฒ ์ด์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
String ์์ ํ์ ์ญ์ฌ
๋ java 6 ์ดํ ๋ฒ์ ์์๋ pergen ์์ญ์ ์์์ง๋ง 7 ์ดํ๋ถํฐ Heap ์์ญ์ผ๋ก ์ฎ๊ฒจ์ก๋ค.
6. ๋ถ๋ก
A. ๋ชจ๋ฅด๋ ๋จ์ด ์ ๋ฆฌ
intern
: ์ ๊น ์ผํ๋ค.
(๊ฐ์ฅ ํน์ ํน์ ๊ณต๊ฐ์) ํฌ์ฅ์ํค๋ค. ๋ฐ์ด ๋ฃ๋ค.
B. ์ฐธ๊ณ ๋ฌธ์
- Geeks for Geeks - String constant pool in java
- Java - ๋ง์ด ํท๊ฐ๋ คํ๋ String constant pool๊ณผ Runtime Constant pool, Class file constant pool
- JDK ํ JIRA - Stirng ์ค๋ณต ๋ฐฉ์ง in G1
C. ๊ด๋ จ ๊ธ
TABLE without id file.inlinks AS "BackLink"
WHERE file.path = this.file.path