๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
F-Lab Mentoring

[F-Lab Mentoring] JVM 1ํƒ„

by ๊ทคํ”ผํ‚ค 2025. 8. 31.

๐Ÿ–ฅ JVM์˜ ๊ตฌ์„ฑ์š”์†Œ

JVM์€ javac๋กœ ๋ณ€ํ™˜๋œ "์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ (.class) "๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ ์ปดํ“จํ„ฐ

1. ํด๋ž˜์Šค ๋กœ๋” ์‹œ์Šคํ…œ

  • ํด๋ž˜์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋กœ๋“œํ•˜๋Š” ์—ญํ• 
  • JVM์€ ๋ถ€๋ชจ ์šฐ์„ (Parent-First) ์œ„์ž„ ๋ชจ๋ธ๋กœ ๋กœ๋”ฉ
    ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋จผ์ € ๋ถ€๋ชจ ๋กœ๋”์—๊ฒŒ ์œ„์ž„ํ•˜๊ณ , ๋ถ€๋ชจ๊ฐ€ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ž์‹ ์ด ์ง์ ‘ ๋กœ๋“œ

 

2. ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ

  • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๊ณต๊ฐ„(Stack, PC, Native Stack)๊ณผ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ณต๊ฐ„(Heap, Metaspace)์œผ๋กœ ๋‚˜๋‰จ

 

3. ์‹คํ–‰ ์—”์ง„

  • ๋กœ๋“œ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ์‹คํ–‰ (interpreter, JIT Compiler, Garbage Collector)
        - Interpreter: ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ํ•ด์„ํ•˜๋ฉฐ ์‹คํ–‰
        - JIT Compiler: ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™”
        - Garbage Collector: ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” Heap ๊ฐ์ฒด๋ฅผ ์ˆ˜๊ฑฐ

 

4. ๋„ค์ดํ‹ฐ๋ธŒ ์ธํ„ฐํŽ˜์ด์Šค

  • JVM๊ณผ OS/ํ•˜๋“œ์›จ์–ด ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์›
  • native ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ๋ฉ”์„œ๋“œ๋Š” ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ OS ๋ ˆ๋ฒจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(C/C++ ๋“ฑ)๋ฅผ ํ˜ธ์ถœ
  • Native Method Libraries๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ

 

Q. ๋„ค์ดํ‹ฐ๋ธŒ(Native)๋ž€?

  • ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ = ์ž๋ฐ”๊ฐ€ ์•„๋‹Œ OS/CPU์šฉ ๊ธฐ๊ณ„์–ด๋กœ ์ง์ ‘ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธ
  • ๋Œ€๋ถ€๋ถ„ C/C++๋กœ ๊ตฌ์„ฑ. (์˜ˆ: OpenSSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, OS ์‹œ์Šคํ…œ ์ฝœ)
  • ๊ทธ๋ž˜์„œ native ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ์ž๋ฐ” ๋ฉ”์„œ๋“œ๋Š” ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ OS ๋ ˆ๋ฒจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(C ๋“ฑ)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์˜๋ฏธ
    ๐Ÿ‘‰  “๋„ค์ดํ‹ฐ๋ธŒ”๊ฐ€ ๊ณง “C”๋ฅผ ๋œปํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๊ณ , ๋ณดํ†ต C/C++๋กœ ์ž‘์„ฑ๋œ OS ์—ฐ๋™ ์ฝ”๋“œ๋ผ๋Š” ๊ฑธ ์˜๋ฏธ

 


 

๐Ÿ”’ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ๋ถ„

JVM์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ๋Š” "๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ"
์—ฌ๊ธฐ์„œ๋Š” <๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ>๊ณผ <์Šค๋ ˆ๋“œ ๋ณ„ ํ• ๋‹น๋˜๋Š” ์˜์—ญ>์œผ๋กœ ๊ตฌ๋ถ„

 

<๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ>

1. ๋ฉ”์„œ๋“œ ์˜์—ญ (HotSpot์—์„œ๋Š” Metaspace)

  • JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๊ณต๊ฐ„์ด๋ฉฐ ํด๋ž˜์Šค ๋ฐ์ดํ„ฐ(๋ฐ”์ดํŠธ ์ฝ”๋“œ)๊ฐ€ ์—ฌ๊ธฐ์— ์ €์žฅ
    ๐Ÿ‘‰  ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ ์˜ฌ๋ผ๊ฐ€๋Š” ํด๋ž˜์Šค ๊ด€๋ จ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ
  • ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€(RCP), ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๊ณ  ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ 
    (โ€ป static ํ•„๋“œ “๊ฐ’”์€ Heap์˜ Class<T> ๊ฐ์ฒด์— ์ €์žฅ)
  • Method Area/Metaspace์—๋Š” static ๋ณ€์ˆ˜์˜ ์ •์˜์— ๋Œ€ํ•œ ์ •๋ณด(“static ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค”๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)๊ฐ€ ์˜ฌ๋ผ๊ฐ
    static ๋ณ€์ˆ˜์˜ ์‹ค์ œ ๊ฐ’์€ Heap์˜ Class<T> ๊ฐ์ฒด ์•ˆ์— ์ €์žฅ๋จ!
    ๐Ÿ‘‰  static ๋ณ€์ˆ˜๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” Method Area, ์‹ค์ œ HotSpot ๊ตฌํ˜„์—์„œ๋Š” Heap(Class ๊ฐ์ฒด)์— ๊ฐ’ ์ €์žฅ
