JVM


Java Virtual Machine, JVM ์ด๋ž€ Java ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋‹ค.

Java ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ชจ๋“  ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” JVM ์€ Java ์™€ ์šด์˜์ฒด์ œ ์‚ฌ์ด์˜ ์ค‘๊ฐœ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ Java ๊ฐ€ ์šด์˜์ฒด์ œ์— ์ข…์†์ ์ด์ง€ ์•Š๋„๋ก ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ, GC ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด์™€ ๋‹ค๋ฅด๊ฒŒ ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ์Šคํƒ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

JVM ์˜ ๊ตฌ์กฐ


JVM ์€ ClassLoader ExecutionEngine RuntimeDataArea JNI NativeMethodLibrary ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

1. Class Loader

  • ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์„ ์—ฎ์–ด์„œ JVM์ด OS๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ(Runtime Data Area)์— ์ ์žฌ

2. Execution Engine

  • Class Loader ์— ์˜ํ•ด ์ ์žฌ๋œ ํด๋ž˜์Šค(๋ฐ”์ดํŠธ ์ฝ”๋“œ)๋“ค์„ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์‹คํ–‰
    • Interpreter ๋ฐฉ์‹
      • ๋ช…๋ น์–ด ํ•˜๋‚˜ ํ•˜๋‚˜ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
    • JIT(Just-In-TIme) Compiler ๋ฐฉ์‹
      • ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์ „์ฒด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•ด ์‹คํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐฉ์‹

3. Garbage Collector

  • GC๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค ์ค‘ ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ ํ›„ ์ œ๊ฑฐ

4. Runtime Data Area

  • JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ์ž๋ฐ” ํŒŒ์ผ์ด ์‹คํ–‰๋  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๋Š” ์˜์—ญ
  • ๋ฉ”์„œ๋“œ, ํž™, ์Šคํƒ ๋ชจ๋‘ GC ์˜ ๋Œ€์ƒ
  • ๋ฉ”์„œ๋“œ, ํž™ ์˜์—ญ์€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ 
  • ์Šคํƒ, PC ๋ ˆ์ง€์Šคํ„ฐ, Native ๋ฉ”์„œ๋“œ ์Šคํƒ์€ ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์ƒ์„ฑ ๊ณต์œ  X

Class Loader


ClassLoader ๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์— ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•œ๋‹ค. Java ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JVM ์ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ RuntimeDataArea ๋กœ ์ ์žฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Execution Engine


ExecutionEngine ์€ ClassLoader ์— ์˜ํ•ด RuntimeDataArea ์˜ Method Area ์— ์ ์žฌ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Interpreter

๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„๋งˆ๋‹ค ์ปดํŒŒ์ผํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ค‘๋ณต๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋„ ๋งค๋ฒˆ ์ปดํŒŒ์ผํ•˜๋Š” ๋น„ํšจ์œจ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•  ๊ฒฝ์šฐ JIT Compiler ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

JIT Compiler

Interpreter ์˜ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ Compiler ๋กœ Interpreter ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด JIT Complier ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์บ์‹ฑํ•œ๋‹ค. ์ดํ›„ Interpreter ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋˜ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

Garbage Collector

RuntimeDataArea ์˜ Heap Area ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. GC ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ GC ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ •์ง€๋œ๋‹ค.

Runtime Data Area


Method Area

ํด๋ž˜์Šค ์ •๋ณด, ๋ณ€์ˆ˜ ์ •๋ณด, ๋ฉ”์„œ๋“œ ์ •๋ณด, static ๋ณ€์ˆ˜ Constant Pool ๋“ฑ์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์ด๋‹ค.

  • JVM ์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ
  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋จ
    • ํด๋ž˜์Šค ์ •๋ณด, ๋ณ€์ˆ˜ ์ •๋ณด, static ๋ณ€์ˆ˜

Heap Area

