JiwonDev

์ž๋ฐ”์˜ String๊ณผ Constant Pool

by JiwonDev

JVM์— ๊ด€ํ•˜์—ฌ

 

#1. JVM

์šด์˜์ฒด์ œ์™€ ํ•˜๋“œ์›จ์–ด์— ๋…๋ฆฝ์ ์ธ ์–ธ์–ด, 1995๋…„ ๋‹น์‹œ ์ด ๊ฐœ๋…์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ˜์‹ ์ด์—ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ž๋ฐ”๋Š” ์ฌ ๋งˆ์ดํฌ๋กœ์‹œ์Šคํ…œ์Šค๊ฐ€ ๊ฐœ๋ฐœํ–ˆ์ง€๋งŒ JVM ๋ช…์„ธ(Specification)๋งŒ ๋”ฐ๋ฅธ๋‹ค๋ฉด ๋ˆ„๊ตฌ๋‚˜ ๊ฐœ๋ฐœํ•ด์„œ JVM

jiwondev.tistory.com

Java์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ํด๋ž˜์Šค๋‹จ์œ„ ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JVM์— ์‹คํ–‰์‹œํ‚ค๋ฉด Static(Method), Heap, Stack๋กœ ๋‚˜๋ˆ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ๋‹ค.

 

๊ทธ ์ค‘ Method Area (=Static Area)์—์„œ๋Š” ๊ฐ ํด๋ž˜์Šค ๋ณ„๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ ์œ  ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๊ณต๊ฐ„์ด๋ผ๋Š” ์ด๋ฆ„ ๋‹ต๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. (์ด ์˜์—ญ์—์„œ๋Š” GC๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

  • file data(ํ•„๋“œ ๋ฐ์ดํ„ฐ) : ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๋ฆ„, ํƒ€์ž…, ์ ‘๊ทผ์ œ์–ด์ž๋“ฑ์˜ ๋ฉ”ํƒ€์ •๋ณด
  • method data(๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ) : ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๋ฆฌํ„ดํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜, ์ ‘๊ทผ์ œ์–ด์ž๋“ฑ์˜ ๋ฉ”ํƒ€์ •๋ณด
  • constructor(์ƒ์„ฑ์ž) : ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ์— ๊ด€ํ•œ ์ •๋ณด.
  • static ๋ณ€์ˆ˜(Class ๋ณ€์ˆ˜) : ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ํด๋ž˜์Šค ๋ณ€์ˆ˜.
  • runtime constant pool (๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€)

#์ƒ์ˆ˜์™€ ๋ฆฌํ„ฐ๋„(literal)

์ƒ์ˆ˜์™€ ๋ฆฌํ„ฐ๋„์„ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒ์ˆ˜๋Š” '์ดˆ๊ธฐํ™” ์ดํ›„ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ˆ˜' ์ด๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ํ•  ๋•Œ final ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ƒ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

final int DAY_OF_WEEK = 7; // ์ฐธ๊ณ ) ๊ฐ€๋Šฅํ•˜๋ฉด ์ƒ์ˆ˜๊ฐ’์€ get ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฆฌํ„ฐ๋„๋„ ์ƒ์ˆ˜์˜ ์ผ์ข…์ธ๋ฐ, ๋ง ๊ทธ๋Œ€๋กœ ์„ ์–ธ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”, ๋ฌธ์ž ๊ทธ๋Œ€๋กœ์˜(=๋ฆฌํ„ฐ๋„ํ•œ) ์ƒ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. immediate value ๋ผ๊ณ  ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

3
"HEllO"
3.213
'H'

 

๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ƒ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’๋“ค๋„ ๊ณ ์œ ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค.

์ฐธ๊ณ ๋กœ ๋ฆฌํ„ฐ๋„ ๋’ค์— (L, F, D)๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด๋‹น ๋ฆฌํ„ฐ๋„์˜ ํƒ€์ž…์„ ์ง€์ • ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

object.setNumber(3) // ๋ฆฌํ„ฐ๋„ '3'์˜ ์ž๋ฃŒํ˜•์€ int์ด๋‹ค.
object.setName("Hello") // ๋ฆฌํ„ฐ๋„ "Hello"์˜ ํด๋ž˜์Šค๋Š” String์ด๋‹ค.

object.setNumber(3.0) // ๋ฆฌํ„ฐ๋„ '3.0'์˜ ์ž๋ฃŒํ˜•์€ int..? float..? double..?
object.setNumber(3.0F) // ์ด๋ ‡๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ Floatํ˜• ์ด๋ผ๊ณ  ์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.


int a = 1 // ์†Œ์ˆ˜์ ์ด ์—†์œผ๋ฉด intํ˜• ๋ฆฌํ„ฐ๋„์ด๋‹ค. ๋”ฐ๋กœ ๋ฆฌํ„ฐ๋„ ํ‘œ์‹œ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
boolean b = true // boolean์€ ๊ฐ’์ด true, false 2๊ฐœ๋ฐ–์— ์—†์–ด ๋”ฐ๋กœ ๋ฆฌํ„ฐ๋„ ํ‘œ์‹œ๋ฅผ ์•ˆํ•ด๋„ ๋œ๋‹ค.

// ์‹ค์ˆ˜ ๋ฆฌํ„ฐ๋„์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œํ•ด์ฃผ์ž.
long count = 10000L;
float f1 = 2.3F;
double d1 = 5.6D;

 


# ์ฐธ์กฐํ˜•(Reference)

ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์—์„œ๋Š” ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ฐธ์กฐํ˜•์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์˜คํ•ดํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š”๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์‹ฌ๋ณผ(=์ด๋ฆ„)๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์‹ฌ๋ณผ์„ ์ด์šฉํ•ด์„œ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— JVM์ด ํ•ด๋‹น ์‹ฌ๋ณผ์ด ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ ‘๊ทผํ•œ๋‹ค.

//ํด๋ž˜์Šค์ด๋ฆ„ ๋ ˆํผ๋Ÿฐ์Šค๋ช… = new ํด๋ž˜์Šค์ด๋ฆ„();
MadPlay instance = new MadPlay();

 


# String ํด๋ž˜์Šค

์ž๋ฐ”์—์„œ๋Š” ๋ฌธ์ž์—ด์ด ํด๋ž˜์Šค๋กœ ์ œ๊ณต๋˜์–ด์ง„๋‹ค. ํ•˜์ง€๋งŒ String ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ ์œผ๋กœ new ํ‚ค์›Œ๋“œ ์—†์ด ๋ฆฌํ„ฐ๋„๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ๋„ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋„ ์ƒ์„ฑ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•˜๊ณ  new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ ์žฅ์†Œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

// ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Heap ์˜์—ญ์— ํ• ๋‹น๋œ๋‹ค.
String str1 = new String("madplay");

// ์ŠคํŠธ๋ง ์ƒ์ˆ˜๊ฐ’์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. String Constant Pool ์ด๋ผ๋Š” ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.
String str2 = "madplay";

String str3 = "madplay"; // ๊ธฐ์กด "madplay" ์ƒ์ˆ˜ ์žฌํ™œ์šฉ. str 2์ด๋ž‘ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ
String str4 = new String("madplay"); // ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ. str1์ด๋ž‘ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ

 

String์ด ๊ฐ์ฒด๊ฐ€ ์ƒ์ˆ˜(final)๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

์ฐธ๊ณ ๋กœ String Constant Pool์€ ๊ธฐ์กด์—๋Š” ์ƒ์ˆ˜๊ฐ’ ์ „์šฉ ๋ฉ”๋ชจ๋ฆฌ์— (Perm ์˜์—ญ) ๋”ฐ๋กœ ์ €์žฅ๋˜์–ด์กŒ๋Š”๋ฐ, ๋Ÿฐํƒ€์ž„์ค‘ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋กœ ์ธํ•œ OutOfMemory ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด Java7 ์ดํ›„๋กœ๋Š” ๊ฐ์ฒด์™€ ํ•จ๊ป˜ Heap ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. 

 


# ๋ฌธ์ž์—ด ์กฐ์ž‘์— StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

์œ„์˜ 2๊ฐ€์ง€ ํŠน์ง• ๋•๋ถ„์— ์ƒ์ˆ˜ ์ŠคํŠธ๋ง ๋ง์…ˆ ( "Hello" + "Hi" ) ์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ์ƒ๋‹นํžˆ ๊ตฌ๋ฆฌ๋‹ค.

  • ์ŠคํŠธ๋ง์ด ์ƒ์ˆ˜๊ฐ’์ธ ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜๋ ค๋ฉด ์•„์˜ˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
  • ๋ง์…ˆ์˜ ํ”ผ์—ฐ์‚ฐ์ž ("Hello", "Hi")์˜ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ํ›„ ์“ธ๋ชจ์—†์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์ŠคํŠธ๋ง์€ ์ƒ์ˆ˜์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด Java8 ์ดํ›„ Heap์˜์—ญ์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค. ์ฆ‰ JVM GC์˜ ์ผ๊ฑฐ๋ฆฌ๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.

๊ทธ๋ž˜์„œ ๋Œ€๊ทœ๋ชจ๋กœ ๋ฌธ์ž์—ด ์กฐ์ž‘์„ ํ• ๋•Œ์—๋Š” StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์„ฑ๋Šฅ ํ•˜๋ฝ์ด ์—†๋‹ค. ๋” ์ž์„ธํ•œ ๊ฑด StringBuffer์™€ StringBuilder๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.


# Constant Pool ์ด๋ž€?

๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ๋˜๋Š” Static ์ƒ์ˆ˜ ์ €์žฅ์†Œ์ด๋‹ค. Constant Pool ๊ฐ์ฒด์— ์ €์žฅ๋˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„๋‹ค. 

์ฐธ๊ณ ๋กœ ์ƒ์ˆ˜ ํ’€์€ Method Area, ์ฆ‰ ์ •์ ์˜์—ญ์— ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์ด๊ธฐ์— GC์˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค.

// ์ƒ์ˆ˜ ํ’€์— ์ €์žฅ๋˜๋Š” ์ƒ์ˆ˜ ๊ฐ์ฒด
cp_info {
    u1 tag; // ํƒœ๊ทธ
    u1 info[]; // ๊ฐ’
}

/* tag๋Š” 1๋ฐ”์ดํŠธ ์ˆซ์ž๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ JVM์—๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์€ ํƒ€์ž…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
Utf8: 1
Integer: 3 (* Boolean, Short, Byte๋„ ์—ฌ๊ธฐ์— ํ•ด๋‹น๋จ)
Float: 4
Long: 5
Double: 6
Class reference: 7
String reference: 8
*/

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค์€ Primarity Type ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ String ๊ฐ์ฒด, ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์ด ๊ฐ€์ง„ ์ฃผ์†Œ ๊ฐ’๋„ ์ƒ์ˆ˜ ํ’€๋กœ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž๋ฐ”ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋””์–ด์…ˆ๋ธ”๋Ÿฌ ๋ช…๋ น์ธ  javap -v ์ด๋ฆ„.class ๋ฅผ ํ†ตํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด๋ณด์ž.

public class ConstantPool { // class ์ด๋ฆ„์„ ConstantPool์ด๋ผ๊ณ  ์ง€์—ˆ์Šต๋‹ˆ๋‹ค.

    public void sayHello() {
        System.out.println("Hello World");
    }
}

์ฐธ๊ณ ๋กœ [ #n ] ์€ ์ƒ์ˆ˜ํ’€์˜ n๋ฒˆ ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ์ด๋‹ค.

[ #2 = ์ƒ์ˆ˜ํƒ€์ž…    ์ƒ์ˆ˜๊ฐ’ ]์œผ๋กœ ์ƒ์ˆ˜ํ’€์˜ ํŠน์ • ์ธ๋ฑ์Šค์— ์ƒ์ˆ˜ ๊ฐ’์„ ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์œ„์—์„œ ๋งŒ๋“  ConstantPool.java์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ.
   #1 = Methodref          #6.#14         // java/lang/Object."<init>":()V
   #2 = Fieldref           #15.#16        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #17            // Hello World
   #4 = Methodref          #18.#19        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #20            // com/baeldung/jvm/ConstantPool
   #6 = Class              #21            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               sayHello
  #12 = Utf8               SourceFile
  #13 = Utf8               ConstantPool.java
  #14 = NameAndType        #7:#8          // "<init>":()V
  #15 = Class              #22            // java/lang/System
  #16 = NameAndType        #23:#24        // out:Ljava/io/PrintStream;
  #17 = Utf8               Hello World
  #18 = Class              #25            // java/io/PrintStream
  #19 = NameAndType        #26:#27        // println:(Ljava/lang/String;)V
  #20 = Utf8               com/baeldung/jvm/ConstantPool
  #21 = Utf8               java/lang/Object
  #22 = Utf8               java/lang/System
  #23 = Utf8               out
  #24 = Utf8               Ljava/io/PrintStream;
  #25 = Utf8               java/io/PrintStream
  #26 = Utf8               println
  #27 = Utf8               (Ljava/lang/String;)V

์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

// [UTF8 ํƒ€์ž…] sayHello()๋ฉ”์„œ๋“œ์˜ (์ž…๋ ฅ)๋ฆฌํ„ด ํƒ€์ž…์„ ์ƒ์ˆ˜ ํ’€์— ์ €์žฅ. void๋Š” V๋กœ ํ‘œ์‹œ๊ฐ€๋Šฅ
#8 = Utf8               ()V

// [UTF8 ํƒ€์ž…] ๋ฌธ์ž์—ด "Hello World"์˜ ์‹ฌ๋ณผ์„ Hello World๋ฅผ ์ง€์ •ํ•˜๊ณ  ์ด๋ฅผ ์ƒ์ˆ˜ ํ’€์— ์ €์žฅ .
#17 = Utf8               Hello World

// [Class ํƒ€์ž…] System.out ํด๋ž˜์Šค ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ 25๋ฒˆ ์ƒ์ˆ˜๋กœ ์ƒ์ˆ˜ํ’€์— ์ €์žฅ
#18 = Class              #25            // java/io/PrintStream

// [NameAndType ํƒ€์ž…] .println์˜ Name์„ 26๋ฒˆ์ƒ์ˆ˜, Type์„ 27๋ฒˆ ์ƒ์ˆ˜๋กœ ์ €์žฅ.
#19 = NameAndType        #26:#27        // println:(Ljava/lang/String;)V

// [UTF8 ํƒ€์ž…] ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค์˜ ์ •๊ทœ์ด๋ฆ„์„ ์ €์žฅ (fully-qualified class name)
#20 = Utf8               com/baeldung/jvm/ConstantPool

์ƒ์ˆ˜ํ’€์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…์˜ ์ข…๋ฅ˜

๋”๋ณด๊ธฐ

์ƒ์ˆ˜ํ’€์— ํƒ€์ž…์„ ์„ค๋ช…ํ•˜๋Š” ์›๋ฌธ


String ์ƒ์ˆ˜์˜ ์ •ํ™•ํ•œ ๋™์ž‘์€ ๋ชจ๋ฅด์ง€๋งŒ, 16๋น„ํŠธ ์ƒ์ˆ˜ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด ์ƒ์ˆ˜ํ’€ ๋‚ด๋ถ€์—์žˆ๋Š” ์‹ค์ œ ๋ฐ”์ดํŠธ๊ฐ’์„ ๊ฐ€๋ฅดํ‚จ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ ์กฐ๋ฆฝ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋“ฏ ํ•œ๋ฐ.. ๋„ˆ๋ฌด ๊นŠ์€ ๋‚ด์šฉ์ด๋‹ˆ ๋‚˜์ค‘์— ๋”ฐ๋กœ ๊ณต๋ถ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

  • Integer, Float: 32๋น„ํŠธ ์ƒ์ˆ˜ (Boolean, Short, Byte ์ƒ์ˆ˜๋Š” Integer ์ทจ๊ธ‰)
  • Double, Long: 64๋น„ํŠธ ์ƒ์ˆ˜
  • String: a 16-bit string constant that points at another entry in the pool which contains the actual bytes
  • Class: ์ •๊ทœํ™”๋œ ํด๋ž˜์Šค ์ด๋ฆ„(fully qualified class name)
  • Utf8: ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด(a stream of bytes)
  • NameAndType: (์ด๋ฆ„ . ํƒ€์ž…) ์œผ๋กœ ํ‘œ์‹œ. ๋ณดํ†ต ๋‹ค๋ฅธ ์ƒ์ˆ˜(#13.#15)๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฆ„๊ณผ ํƒ€์ž…์„ ์ง€์ •
  • Fieldref, Methodref, InterfaceMethodref: (Class:NameAndType) ์œผ๋กœ ํ‘œ์‹œ. Class์™€ NameAndType์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ƒ์ˆ˜ํ’€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž…์„ ์˜๋ฏธํ•จ.

 

 


# Java7 -> Java8์—์„œ์˜ ๋ณ€๊ฒฝ์ 

๊ธฐ์กด์˜ ์ž๋ฐ”๋Š” ์ƒ์ˆ˜ ํ’€์„ Permanent๋ผ๋Š” ์ •์  ์˜์—ญ์—์„œ ๊ด€๋ฆฌํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Static ์˜์—ญ์€ ํ• ๋‹น ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Š˜๋ฆด์ˆ˜๊ฐ€ ์—†์–ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋Ÿฌ์› ๊ณ  ์ƒ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜๋‹ค๋ณด๋ฉด StackOverFlow๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์–ด ๊ฒฐ๊ตญ Java8์—์„œ Heap ์˜์—ญ์œผ๋กœ ์ „ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

์ฐธ๊ณ ๋กœ Heap์ฒ˜๋Ÿผ OS Level์—์„œ ์œ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๋Š” ์˜์—ญ์„ Native Memory ๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.  ์ฐธ๊ณ ๋กœ JVM ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ Perm(Java7), MetaSpace(Java8)์˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์‹œ์Šคํ…œ๋ณ„๋กœ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