[Method Area / Metaspace]
   โ”œโ”€ Class A Metadata
   โ”‚     โ”œโ”€ static ํ•„๋“œ๋“ค
   โ”‚     โ”œโ”€ ๋ฉ”์„œ๋“œ/ํ•„๋“œ ์ •๋ณด
   โ”‚     โ””โ”€ Runtime Constant Pool (ํด๋ž˜์Šค A ์ „์šฉ)
   โ”‚            โ”œโ”€ "Hello" → (์‹คํ–‰๋˜๋Š” ์‹œ์ ์— Heap์˜ String ๊ฐ์ฒด ์ฐธ์กฐ)
   โ”‚            โ”œโ”€ ์ˆซ์ž 123
   โ”‚            โ””โ”€ ๋ฉ”์„œ๋“œ ํ•ธ๋“ค ์‹ฌ๋ณผ ๋“ฑ
   โ”œโ”€ Class B Metadata
   โ”‚     โ””โ”€ Runtime Constant Pool (ํด๋ž˜์Šค B ์ „์šฉ)
   ...
  • ๊ตฌ์„ฑ์š”์†Œ
    1) ํด๋ž˜์Šค ์ด๋ฆ„, ๋ถ€๋ชจ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค ์ •๋ณด
    2) ๋ฉ”์„œ๋“œ/ํ•„๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜(ํƒ€์ž…, ์ ‘๊ทผ ์ œ์–ด์ž ๋“ฑ)

    3) ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€(Runtime Constant Pool)          ← ๊ฐ ํด๋ž˜์Šค๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ
        . ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ, .class ํŒŒ์ผ ์•ˆ์— ์žˆ๋˜ Constant Pool ์ •๋ณด๋ฅผ JVM ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์˜ฌ๋ ค๋†“๊ณ , ํ•„์š”ํ•˜๋ฉด ํž™ ๊ฐ์ฒด(์˜ˆ: String ๋ฆฌํ„ฐ๋Ÿด) ์ฐธ์กฐ๋„ ๊ฐ™์ด ์ €์žฅ
              - ์‹ฌ๋ณผ(Symbol): ํด๋ž˜์Šค ์ด๋ฆ„, ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ํ•„๋“œ ์ด๋ฆ„ ๊ฐ™์€ “๋ฌธ์ž์—ด ์‹๋ณ„์ž”
              - ๋ฆฌํ„ฐ๋Ÿด(Literal): ์ˆซ์ž 10, ๋ฌธ์ž์—ด "Hello", ์ƒ์ˆ˜ ๊ฐ’ ๊ฐ™์€ ๊ฒƒ

              "Hello"๋ผ๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์ด ์ฝ”๋“œ์— ๋“ฑ์žฅํ•˜๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ํ’€ ํ•ญ๋ชฉ์— "Hello"๋ผ๋Š” ์—”ํŠธ๋ฆฌ๊ฐ€ ๊ธฐ๋ก๋จ
              ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€์˜ "Hello" = ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœ “์ƒ์ˆ˜/๊ธฐํ˜ธ” ์ •๋ณด
              ์‹คํ–‰ ์ค‘ ์‚ฌ์šฉ๋  ๋•Œ (constant pool entry๊ฐ€ resolve๋  ๋•Œ_)
                   → Heap์˜ String ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ๋˜์–ด, ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ(์ฃผ์†Œ๊ฐ’)๋ฅผ ๋“ค๊ณ  ์žˆ๋Š” ์Šฌ๋กฏ์ด ๋จ.

              ์ฒ˜์Œ์—๋Š” ๋ชฉ๋ก, ํ•˜์ง€๋งŒ ์‹ค์ œ ๋Ÿฐํƒ€์ž„์—๋Š” “๋ชฉ๋ก + Heap ๊ฐ์ฒด ์ฐธ์กฐ”๋กœ ๋™์ž‘.
              ๐Ÿ‘‰  RCP๋Š” ๋‹จ์ˆœ ๊ฐ’ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋™์  ์—ฐ๊ฒฐ/ํ•ด์„์„ ์œ„ํ•œ ํ…Œ์ด๋ธ”

         . ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€์€ ๋‹จ์ˆœํ•œ ๊ฐ’ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ, JVM์ด ๋™์  ๋ฐ”์ธ๋”ฉ(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์—ฐ๊ฒฐ), ํ•„๋“œ ์ฐธ์กฐ ํ•ด์„, ํด๋ž˜์Šค ์ฐธ์กฐ ํ•ด์„ ๊ฐ™์€ ์ž‘์—…ํ•  ๋•Œ๋„ ์‚ฌ์šฉ
         . JVM์ด ํด๋ž˜์Šค ๋™์ž‘์„ “ํ•ด์„ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ”

    4) static ๋ณ€์ˆ˜(์ •์  ํ•„๋“œ)
    5) ๋ฉ”์„œ๋“œ ์ฝ”๋“œ ์ž์ฒด(JIT ์ด์ „์—๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ)

 

