๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Ž/Java

[Java] ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ (Java Virtual Machine)

by dar0m! 2021. 7. 28.

JVM(Java Virtual Machine)

  • Java๋กœ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ๋จธ์‹ . ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ ์„ ๋œปํ•˜๋Š” ๋ง๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ฃผ์ฒด์ด๋‹ค. ์šด์˜์ฒด์ œ ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ ์œผ๋กœ Java ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ

๋ฌผ๋ฆฌ์ ์ธ ์‹ค์ œ์˜ ๊ธฐ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ”์ƒ์ ์ธ ์žฅ์น˜์ด๋‹ค.

์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋ž˜์Šค ๋กœ๋”(Class Loader)๋ฅผ ํ†ตํ•ด ์ฝ์–ด ๋“ค์—ฌ์„œ ์ž๋ฐ” API์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ

์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋ฐ”์—์„œ javac ๋ช…๋ น์„ ํ†ตํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ JVM์ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋ฉฐ ์‹คํ–‰ํ•œ๋‹ค.

 

JVM ๊ตฌ์„ฑ์š”์†Œ

1. Class Loader

JVM์€ ๋Ÿฐํƒ€์ž„์‹œ์— ์ฒ˜์Œ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ฐฐ์น˜์‹œํ‚ด. ์ด ๋™์  ๋กœ๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ํด๋ž˜์Šค ๋กœ๋”

2. GC (Garbage Collector)

์ž๋ฐ” ์ด์ „์—๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ–ˆ์Œ ํ•˜์ง€๋งŒ, ์ž๋ฐ”์—์„œ๋Š” JVM์ด ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•จ!

JVM์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•จ. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ฐพ์•„๋‚ด์„œ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•จ.

์‹คํ–‰์ˆœ์„œ : ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ ํ›„ ์‚ญ์ œ → ์‚ญ์ œ๋œ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜ → ํž™ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ

3. Execution Engine

ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด JVM ๋‚ด์˜ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ๋ฐฐ์น˜๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ์‹คํ–‰ ์—”์ง„์— ์˜ํ•ด ์‹คํ–‰๋œ๋‹ค. ์‹คํ–‰ ์—”์ง„์€ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ ์‹คํ–‰ํ•œ๋‹ค.

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ
  • JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ

JIT ์ปดํŒŒ์ผ๋Ÿฌ

์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๊ฒƒ์ด JIT ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹(์‹คํ–‰์‹œ์ ์— ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ)์œผ๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์ ์ ˆํ•œ ์‹œ์ ์— ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ดํ›„์—๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•˜๋‚˜์”ฉ ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๊ณ , ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋Š” ์บ์‹œ์— ๋ณด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ๊ณ„์† ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

(= ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์€ ์‹คํ–‰์ค‘์— ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ์œผ๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘๋ณตํ•ด์„œ ๋ฒˆ์—ญํ•˜๋Š” ๋น„ํšจ์œจ์ด ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆ์—ญํ•œ ๋‚ด์šฉ์„ ์บ์‹ฑํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ๋™์ผํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์บ์‹ฑ๋œ ๋‚ด์šฉ์„ ์‹คํ–‰ํ•œ๋‹ค.)

 ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹(์‹คํ–‰์ค‘ ํ•œ ์ค„์”ฉ ์ฝ์œผ๋ฉฐ ์‹คํ–‰)๊ณผ ์ •์  ์ปดํŒŒ์ผ ๋ฐฉ์‹(์‹คํ–‰ํ•˜๊ธฐ ์ „ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญ - ์บ์‹ฑ)์ด ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ

JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ, ๋งŒ์•ฝ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ผ๋ฉด ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์œ ๋ฆฌํ•˜๋‹ค. ๋”ฐ๋ผ์„œ, JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” JVM๋“ค์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์ฒดํฌํ•˜๊ณ , ์ผ์ • ์ •๋„๋ฅผ ๋„˜์„ ๋•Œ์—๋งŒ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

4. Runtime Data Area

