Runtime Data Area

JVM์˜ Runtime Data Areas

JVM์˜ Runtime Data Areas๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๋“ค์€ JVM์˜ ์„ฑ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Runtime Data Areas๋Š” ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค:

  1. PC Registers: ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  2. Java Virtual Machine Stacks: ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šคํƒ ํ”„๋ ˆ์ž„์—๋Š” ์ง€์—ญ ๋ณ€์ˆ˜, ์šด์˜ ์Šคํƒ, ํ”„๋ ˆ์ž„ ๋ฐ์ดํ„ฐ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  3. Native Method Stacks: JNI๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ์˜ ์‹คํ–‰ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํƒ๋„ ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  4. Method Area: ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์ •์  ๋ณ€์ˆ˜, ์ƒ์ˆ˜ ํ’€ ๋“ฑ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. HotSpot JVM์—์„œ๋Š” Permanent Generation(PermGen) ๋˜๋Š” Metaspace๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

  5. Heap: ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํž™์€ Young Generation๊ณผ Old Generation์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ, Young Generation์€ Eden๊ณผ ๋‘ ๊ฐœ์˜ Survivor ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ์ฒ˜์Œ์— Eden์— ์ƒ์„ฑ๋˜๊ณ , ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ Survivor ์˜์—ญ๊ณผ Old Generation์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PC Registers

PC Registers๋Š” Program Counter Registers์˜ ์•ฝ์ž๋กœ, ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ ํ๋ฆ„์„ ๊ฐ€์ง€๋ฉฐ, PC ๋ ˆ์ง€์Šคํ„ฐ๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด, ์ด ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Java Virtual Machine Stacks

Java Virtual Machine Stacks๋Š” ์ž๋ฐ” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ JVM ์Šคํƒ์„ ๊ฐ€์ง€๋ฉฐ, ์ด ์Šคํƒ์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๊ณผ ๋ฐ˜ํ™˜์˜ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ํ”„๋ ˆ์ž„์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • Local Variables: ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • Operand Stack: ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • Frame Data: ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ํ•„์š”ํ•œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

JVM ์Šคํƒ์€ ์Šค๋ ˆ๋“œ์— ์ข…์†์ ์ด๋ฏ€๋กœ, ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด JVM ์Šคํƒ๋„ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

Native Method Stacks

Native Method Stacks๋Š” ์ž๋ฐ” ๋„ค์ดํ‹ฐ๋ธŒ ์ธํ„ฐํŽ˜์ด์Šค(JNI)๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ์˜ ์‹คํ–‰ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ์Šคํƒ์„ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” JVM์ด ์•„๋‹Œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šคํƒ์€ JVM์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ถ€ JVM์€ ์ผ๋ฐ˜์ ์ธ JVM ์Šคํƒ๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ์Šคํƒ์„ ํ†ตํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Method Area

Method Area๋Š” JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋ฉฐ, ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ด ์˜์—ญ์€ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์ •์  ๋ณ€์ˆ˜, ์ƒ์ˆ˜ ํ’€ ๋“ฑ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ํด๋ž˜์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•  ๋•Œ, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์ •์  ๋ณ€์ˆ˜๊ฐ€ ์ด ์˜์—ญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

HotSpot JVM์—์„œ๋Š” Method Area๋ฅผ Permanent Generation(PermGen) ๋˜๋Š” Metaspace๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. PermGen์€ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ ๋ฐ˜๋ฉด, Metaspace๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ํ™•์žฅ ๋ฐ ์ถ•์†Œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Heap

Heap์€ JVM์˜ ๊ฐ€์žฅ ํฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜์—ญ์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํž™์€ ํฌ๊ฒŒ Young Generation๊ณผ Old Generation์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  • Young Generation: ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. Young Generation์€ ๋‹ค์‹œ Eden๊ณผ ๋‘ ๊ฐœ์˜ Survivor ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ์ฒ˜์Œ์— Eden์— ์ƒ์„ฑ๋˜๋ฉฐ, ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ Survivor ์˜์—ญ์„ ๊ฑฐ์ณ Old Generation์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    • Eden: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค.

    • Survivor: Eden์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ด๋™ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์˜์—ญ์œผ๋กœ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • Old Generation: Young Generation์„ ๊ฑฐ์ณ ์˜ค๋ž˜๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ด ์˜์—ญ์€ Full GC์˜ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ์™€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

๋‹ค์Œ์€ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Runtime Data Areas์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์„ค๋ช…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

class VariableArrange {
    static int ci = 3;
    static String cs = "Static";
    int mi = 4;
    String ms = "Member";

    void method(int pi, String ps) {
        int li = 5;
        String ls = "Local";
    }
}

์ด ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜๋“ค์€ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค:

  • ci์™€ cs: Method Area์˜ Class Variable ์˜์—ญ์— ํ• ๋‹น

  • mi์™€ ms: Heap์— ์ƒ์„ฑ๋œ Instance์— ํ• ๋‹น

  • pi์™€ ps, li์™€ ls: Java Virtual Machine Stacks์˜ Local Variable ์˜์—ญ์— ํ• ๋‹น

์ด์™€ ๊ฐ™์ด JVM์˜ Runtime Data Areas๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์ค‘์— ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ์ค‘์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค. ๊ฐ ์˜์—ญ์€ ํŠน์ •ํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, JVM์˜ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

Last updated