Q. HotSpot์ด๋ž€?

  • JVM(Java Virtual Machine)์˜ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜
    OpenJDK = HotSpot์ด ๊ธฐ๋ณธ ํƒ‘์žฌ
  • HotSpot JVM์˜ ํŠน์ง•์€ JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค๋Š” ์ .
    → ๊ทธ๋ž˜์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ณด๋‹ค ๋น ๋ฅด๊ณ , ์ •์  ์ปดํŒŒ์ผ๋ณด๋‹ค๋„ ์ƒํ™ฉ์— ๋งž์ถฐ ์ตœ์ ํ™” ๊ฐ€๋Šฅ.
  • HotSpot = ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์บ์น˜ํ•ด์„œ ์ตœ์ ํ™”ํ•˜๋Š” JVM.
  • JVM = ์—ฌ๋Ÿฌ GC ์—”์ง„์„ ํ’ˆ๊ณ  ์žˆ๋Š” ํ”Œ๋žซํผ
    ์˜ˆ) Serial GC, Parallel GC, CMS (deprecated), G1GC, ZGC, Shenandoah
  • ํ•˜๋‚˜์˜ JVM ํ”„๋กœ์„ธ์Šค์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ GC๋ฅผ ํ˜ผ์šฉํ•  ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ ์‹คํ–‰ํ•  ๋•Œ ํ•˜๋‚˜์˜ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉ
  • HotSpot JVM์€ ๋ฒ„์ „์— ๋”ฐ๋ผ ๊ธฐ๋ณธ GC๊ฐ€ ๋‹ค๋ฅด๋‹ค
    Java 8 → Parallel GC
    Java 9 ์ดํ›„ → G1GC
    Java 11/17 ์ดํ›„ → G1GC ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ, ํ•˜์ง€๋งŒ ZGC/Shenandoah๋„ ์„ ํƒ ๊ฐ€๋Šฅ

 

2. ํž™ ์˜์—ญ (Heap)

  • ์‹คํ–‰ ์ค‘์— ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด ์ €์žฅ๋˜๋Š” ์˜์—ญ, ์ž๋™ ์ดˆ๊ธฐํ™” ๋ฐœ์ƒ
  • new ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜ (Reference Type์— ํ•ด๋‹น - class, interface, enum, Array)
  • GC(Garbage Collector)์˜ ํƒ€๊ฒŸ์ด ๋˜๋Š” ์˜์—ญ์ด๋ฏ€๋กœ(ํ• ๋‹น ํ•ด์ œ) GC๋ฅผ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ Young/Old Region ์œผ๋กœ ๋‚˜๋‰˜์–ด์ง
    ๐Ÿ‘‰  HotSpot์—์„œ๋Š” Eden/Survivor/Old Region ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ
  • ๊ตฌ์„ฑ์š”์†Œ
         1) ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ํ’€ (String Literal Pool = Intern Pool)
                ํž™ ์•ˆ์—์„œ ํ•ด์‹œํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ „์—ญ ์บ์‹œ
                "Hello" ๊ฐ™์€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์ด ์‹ค์ œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ ธ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
                ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ๊ณต์œ ํ•œ๋‹ค. (ํด๋ž˜์Šค๋ณ„๋กœ ๋”ฐ๋กœ ์žˆ์ง€ ์•Š์Œ)
                "Hello"๊ฐ€ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๋“ฑ์žฅํ•ด๋„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑ๋˜๊ณ , ๊ทธ ์ฐธ์กฐ๊ฐ€ ์ƒ์ˆ˜ ํ’€ ํ•ญ๋ชฉ์— ์—ฐ๊ฒฐ
  • String s = "Hello";
          "Hello" ๋ฌธ์ž์—ด์€ ํž™(Heap)์— String ๊ฐ์ฒด๋กœ ์กด์žฌํ•จ
          ๊ทธ๋Ÿฐ๋ฐ ์ด ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ(ํฌ์ธํ„ฐ)๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€ ์•ˆ์—๋„ ๋“ฑ๋ก
          → ๊ทธ๋ž˜์„œ "Hello"๋ผ๋Š” ๋ฆฌํ„ฐ๋Ÿด์€ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์—์„œ ๊ณต์œ  ๊ฐ€๋Šฅ
  • static์€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ “์ •์˜”๊ฐ€ Metaspace์— ์˜ฌ๋ผ๊ฐ„๋‹ค.
    ๋‹จ, static ํ•„๋“œ์˜ ์‹ค์ œ ๊ฐ’ ์ €์žฅ์†Œ๋Š” Heap์˜ Class<T> ๊ฐ์ฒด ๋‚ด๋ถ€๋‹ค.
    static ํ•„๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋Š” Class<T> ๊ฐ์ฒด(Heap)๋ฅผ ํ†ตํ•ด GC Root๋กœ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•˜๋‹ค.
          ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ ๊ฐ์ฒด๋Š” Heap์— ์กด์žฌ
          static List<String> cache = new ArrayList<>();
                ์ด cache๋Š” GC Root๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ ๋๋‚  ๋•Œ๊นŒ์ง€ ์•ˆ ์ง€์›Œ์ง(๋ช…์‹œ์ ์œผ๋กœ null ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด).
                ๋˜๋Š” ํด๋ž˜์Šค ์–ธ๋กœ๋”ฉ(class unloading) ์ด ์ผ์–ด๋‚˜ ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ GC ๋Œ€์ƒ์ด ๋˜๊ณ , ๊ทธ ํด๋ž˜์Šค์˜ static ํ•„๋“œ ์ฐธ์กฐ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง
  • String a = "Hello";  
    String b = new String("Hello");
           a: ๋ฆฌํ„ฐ๋Ÿด ํ’€์„ ํ†ตํ•ด Heap์˜ intern table์— ์žˆ๋Š” ๊ฐ์ฒด ์ฐธ์กฐ → ๊ณต์œ .
           b: Heap์— ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๋ฅผ ๊ฐ•์ œ๋กœ ์ƒ์„ฑ → a์™€ b๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด.
           ํ•˜์ง€๋งŒ b.intern()์„ ํ˜ธ์ถœํ•˜๋ฉด b๋„ intern table์˜ "Hello" ์ฐธ์กฐ๋ฅผ ๋Œ๋ ค์คŒ → a์™€ ๋™์ผํ•ด์ง.

 

