Java์์ String์ ๊ต์ฅํ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, ๋ ๊ฐ์ง ์์ฑ ๋ฐฉ์์ด ์๋ค.
- new ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ๋ฐฉ์
- ๋ฆฌํฐ๋ด์ ์ด์ฉํ ๋ฐฉ์
์ด ๋ ๊ฐ์ง ๋ฐฉ์์๋ ํฐ ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค.
new๋ฅผ ํตํด String ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด Heap ์์ญ์ ์กด์ฌํ๊ฒ ๋๋ค.
๋ฆฌํฐ๋ด์ ์ด์ฉํ ๊ฒฝ์ฐ, String Constant Pool์ด๋ผ๋ ์์ญ์ ์กด์ฌํ๊ฒ ๋๋ค.
public class StringMemory{
public static void main(String[] args){
String literal = "loper";
String object = new String("loper");
literal == object; // false
literal.equals(object); // true
}
}
==
์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ false์ด๋ค. == ์ฐ์ฐ์๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ๊ฐ์ฒด์ฒ๋ผ Heap ์์ญ์ ์์ฑ๋ String ๊ฐ์ฒด์ ๋ฆฌํฐ๋ด์ ์ด์ฉํด String Constant Pool์ ์ ์ฅ๋ String ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋ค๋ฅผ ์ ๋ฐ์ ์๋ค.equals()
๋ฉ์๋์ ์ํ ๊ฒฐ๊ณผ๋ true์ด๋ค. ์ด๋ ๋ฌธ์์ด ๋ด์ฉ์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฌธ์์ด์ ๋ํด์ true๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ๋ง๋ค.
์ด๋ฅผ ์ํด์๋ ๋์ ๋ฐฉ์์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค. String์ ๋ฆฌํฐ๋ด๋ก ์ ์ธํ ๊ฒฝ์ฐ, ๋ด๋ถ์ ์ผ๋ก String์ intern()
์ด๋ผ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ฒ ๋๋ค.
intern()
: ์ฃผ์ด์ง ๋ฌธ์์ด์ด String Constant Pool์ ์กด์ฌํ๋์ง ๊ฒ์ํ๊ณ ์๋ค๋ฉด ๊ทธ ์ฃผ์๊ฐ์ ๋ฐํํ๊ณ ์๋ค๋ฉด String Constant Pool์ ๋ฃ๊ณ ์๋ก์ด ์ฃผ์๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.
public class StringMemoryInternTest{
public static void main(Strig[] args){
String literal = "loper";
String object = new String("loper");
String intern = object.intern(); // ๋ช
์์ ์ผ๋ก ํธ์ถ.
literal == object; // false
literal.equals(object); // true
literal == intern; // true
literal.equals(intern); // true
}
}
๊ธฐ์กด์ new
๋ฅผ ํตํด ์์ฑ๋ String ๊ฐ์ฒด์ ๋ฆฌํฐ๋ด๋ก ์์ฑ๋ String ๊ฐ์ฒด๋ฅผ ==
์ฐ์ฐํ์์ ๊ฒฝ์ฐ, false๋ฅผ ๋ฐํํ์ง๋ง new
๋ฅผ ํตํด ์์ฑ๋ String ๊ฐ์ฒด์ intern()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด String ๊ฐ์ฒด์ธ intern์ ๋์
ํ ๊ฒฝ์ฐ, ๋ฆฌํฐ๋ด๋ก ์์ฑ๋ String ๊ฐ์ฒด์ ==
์ฐ์ฐ์ true๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
์์์ ์ค๋ช
ํ๋ฏ์ด ๋ฆฌํฐ๋ด๋ก "loper"๋ผ๋ ๋ฌธ์์ด์ด String Constant Pool์ ์ ์ฅ๋์๊ณ , intern()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ String Constant Pool์ "loper"๋ผ๋ ๋ฌธ์์ด์ ๊ฒ์ํ๊ฒ ๋๊ณ ์ด๋ฏธ ์ ์ฅ๋ "loper" ๋ฌธ์์ด์ ๋ฐ๊ฒฌํ ํ
๋ ๋์ผํ ์ฃผ์๊ฐ์ ๋ฐํํ๊ฒ ๋๋ฏ๋ก true๊ฐ ์ฑ๋ฆฝ๋๋ ๊ฒ์ด๋ค.
String Constant Pool์ ์์น ๋ณ๊ฒฝ
Java 6๊น์ง String Constant Pool์ ์์น๋ Perm ์์ญ์ด์๋ค. Perm ์์ญ์ ์์นํ๋๊ฒ Java 7์์ Heap ์์ญ์ผ๋ก ๋ณ๊ฒฝ๋์๋ค. ๊ทธ ์ด์ ๋ OOM(Out Of Memory) ๋๋ฌธ์ด๋ค.
Perm ์์ญ์ ๊ณ ์ ๋ ์ฌ์ด์ฆ์ด๋ฉฐ Runtime์ ์ฌ์ด์ฆ๊ฐ ํ์ฅ๋์ง ์๋๋ค. Perm ์์ญ์ ์ฌ์ด์ฆ๋ฅผ ๋๋ฆด์๋ ์์ง๋ง ์ด์จ๊ฑฐ๋ Runtime์ ์ฌ์ด์ฆ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์๋๋ค.
๊ทธ๋์ Java 6๊น์ง๋ String์ intern() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ OOM์ ๋ฐ์์ํฌ ์ ์๊ณ ๊ทธ ๋ถ๋ถ์ ์ปจํธ๋กคํ ์ ์์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ๋ง๋ค.
๊ทธ๋์ Oracle์ ์์ง๋์ด๋ค์ด Java 7์์ Perm ์์ญ์ด ์๋ Heap ์์ญ์ผ๋ก String Constant Pool์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค. Heap ์์ญ์ผ๋ก ๋ณ๊ฒฝํจ์ผ๋ก์จ ์ป๋ ์ด์ ์ ๋ฌด์์ผ๊น?
-> ๋ฐ๋ก String Constant Pool์ ๋ชจ๋ ๋ฌธ์์ด๋ GC์ ๋์์ด ๋ ์ ์๋ค๋ ์ ์ด๋ค.
String Constant Pool์ ์ฌ์ด์ฆ ๋ํ ์ง์ ํ ์ ์๋๋ฐ, -xx:StringTableSize ์ต์ ์ผ๋ก ์ค์ ์ด ๊ฐ๋ฅํ๋ค. ์ฌ๊ธฐ์๋ 1,000,000๊ณผ ๊ฐ์ ์ซ์๊ฐ ์๋ 1,000,003๊ณผ ๊ฐ์ ์์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์ด๋ hashCode ์ฑ๋ฅ๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ์ด๋ฉฐ ์ํฐํด์ ์์ธํ ๋ด์ฉ์ด ๋์์๋ค.
++ 2020.09.19 ์ถ๊ฐ ํด๋น ๋ธ๋ก๊ทธ์ ๋ด์ฉ์ด ์ดํด๊ฐ ์๋์ด์ ์ฒจ๋ถํ๋ฉฐ, ์ถํ์ ์ถ๊ฐํ๋๋ก ํ๊ฒ ๋ค.