new ์—ฐ์‚ฐ์œผ๋กœ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์ด๋‹ค. Method Area ์— ๋กœ๋“œ๋œ ํด๋ž˜์Šค๋งŒ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋ฉฐ Garbage Collector ๊ฐ€ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

  • new ์—ฐ์‚ฐ์œผ๋กœ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ instance ๋ณ€์ˆ˜(๊ฐ์ฒด)๊ฐ€ ์ €์žฅ๋จ
    • e.g. ํด๋ž˜์Šค์˜ ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ
  • ํšจ์œจ์ ์ธ GC ๋ฅผ ์œ„ํ•ด 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰จ
  • GC์˜ ํ”„๋กœ์„ธ์Šค
    • Minor GC: new ์˜์—ญ
      1. Eden ์˜์—ญ์— ์ตœ์ดˆ์˜ ๊ฐ์ฒด ์ƒ์„ฑ
      2. Eden ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๋ฉด ์ฒซ ๋ฒˆ์งธ GC ๋ฐœ์ƒ
      3. Survivor1 ์— Eden์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณต์‚ฌ ํ›„ Survivor1 ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ
      4. Eden ๊ณผ Survivor1 ๋ชจ๋‘ ๊ฐ€๋“ ์ฐผ๋‹ค๋ฉด ๋‘ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์ค‘์— ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
      5. ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ Survivor2 ์— ๋ณต์‚ฌ ํ›„ Survivor2 ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ
      6. ์œ„ ๊ณผ์ • ์ค‘ ์ผ์ • ํšŸ์ˆ˜ ์ด์ƒ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋“ค์€ Survivor2 ์—์„œ Old ์˜์—ญ์œผ๋กœ ์ด๋™
      7. ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ Survivor2 ๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ธฐ ์ „์— ๊ณ„์†ํ•ด์„œ Old ๋กœ ๋น„์›€
    • Major GC (Full GC): old ์˜์—ญ
      1. Old ์˜์—ญ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉฐ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ
      2. ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ๋ชจ์•„ ํ•œ ๋ฒˆ์— ์ œ๊ฑฐ
      • Minor GC ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ์‹คํ–‰ ์ค‘ GC๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ค‘์ง€๋จ
        • Full GC ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด, Old ์˜์—ญ์— ์žˆ๋Š” ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฐ์ฒด๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐ
        • Heap ์˜์—ญ์— ๋นˆ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•จ
        • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋„์ค‘ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๊ธฐ ๋Œ€๋ฌธ์— ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ •์ง€
// ํž™์—” Person("ํ™๊ธธ๋™", 20) ์ด ์ €์žฅ๋จ
// ์ฆ‰, ์ธ์Šคํ„ด์Šค๊ฐ€ ์ €์žฅ๋จ
Person p = new Person("ํ™๊ธธ๋™", 20);

Stack Area

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๋งˆ๋‹ค ๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๋งŒ์„ ์œ„ํ•œ ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์ด๋‹ค. ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋Š” Heap Area ์— ํ• ๋‹น๋˜๊ณ  ์ฐธ์กฐ๋งŒ Stack ์— ์ €์žฅ๋œ๋‹ค.

  • ์ง€์—ญ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ž„์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด ๋“ฑ์ด ์ €์žฅ๋˜๋Š” ์˜์—ญ
// ์Šคํƒ์—” p ๊ฐ€ ์ €์žฅ๋จ
// ์ฆ‰, ํž™์— ์ €์žฅ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋จ
Person p = new Person("ํ™๊ธธ๋™", 20);

Program Counter Register

์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋ฉฐ ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ๋ถ€๋ถ„์˜ ์ฃผ์†Œ์™€ ๋ช…๋ น์„ ์ €์žฅํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

  • ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž˜๋  ๋•Œ ์ƒ์„ฑ
  • ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์˜ ์ฃผ์†Œ์™€ ๋ช…๋ น์„ ์ €์žฅํ•˜๋Š” ์˜์—ญ
  • ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ์•„๊ฐ€๋ฉด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

Native Method Stack

Java ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์˜์—ญ์ด๋‹ค. ์ฆ‰, JNI(Java Native Interface) ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•œ C/C++ ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ž๋ฐ”๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„
  • ์ฆ‰, JNI(Java Native Interface)๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•œ C/C++๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„

JNI


Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ C/C++ ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์ค€๋‹ค. native ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Thread ์˜ currentThread() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.

Native Method Library


C/C++ ๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด JNI ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

References