<์Šค๋ ˆ๋“œ๋ณ„ ํ• ๋‹น๋˜๋Š” ์˜์—ญ>

3. ์ž๋ฐ” ์Šคํƒ

  • ์Šค๋ ˆ๋“œ์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์œผ๋กœ ์Šคํƒ ํ”„๋ ˆ์ž„์€ ์ƒ์„ฑ๋˜์ง€๋งŒ ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ์ž๋™ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ์šฉ ์ „ ๋ฐ˜๋“œ์‹œ ๊ฐ’ ํ• ๋‹น ํ•„์š”(ํŠนํžˆ primitive)
  • ์ง€์—ญ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ
  • ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋˜๋ฉด ์‚ฌ๋ผ์ง (ํ• ๋‹น ํ•ด์ œ)!

 

4. ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ (PC Register)

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

 

5. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ

  • Java๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„
  • Java Native Interface๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๋Š” C/C++ ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„
    ๐Ÿ‘‰  OS/๋„ค์ดํ‹ฐ๋ธŒ ABI ๊ทœ์น™์— ๋งž์ถฐ ์ฝœ ์Šคํƒ/๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ž๋ฐ” ์Šคํƒ๊ณผ ๋ถ„๋ฆฌ

 

Q. ์™œ JNI ํ˜ธ์ถœ์ด ํ•„์š”ํ•œ๊ฐ€?

  • ์ž๋ฐ”๋งŒ์œผ๋กœ OS ๊ธฐ๋Šฅ์„ ๋‹ค ๋‹ค๋ฃฐ ์ˆ˜๋Š” ์—†์Œ (์˜ˆ: ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ, ์‹œ์Šคํ…œ ์ฝœ, GUI)
  • ๊ณ ์„ฑ๋Šฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(C/C++๋กœ ์ž‘์„ฑ๋œ DB ๋“œ๋ผ์ด๋ฒ„, ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด
  • JVM ๋‚ด๋ถ€ ๋™์ž‘(์Šค๋ ˆ๋“œ ์ƒ์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋“ฑ)๋„ ์‚ฌ์‹ค OS API ํ˜ธ์ถœ์ด ํ•„์š”

 

Q. ABI(Application Binary Interface)

  • OS์™€ CPU๊ฐ€ ์ •ํ•œ “๋ฐ”์ด๋„ˆ๋ฆฌ ๋ ˆ๋ฒจ ์•ฝ์†” >> Windows x64, Linux x64, ARM ๋“ฑ๋งˆ๋‹ค ํ˜ธ์ถœ ๊ทœ์•ฝ(calling convention)์ด ๋‹ค๋ฆ„.
  • ์ž๋ฐ” ์Šคํƒ ํ”„๋ ˆ์ž„์€ JVM ์ „์šฉ ๊ทœ์•ฝ์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํƒ ํ”„๋ ˆ์ž„๊ณผ ์„ž์–ด ์“ฐ๋ ค๋ฉด ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”

 

Q. Person p = new Person("Euiseon", 35);

  • ์ด ๋•Œ, ๋ณ€์ˆ˜ p๋Š” ์Šคํƒ์— ์ €์žฅ์ด ๋จ.
  • new Person("์ด์˜์„ ", 35)์ด๋ผ๋Š” ์‹ค์ œ Person ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋Š” ํž™์— ์ €์žฅ์ด ๋จ

 

Q. ๊ทธ๋Ÿฌ๋ฉด ๋ณ€์ˆ˜ p๊ฐ€ ์ €์žฅ๋œ ์Šคํƒ์˜ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ์ฃผ์†Œ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š”๊ฑด๊ฐ€?

  • ์ž๋ฐ” ์–ธ์–ด ๊ด€์ ์—์„œ p๋Š” ๊ฐ์ฒด์˜ ์ฐธ์กฐ(reference)๋ฅผ ์ €์žฅ == ํž™ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ผ์ข…์˜ ์ฃผ์†Œ๊ฐ’(raw pointer or compressed OOP)
    ๐Ÿ‘‰  ์ž๋ฐ” ์–ธ์–ด์—์„œ๋Š” "์ฃผ์†Œ๊ฐ’"์ด๋ผ๋Š” ํ‘œํ˜„ ๋Œ€์‹  ์ฐธ์กฐ๋ผ๋Š” ๊ฐœ๋… ์‚ฌ์šฉ

 


 

๐ŸŽค classloader๋ž€?

  • .class ํŒŒ์ผ(๋ฐ”์ดํŠธ์ฝ”๋“œ)์„ ์ฐพ์•„์„œ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ(Method Area/Metaspace)์— ์ ์žฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” JVM์˜ ๊ตฌ์„ฑ ์š”์†Œ
  • ๋กœ๋”ฉ๋œ ํด๋ž˜์Šค๋Š” JVM ์•ˆ์—์„œ java.lang.Class ๊ฐ์ฒด๋กœ ํ‘œํ˜„
    ๐Ÿ‘‰  ์šฐ๋ฆฌ๊ฐ€ SomeClass.class๋ผ๊ณ  ์“ธ ๋•Œ์˜ ๊ทธ ๊ฐ์ฒด!
  • JVM์—๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ๋กœ๋”๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๋ถ€๋ชจ ์šฐ์„ (Parent-First) ์œ„์ž„ ๋ชจ๋ธ์ด๋ผ๋Š” ๊ทœ์น™์œผ๋กœ ์ˆœ์ฐจ์  ๋กœ๋”ฉ
  • ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด A๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ฒ˜์Œ ์ฐธ์กฐํ•˜๋ฉด, JVM์€ ํด๋ž˜์Šค ๋กœ๋” ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ .class๋ฅผ ์ฝ์–ด์˜จ ๋’ค, JVM ๋‚ด๋ถ€์— ๋กœ๋”ฉ
  • ์ผ๋ฐ˜ ์ฒด์ธ: Bootstrap → Platform(Java 9+) → Application(System) → (์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๋”)

 

<๊ตฌ์„ฑ์š”์†Œ>

1. Bootstrap ClassLoader

  • ์ž๋ฐ” ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(java.lang.*, java.util.*)๋ฅผ ๋กœ๋“œ.
  • C/C++๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ผ์„œ ์ž๋ฐ” ๊ฐ์ฒด๋กœ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ.
  • Bootstrap ClassLoader๋Š” “JVM ๋ถ€ํŒ…(bootstrap) ๋‹จ๊ณ„์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋กœ๋”” (์›น ๊ฐœ๋ฐœ์˜ CSS ํ”„๋ ˆ์ž„์›Œํฌ Bootstrap๊ณผ ์ „ํ˜€ ๊ด€๊ณ„์—†์Œ)

2. Platform ClassLoader (Java 9+)

  • JDK์˜ ํ‘œ์ค€ ๋ชจ๋“ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์˜ˆ: java.sql.*, java.xml.*

3. Application(System) ClassLoader

  • ๊ฐœ๋ฐœ์ž๊ฐ€ classpath์— ๋„ฃ์€ .class/JAR (์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ JAR)

4. ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๋”

  • ํ•„์š”ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ํ™•์žฅํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ. (์˜ˆ: ๋„คํŠธ์›Œํฌ์—์„œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ, ์•”ํ˜ธํ™”๋œ JAR ํ•ด์ œ ํ›„ ๋กœ๋”ฉ ๋“ฑ)

 

<ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ณผ์ •>

1. ๋กœ๋”ฉ (Loading)

  • ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ .class ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ JVM ๋‚ด๋ถ€ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜
  • ์ด๋•Œ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ(ํ•„๋“œ, ๋ฉ”์„œ๋“œ, ์ƒ์ˆ˜ํ’€ ๋“ฑ)๊ฐ€ ๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area/Metaspace)์— ์˜ฌ๋ผ๊ฐ
    ๐Ÿ‘‰  “A๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๋ฉค๋ฒ„๋ฅผ ๊ฐ–๋Š”๋‹ค”๋ผ๋Š” ๋ฉ”ํƒ€์ •๋ณด๊ฐ€ ์ƒ๊น€

