JVM ๊ตฌ์กฐ

์œ ์žฌ๋ฏผยท2022๋…„ 10์›” 15์ผ
0

JVM (Java Virtual Machine)

๐Ÿ’ก OS์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ ‘๊ทผํ•ด์„œ Java์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์ƒ ํ”„๋กœ๊ทธ๋žจ

์ฆ‰, OS์™€ JAVA ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด์—์„œ Java Byte Code๋ฅผ OS์— ๋งž๊ฒŒ ํ•ด์„ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ž๋ฐ” ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด ์ฝ์–ด๋“ค์ด๊ณ , ์ž๋ฐ” API์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
-> ์ž๋ฐ”๋ฅผ OS ์œ„์—์„œ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ ๋จธ์‹ 

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๊ณผ์ •


Java์˜ ์†Œ์Šค์ฝ”๋“œ(์›์‹œ์ฝ”๋“œ)๋Š” CPU๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

๐Ÿ’ก ์ปดํŒŒ์ผ : ์–ด๋–ค ์–ธ์–ด์˜ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •

ํ•˜์ง€๋งŒ, ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ์ง์ ‘ ์ปดํŒŒ์ผ์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์›๋ณธ ์ฝ”๋“œ(*.java)๋ฅผ JVM์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(*.class)๋กœ ๋จผ์ € ๋ณ€ํ™˜๋œ๋‹ค. ์ด ๊ณผ์ •์€ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ด๋•Œ ๋ณ€ํ™˜๋œ bytecode๋Š” ๊ธฐ๊ณ„์–ด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ, OS์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, JVM์ด Byte code๋ฅผ OS์™€ ์ƒ๊ด€์—†์ด ํ•ด์„ํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ๊ทธ๋ž˜์„œ JVM์€ OS์— ์ข…์†๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ๋””๋ฐ”์ด์Šค๋“ ์ง€ ๊ด€๊ณ„์—†์ด ์ž๋ฐ” ํŒŒ์ผ์„ JVM์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

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

Class Loader

: RunTime ์‹œ์ ์— Java compiler๋ฅผ ํ†ตํ•ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•˜๋ฉฐ jar ํŒŒ์ผ ๋‚ด ์ €์žฅ๋œ ํด๋ž˜์Šค๋“ค์„ JVM ์œ„์— ํƒ‘์žฌํ•œ๋‹ค.

๐Ÿ’ก ๋Ÿฐํƒ€์ž„ : ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์‹œ๊ฐ„ (์ปดํŒŒ์ผ ํƒ€์ž„ -> ๋Ÿฐํƒ€์ž„)

Execution Engine

: Class Loader๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋œ ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ด ๊ณผ์ •์—์„œ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ(๊ธฐ๊ณ„์–ด)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ปดํŒŒ์ผ ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•œ๋‹ค. JVM์€ ๊ธฐ์กด์˜ Interpreter ๋ฐฉ์‹์œผ๋กœ ํ•œ ์ค„์”ฉ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜์—ฌ ์†๋„๊ฐ€ ๋Š๋ฆฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, JIT(Just-In Time) compiler ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด Bytecode๋ฅผ Nativecode(๊ธฐ๊ณ„์–ด)๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ƒ๊ธฐ๋Š” ๋น„์šฉ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Interpreter ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ผ์ • ๊ธฐ์ค€์ด ๋„˜์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด JIT compiler ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

Runtime Data Area

: JVM์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด OS๋กœ ๋ถ€ํ„ฐ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.

ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด ๋กœ๋“œํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•ด๋‹น ์˜์—ญ์— ๋ฐฐ์น˜ํ•œ๋‹ค.

1. PC Register

  • ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๊ณต๊ฐ„
  • ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š” ๊ณต๊ฐ„
  • JVM ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

2. JVM Stack

  • ์ง€์—ญ ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ ๊ฐ’ ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„

3. Native Method Stack

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ(๊ธฐ๊ณ„์–ด)์˜ ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์˜์—ญ

4. Method Area

  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ
  • ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์„œ๋“œ, ํ•„๋“œ, ์ „์—ญ ๋ณ€์ˆ˜ ๋“ฑ ์ €์žฅ

5. Heap

  • ๋Ÿฐํƒ€์ž„ ์‹œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ์˜์—ญ
  • Class์˜ instance๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Heap ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.

Garbage Collector

: JVM Heap ์˜์—ญ์—์„œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•ด์ฃผ๋Š” ํ”„๋กœ์„ธ์Šค

C์–ธ์–ด์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด free() ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ž๋ฐ” or ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์ œํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ์ง์ ‘ ํ•ด์ œํ•˜์ง€ ์•Š์•„๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” GC(Garbage Collector)๊ฐ€ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋™์ž‘ ๋ฐฉ์‹

  1. Stop the World
    • GC๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์ด ์ค‘๋‹จ๋œ๋‹ค.
  2. Mark and Sweep
    • Mark : ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‹๋ณ„
    • Sweep : ์‹๋ณ„๋œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

=> GC๋Š” ์Šคํƒ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜ ๋ฐ ๊ฐ์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

JVM ์ด๋ž€?
JVM ์ด๋ž€?
JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

profile
์œ ์žผ์ฝ”๋”ฉ

0๊ฐœ์˜ ๋Œ“๊ธ€