JVM์ด ์šด์˜์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰๋˜๋ฉด์„œ ํ• ๋‹น๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž„

์ด 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง : PC ๋ ˆ์ง€์Šคํ„ฐ, JVM ์Šคํƒ, ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ, ํž™, ๋ฉ”์„œ๋“œ ์˜์—ญ

(์ด ์ค‘์— ํž™๊ณผ ๋ฉ”์„œ๋“œ ์˜์—ญ์€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•จ)

  1. PC register(PC ๋ ˆ์ง€์Šคํ„ฐ) : ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ๋ช…๋ น์–ด๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ• ์ง€ ๊ธฐ๋กํ•˜๋Š” ๋ถ€๋ถ„(JVM ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง)
  2. Stack Area(์Šคํƒ ์˜์—ญ, JVM ์Šคํƒ) : ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ์ •๋ณด, ์ž„์‹œ ๋ฐ์ดํ„ฐ ๋“ฑ์„ ์ €์žฅ. ์Šค๋ ˆ๋“œ ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.
  3. Native Method Stack(๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ) : ์‹ค์ œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์˜์—ญ
  4. Heap(ํž™) : ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ. ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ์ƒ์„ฑ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•จ
    • (๋˜ํ•œ ํž™์— ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ๋“ค์€ ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ์˜ ๋Œ€์ƒ์ด ๋จ. JVM ์„ฑ๋Šฅ ์ด์Šˆ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰๋˜๋Š” ๊ณต๊ฐ„์ž„)
  5. Class Area(static ์˜์—ญ, ๋ฉ”์„œ๋“œ ์˜์—ญ, ๋ฐ์ดํ„ฐ ์˜์—ญ) : ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์œผ๋กœ JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค. JVM์ด ์ฝ์€ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€, ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ ์ฝ”๋“œ, ์ •์ (static) ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ์˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋“ฑ์„ ๋ณด๊ด€ํ•จ

 

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์‹คํ–‰ ๊ณผ์ •

  1. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด JVM์€ OS๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”๋กœํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ณ , ํ• ๋‹น ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šฉ๋„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•œ๋‹ค.
  2. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ(javac)๊ฐ€ ์ž๋ฐ” ์ฝ”๋“œ(.java)๋ฅผ ์ฝ์–ด ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๋กœ ๋ณ€ํ™˜์‹œํ‚จ๋‹ค.
  3. ํด๋ž˜์Šค ๋กœ๋”๋Š” classํŒŒ์ผ๋“ค์„ JVM์œผ๋กœ ๋กœ๋”ฉํ•œ๋‹ค.
  4. ๋กœ๋”ฉ๋œ classํŒŒ์ผ๋“ค์€ ์‹คํ–‰ ์—”์ง„(Execution engine)์„ ํ†ตํ•ด์„œ ํ•ด์„๋œ๋‹ค.
  5. ํ•ด์„๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” Runtime Data Areas(๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ)์— ๋ฐฐ์น˜๋˜์–ด ์‹ค์งˆ์ ์ธ ์ˆ˜ํ–‰์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด๋Ÿฌํ•œ ์‹คํ–‰๊ณผ์ • ์†์—์„œ JVM์€ ํ•„์š”์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๋‚˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ปดํŒŒ์ผ ํ•œ๋‹ค = .java ํŒŒ์ผ์„ .class(๋ฐ”์ดํŠธ์ฝ”๋“œ)๋กœ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

์ฐธ๊ณ 

'๐Ÿ’Ž > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] ์ŠคํŠธ๋ฆผ Stream  (0) 2021.07.28
[Java] ์ œ๋„ค๋ฆญ(Generic)  (0) 2021.07.28
[Java] Primitive type vs Reference type  (0) 2021.04.18
[Java] HashMap, LinkedHashMap, TreeMap, Hashtable ์ฐจ์ด  (0) 2021.04.03
[Java] ==, equals, instanceof  (0) 2020.09.09

๋Œ“๊ธ€