2. ๋งํฌ (Linking)

  • ๊ฒ€์ฆ(Verify): ๋ฐ”์ดํŠธ์ฝ”๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ์ค€๋น„(Prepare): static ๋ณ€์ˆ˜์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ• ๋‹น, ๊ธฐ๋ณธ๊ฐ’(0, null)์œผ๋กœ ์ดˆ๊ธฐํ™”
  • ํ•ด๊ฒฐ(Resolve): ์ƒ์ˆ˜ํ’€ ์ฐธ์กฐ๋ฅผ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๋กœ ์น˜ํ™˜ (ํ•„์š” ์‹œ์ ์— ์ง€์—ฐ๋˜๊ธฐ๋„ ํ•จ)

3. ์ดˆ๊ธฐํ™” (Initialization)

  • static ๋ณ€์ˆ˜์˜ ์‹ค์ œ ๊ฐ’ ํ• ๋‹น (์˜ˆ: static int i = 10;)
  • static ๋ธ”๋ก ์‹คํ–‰
  • ์ด ์‹œ์ ์— Heap์— Class<A> ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ผ์„œ, A.class๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
  • static ํ•„๋“œ ๊ฐ’๋“ค์€ ์ด Class<A> ๊ฐ์ฒด์˜ ํ•„๋“œ ์•ˆ์— ์ €์žฅ
