๐Ÿ“ Language/Java

[Java] JVM(Java Virtual Machine) ์ด๋ž€?

Boom's 2024. 1. 13. 09:00
๋ฐ˜์‘ํ˜•

 

1. JVM(Java Virtual Machine)


  • ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์•ฝ์ž๋กœ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด
  • ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด ์ฝ์–ด ๋“ค์—ฌ, ์ž๋ฐ” API์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• 
  • JAVA์™€ OS ์‚ฌ์ด์— ์ค‘๊ฐœ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰, JAVA๊ฐ€ OS์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ์‹คํ–‰
  • Garbage Collection, ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋„ ํ•˜๋ฉฐ ์ตœ์ ํ™” ์ˆ˜ํ–‰

 

2. Java ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ˆœ์„œ


์ถœ์ฒ˜ : https://www .nowwatersblog.com/cs/JVM

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

 

3. JVM ๊ตฌ์„ฑ


  1. Class Loader (ํด๋ž˜์Šค ๋กœ๋”)
    • Java๋Š” ๋™์ ์œผ๋กœ ํด๋ž˜์Šค(.class ํŒŒ์ผ)๋ฅผ ์ฝ์–ด์˜ค๋ฏ€๋กœ, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘์ธ Runtime์—์„œ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ JVM๊ณผ ์—ฐ๊ฒฐ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋™์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•ด์ฃผ๋Š” ์—ญํ• 
    • Java์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด .javaํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ  ์ด๊ฒƒ์„ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผํ•˜๋ฉด .classํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”๋ฐ ํด๋ž˜์Šค ๋กœ๋”๋Š” .class ํŒŒ์ผ์„ ๋ฌถ์–ด์„œ JVM์ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ Runtime Data Area๋กœ ๋กœ๋”ฉ
  2. Exectuion Engine (์‹คํ–‰ ์—”์ง„)
    • ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ์—ญํ• 
    • Class Loader๊ฐ€ JVM๋‚ด์˜ Runtime Data Area์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋ฅผ ๋ฐฐ์น˜์‹œํ‚ค๋ฉด Exectuon Engine(์‹คํ–‰ ์—”์ง„)์— ์˜ํ•ด ์‹คํ–‰
    • ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ๊ณ„๊ฐ€ ๋ฐ”๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๊ธฐ์ˆ ๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์—”์ง„์€ ์ด ์•„๋น„ํŠธ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ JVM ๋‚ด๋ถ€์—์„œ ๊ธฐ๊ณ„๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ
    • Interpreter
      • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
      • ๋‹จ, ์ „์ฒด์ ์ธ ์‹คํ–‰ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.
    • JIT(Just-In-Time) Compiler
      • ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter)์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
      • ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์ ์ ˆํ•œ ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•ด Native Code๋กœ ๋ณ€๊ฒฝ, ์ดํ›„์—๋Š” ๋”์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ… ํ•˜์ง€ ์•Š๊ณ  Native Code๋กœ ์ง์ ‘ ์‹คํ–‰ ํ•˜๋Š” ๋ฐฉ์‹
      • Native Code๋Š” ์บ์‹œ(Cache)์— ๋ณด๊ด€ํ•ด ์ดํ›„ ์ปดํŒŒ์ผ ์‹œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์ปดํŒŒ์ผ, ๋‚˜๋จธ์ง€๋Š” ์บ์‹ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰
  3. Garbage Collector (๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ)
    • JVM์€ Garbage Collector(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ)๋ฅผ ์ด์šฉํ•ด ๋”๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™ ํšŒ์ˆ˜
    • Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ƒ์„ฑ(์ ์ œ)๋œ ๊ฐ์ฒปใ„น ์ค‘์— ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ ํ›„ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• 
    • GC ์—ญํ• ์€ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์€ ์ผ์‹œ ์ •์ง€ ์ƒํƒœ

 

4. Runtime Data Area


์ถœ์ฒ˜ :  https://www.javacodegeeks.com/2018/04/jvm-architecture-jvm-class-loader-and-runtime-data-areas.html

  • ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด OS์—์„œ ํ• ๋‹น ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ ์žฌํ•˜๋Š” ์˜์—ญ

๋ชจ๋“  ์Šค๋ ˆ๋“œ(Thread)๊ฐ€ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉ (GC์˜ ๋Œ€์ƒ)

  • ํž™ ์˜์—ญ(Heap Area)
  • ๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area)

โžก๏ธ JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ, JVM์ด ์ข…๋ฃŒ๋˜๋ฉด ํ•ด์ œ

 

์Šค๋ ˆ๋“œ(Thread)๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ

  • ์Šคํƒ ์˜์—ญ(Stack Area)
  • PC ๋ ˆ์ง€์Šคํ„ฐ (PC Register)
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ (Native Method Stack)

โžก๏ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ƒ์„ฑ, ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด์ œ

 

 

4-1. ํž™ ์˜์—ญ (Heap Area)

  • Runtime์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ
  • new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜๋ฉด ํž™ ์˜์—ญ์— ์ €์žฅ
  • ํ• ๋‹น๋œ ๊ฐ์ฒด๋Š” ์ง์ ‘ ํ•ด์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ, ์ฃผ๊ธฐ์ ์œผ๋กœ GC๊ฐ€ ์ œ๊ฑฐ

 

4-2.  ๋ฉ”์„œ๋“œ ์˜์—ญ (Method Area)

  • ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์ ‘๊ทผ ์ œ์–ด์ž ์ •๋ณด์™€ ๊ฐ™์€ ํ•„๋“œ ์ •๋ณด๋“ค๊ณผ ๋ฉ”์„œ๋“œ ์ •๋ณด Constant Pool, static ๋ณ€์ˆ˜, final class ๋“ฑ์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ

 

4-3.  ์Šคํƒ ์˜์—ญ (Stack Area)

  • ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ), ๋ฆฌํ„ด ๊ฐ’, ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ž„์‹œ ๊ฐ’ ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ์˜์—ญ

 

4-4.  PC ๋ ˆ์ง€์Šคํ„ฐ (PC Register)

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

 

4-5. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ (Native Method Stack)

  • ์ž๋ฐ” ์ด์™ธ์˜ ์–ธ์–ด(C, C++ ๋“ฑ)๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, Native Method Stack์ด ํ• ๋‹น๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์ธ C ์Šคํƒ์„ ์‚ฌ์šฉ

 

 

๋ฐ˜์‘ํ˜•