๋กœ๋”ฉ/๋งํฌ
→ ๋ฉ”์„œ๋“œ ์˜์—ญ(Metaspace)์— ๋ฐ”์ดํŠธ์ฝ”๋“œ + ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ฌ๋ผ๊ฐ / static ๋ณ€์ˆ˜์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ• ๋‹น


์ดˆ๊ธฐํ™”
→ static ํ•„๋“œ์— ๊ฐ’ ์ฑ„์›Œ์ง
→ Heap์— Class<A> ๊ฐ์ฒด 1๊ฐœ๊ฐ€ ์ƒ์„ฑ
→ ์ด ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ A.class ๋ผ๊ณ  ์“ธ ๋•Œ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ

 

<Parent-first delegation model>

  • ํด๋ž˜์Šค ๋กœ๋”์˜ ๋™์ž‘ ๋ฐฉ์‹ (์—ฌ๋Ÿฌ ๋กœ๋”๊ฐ€ ๋™์‹œ์— ์žˆ์„ ๋•Œ ๋ˆ„๊ฐ€ ์ด ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ• ์ง€ ์ •ํ•˜๋Š” ๊ทœ์น™)
  • Bootstrap ClassLoader: rt.jar ๊ฐ™์€ JVM ํ•ต์‹ฌ ํด๋ž˜์Šค ๋กœ๋”ฉ (ex: java.lang.*)
    Platform ClassLoader : JDK ํ‘œ์ค€ ๋ชจ๋“ˆ(java.*)์„ ๋กœ๋”ฉ(Java 9+์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜)
    Application (System) ClassLoader: ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋กœ๋”ฉ (classpath ์ง€์ •๋œ ๊ฒƒ)
    ํ•„์š”ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ClassLoader๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • ์ž๋ฐ” ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋ถ€๋ชจ์—๊ฒŒ ๋จผ์ € ์œ„์ž„(Delegation)ํ•˜๊ณ , ๋ถ€๋ชจ๊ฐ€ ๋ชป ์ฐพ์•˜์„ ๋•Œ๋งŒ ์ž์‹ ์ด ์ง์ ‘ ๋กœ๋”ฉ
  • ๋™์ž‘ ์ˆœ์„œ
    ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด, ํ˜„์žฌ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋ถ€๋ชจ์—๊ฒŒ ๋จผ์ € ์š”์ฒญ
    ๋ถ€๋ชจ๊ฐ€ ๋˜ ๊ทธ ๋ถ€๋ชจ์—๊ฒŒ ์š”์ฒญ (์ตœ์ข…์ ์œผ๋กœ Bootstrap๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ)
    ๋ถ€๋ชจ ์ฒด์ธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ฐพ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
    ๋ถ€๋ชจ๋“ค์ด ๋ชป ์ฐพ์„ ๊ฒฝ์šฐ์—๋งŒ ์ž์‹ ๋กœ๋”๊ฐ€ ์ง์ ‘ ๋กœ๋”ฉ
    ์ฆ‰, “ํ•ญ์ƒ ์œ„์—์„œ๋ถ€ํ„ฐ ๋จผ์ € ์ฐพ์•„๋ณด๊ณ , ์—†์œผ๋ฉด ์•„๋ž˜๊ฐ€ ์ฑ…์ž„์ง„๋‹ค”๋Š” ์›๋ฆฌ

 

Q. ์™œ ์ด๋ ‡๊ฒŒ Parent Delegation์„ ์“ฐ๋Š”๊ฐ€?

  • ๋ณด์•ˆ: java.lang.String ๊ฐ™์€ ํ•ต์‹ฌ ํด๋ž˜์Šค๋Š” ๋ฌด์กฐ๊ฑด Bootstrap์—์„œ ๋กœ๋“œ → ๋ˆ„๊ตฐ๊ฐ€ ๋‚ด๊ฐ€ ๋งŒ๋“  String.class๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ ๋ถˆ๊ฐ€
  • ์ผ๊ด€์„ฑ: JVM ์–ด๋””์—์„œ ํ˜ธ์ถœํ•˜๋“  ๋™์ผํ•œ ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ClassLoader๊ฐ€ ๋กœ๋“œํ•œ ํ•˜๋‚˜์˜ Class ๊ฐ์ฒด๋งŒ ์กด์žฌํ•˜๋„๋ก ๋ณด์žฅ
  • ์œ ์—ฐ์„ฑ: ํ•„์š”ํ•˜๋‹ค๋ฉด ํŠน์ • ํด๋ž˜์Šค๋งŒ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๋”๋กœ ์ปค์Šคํ…€ํ•˜๊ฒŒ ๋กœ๋“œ ๊ฐ€๋Šฅ


Q. Human ํด๋ž˜์Šค๋ฅผ ๋‚ด๊ฐ€ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด?

  • ์‹คํ–‰ ์ค‘ new Human() ํ˜ธ์ถœ → JVM์€ Human ํด๋ž˜์Šค ๋กœ๋”ฉ ์—ฌ๋ถ€ ํ™•์ธ
    ์•„์ง ๋กœ๋“œ ์•ˆ ๋จ → Application ClassLoader๊ฐ€ ๋ถ€๋ชจ(Bootstrap, Platform)์—๊ฒŒ ์œ„์ž„
    ๋ถ€๋ชจ ๋กœ๋”๋“ค์€ Human์„ ๋ชป ์ฐพ์Œ → Application ClassLoader๊ฐ€ classpath์—์„œ Human.class๋ฅผ ์ฐพ์•„ ๋กœ๋“œ
    JVM ๋ฉ”ํƒ€์ŠคํŽ˜์ด์Šค์— ํด๋ž˜์Šค ์ •๋ณด๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ณ , Human ํด๋ž˜์Šค์˜ static ๋ธ”๋ก/ํ•„๋“œ ์ดˆ๊ธฐํ™”๊ฐ€ ์‹คํ–‰๋จ

 


 

โณ ์‹คํ–‰ ์—”์ง„์ด๋ž€?

  • ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰
  • Tiered Compilation ์‚ฌ์šฉ: JVM์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ๋จผ์ € ์‹คํ–‰ → ์ผ์ • ๊ธฐ์ค€(ํ˜ธ์ถœ/๋ฃจํ”„ ์นด์šดํ„ฐ) ๋„˜์œผ๋ฉด JIT ์ปดํŒŒ์ผ ์ง„ํ–‰

1. interpreter

  • ์‹คํ–‰ ์ค‘์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ผ์ธ์”ฉ ์ฝ๊ณ  ์‹คํ–‰, ์†๋„๊ฐ€ ๋А๋ ค์ง€๋Š” ํ˜„์ƒ ์กด์žฌ (ํŠนํžˆ ๋ฐ˜๋ณต๋ฌธ)

2. JIT Compiler

  • ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํŒจํ„ด์„ ๋ถ„์„ํ•˜์—ฌ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ(ํ•ซ ์ŠคํŒŸ)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฉ”์„œ๋“œ ๋‹จ์œ„๋กœ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•จ
    ๐Ÿ‘‰  ์‹คํ–‰ ์ดˆ๋ฐ˜์—๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ํ˜ธ์ถœ/๋ฃจํ”„ ์นด์šดํ„ฐ๊ฐ€ ์ž„๊ณ„์น˜๋ฅผ ๋„˜์œผ๋ฉด Tiered JIT๊ฐ€ ๊ทธ ๋ฉ”์„œ๋“œ/๋ฃจํ”„๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ปดํŒŒ์ผํ•จ
  • ๋ฉ”์„œ๋“œ ๋‹จ์œ„์˜ ์ปดํŒŒ์ผ์€ ์‹คํ–‰ ํŒจํ„ด์— ๋”ฐ๋ผ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ (๋™์  ์–ธ์–ด์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•)
  • "์ž์ฃผ ์‹คํ–‰๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์˜์—ญ์„ ๋Ÿฐํƒ€์ž„ ์ค‘์— ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์‚ฌ์šฉ"

 

3. ๋Œ€ํ‘œ์ ์ธ ์ตœ์ ํ™” ์˜ˆ์‹œ

1) ์ธ๋ผ์ด๋‹(Inlining)

  • ์ž‘์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์—†์• ๊ณ  ์ง์ ‘ ์ฝ”๋“œ๋กœ ์น˜ํ™˜
  • int add(int a, int b) { return a+b; }
    int result = add(1,2);
    ์›๋ž˜๋ผ๋ฉด add ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜์ง€๋งŒ, JIT์€ ํ˜ธ์ถœ์„ ์—†์• ๊ณ  ๊ทธ๋ƒฅ int result = 1+2;๋กœ ์น˜ํ™˜!
    ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ ์ œ๊ฑฐ → ๋น ๋ฆ„
    ์ž‘์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜๋ณต ํ˜ธ์ถœ๋  ๋•Œ, ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์—†์• ๊ณ  ํ˜ธ์ถœ๋ถ€์— ์ฝ”๋“œ ์ž์ฒด๋ฅผ “์ง์ ‘ ๋ฐ•์•„ ๋„ฃ๋Š”” ์ตœ์ ํ™”

 

2) ํƒˆ๊ฐ€์ƒํ™”(Devirtualization)

  • ๊ฐ€์ƒ ํ˜ธ์ถœ์„ ์‹ค์ œ ํ˜ธ์ถœ๋กœ ๋ฐ”๊ฟ” ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ ์ œ๊ฑฐ
  • List<String> list = new ArrayList<>();
    list.add("A");
    ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ƒ์œผ๋กœ๋Š” List.add (์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ) → ๋Ÿฐํƒ€์ž„์— ์–ด๋–ค ๊ตฌํ˜„์ธ์ง€ ๋ชจ๋ฆ„
    ๊ทผ๋ฐ JIT์€ ์‹ค์ œ ๊ฐ์ฒด ํƒ€์ž…์ด ArrayList์ž„์„ ์•Œ๋ฉด, ๋ฐ”๋กœ ArrayList.add๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ตœ์ ํ™”
    ์ž๋ฐ”๋Š” ๋ณดํ†ต “๊ฐ€์ƒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ(virtual call)” ๋ฐฉ์‹์„ ์จ์š” → ๋Ÿฐํƒ€์ž„์— ์‹ค์ œ ํƒ€์ž…์„ ์ฐพ์•„ ํ˜ธ์ถœ
    JIT์€ ์‹คํ–‰ ์ค‘์— “ํ•ญ์ƒ ArrayList๋กœ๋งŒ ํ˜ธ์ถœ๋˜๋„ค?” ๊ฐ™์€ ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๋งค๋ฒˆ ๊ฐ€์ƒ ๋””์ŠคํŒจ์น˜ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ArrayList.add()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์น˜ํ™˜
    ๐Ÿ‘‰  “๊ฐ€์ƒ ํ˜ธ์ถœ์„ ์‹ค์ œ ํ˜ธ์ถœ๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฐ๋‹ค = ํƒˆ๊ฐ€์ƒํ™””

 

3) Escape Analysis + Scalar Replacement

  • ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๋Š” ๊ฐ์ฒด๋ผ๋ฉด ํž™ ๋Œ€์‹  ์Šคํƒ/๋ ˆ์ง€์Šคํ„ฐ์— ๋‘๊ฑฐ๋‚˜ ์•„์˜ˆ ํ•„๋“œ๋ฅผ ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ์ชผ๊ฐœ๋ฒ„๋ ค GC ๋ถ€๋‹ด์„ ์ค„์ž„
  • class Point { int x, y; }
    void foo() {
      Point p = new Point();
      p.x = 1; p.y = 2;
    }
    ๋ณดํ†ต new Point()๋Š” ํž™์— ๊ฐ์ฒด ์ƒ์„ฑ.
    ๊ทผ๋ฐ JIT์€ p๊ฐ€ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๊ณ  ์™ธ๋ถ€๋กœ “ํƒˆ์ถœ(escape)”ํ•˜์ง€ ์•Š๋Š” ๊ฑธ ์•Œ๋ฉด,
    ์•„์˜ˆ ํž™ ๊ฐ์ฒด๋ฅผ ์•ˆ ๋งŒ๋“ค๊ณ  ๊ทธ๋ƒฅ ๋กœ์ปฌ ๋ณ€์ˆ˜ 2๊ฐœ(int x, int y)๋กœ ์น˜ํ™˜
    ๐Ÿ‘‰  new์กฐ์ฐจ ์‚ฌ๋ผ์ง → ๊ฐ์ฒด๋ฅผ ์Šคํƒ/๋ ˆ์ง€์Šคํ„ฐ์—๋งŒ ๋‘๋Š” ๊ฒฝ์šฐ “ํž™์— ์•ˆ ๋งŒ๋“ค์–ด์„œ GC ๋ถ€๋‹ด ์ค„์–ด๋“ฆ”
  • Escape Analysis: ๊ฐ์ฒด๊ฐ€ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๊ณ  ๋ฐ”๊นฅ์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํž™์— ์•ˆ ๋งŒ๋“ค๊ณ  ์Šคํƒ/๋ ˆ์ง€์Šคํ„ฐ์—์„œ๋งŒ ์ฒ˜๋ฆฌ
  • Scalar Replacement: ์•„์˜ˆ ๊ฐ์ฒด๋ฅผ ์ชผ๊ฐœ์„œ ํ•„๋“œ๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ธ ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ์น˜ํ™˜

 

4) OSR(On-Stack Replacement)

  • ๊ธด ๋ฃจํ”„๋ฅผ ๋Œ๋‹ค๊ฐ€๋„ ๋„์ค‘์— ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์น˜ํ™˜ํ•ด ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ๋ฐ˜๋ณต๋ฌธ ๊ฐ™์€ ๊ฑด ์ฒ˜์Œ์—” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ๋Œ๋‹ค๊ฐ€ “์ถฉ๋ถ„ํžˆ ๋งŽ์ด ๋ฐ˜๋ณต๋˜๋ฉด” ๋ฃจํ”„ ์ค‘๊ฐ„์„ JIT์ด ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ
    ๊ธด ๋ฃจํ”„๋ผ๋„ ์‹คํ–‰ ๋„์ค‘์— ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์น˜ํ™˜ํ•ด์„œ ์†๋„ ๊ฐœ์„ .

 

 

๐Ÿ‘‰ ์‹คํ–‰ ์—”์ง„์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ JIT์„ ๋ณ‘ํ–‰ํ•˜์—ฌ  “์ฒ˜์Œ์—” ๋А๋ฆฌ๊ฒŒ ์‹œ์ž‘ → ์ ์  ๋นจ๋ผ์ง„๋‹ค”๋Š” ๊ฒŒ ์ž๋ฐ” ์‹คํ–‰ ํŠน์„ฑ
       == ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค.

'F-Lab Mentoring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[F-Lab Mentoring] JVM 2ํƒ„  (1) 2025.09.28

๋Œ“๊ธ€