ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM ๋™์ž‘๊ณผ์ •
    ๐Ÿ’ป IT Study/Knowledge 2022. 5. 22. 20:27

     

    ์ž๋ฐ”์˜ ๋™์ž‘๊ณผ์ • ๋Œ€๋žต์ ์œผ๋กœ ์•Œ์•„๋ณด๊ธฐ 

    1. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ ์ž‘์„ฑํ•œ๋‹ค. 

    2. Java Compiler๊ฐ€ ์ž๋ฐ” Source File(*.java)์„ ์ปดํŒŒ์ผํ•˜์—ฌ Byte File(*.class)๋กœ ์ƒ์„ฑํ•œ๋‹ค.

    3. ์ปดํŒŒ์ผ๋œ Byte File(*.class)์„ JVM์˜ Class Loader์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

    4. Class Loader๋Š” ๋™์  ๋กœ๋”ฉ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ ๋กœ๋”ฉ ๋ฐ ๋งํฌํ•˜์—ฌ Run-time Data Area์— ์—…๋กœ๋“œํ•œ๋‹ค.

    5. Execution Engine์—์„œ JVM ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜จ Byte ์ฝ”๋“œ๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ํ•ด์„ํ•˜์—ฌ Binary Code๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

    6. Binary Code๋Š” Run-time Data Area์— ๋ฐฐ์น˜๋˜์–ด ์‹ค์งˆ์  ์ˆ˜ํ–‰์ด ์ด๋ฃจ์–ด์ง„๋‹ค. 


    Class Loader

    JVM์ด ๋™์ž‘ํ•˜๋‹ค๊ฐ€ ๋ฐ”์ดํŠธ ํŒŒ์ผ(.class)์„ ์ฐธ์กฐํ•˜๋Š” ์ˆœ๊ฐ„ ํด๋ž˜์Šค๋กœ๋”๋Š” ๋™์ ์œผ๋กœ ์ฝ์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๋ฉด์„œ JVM์— ๋งํฌ๋œ๋‹ค. 

    ํด๋ž˜์Šค ๋กœ๋”๋Š” ํฌ๊ฒŒ Loading > Linking > Initailization ์„ธ ๊ฐ€์ง€ ๋™์ž‘๊ณผ์ •์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

    Loading

    ๋ชจ๋“  ํด๋ž˜์Šค๋“ค์ด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด ๋กœ๋”ฉ๋˜์ง€ ์•Š๋Š”๋‹ค. 

    ํด๋ž˜์Šค ์ข…๋ฅ˜์™€ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์–ด๋–ค ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด ๋กœ๋“œ๋  ์ง€ ๊ฒฐ์ •๋œ๋‹ค. 

    ํด๋ž˜์Šค๋กœ๋”๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ด๋ค„์ ธ ์žˆ์–ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค. (why? ๋ชจ๋“ˆํ™” ๊ธฐ๋Šฅ, ํด๋ž˜์Šค ์ถฉ๋Œ ํ”ผํ•จ, ํšจ์œจ์  ์‚ฌ์šฉ …)

     

    1. BootStrapClassLoader :  jre/lib/rt.jar ํŒŒ์ผ์„ ๋กœ๋“œํ•œ๋‹ค. 

    2. ExtentionClassLoader : jre/lib/ext ํŒŒ์ผ์— ํฌํ•จ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋“œํ•œ๋‹ค. 

         java.ext.dirs ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ง€์ •๋œ ํด๋”์— ์žˆ๋Š” ํด๋ž˜์Šค ํŒŒ์ผ ๋กœ๋”ฉํ•œ๋‹ค. 

    3. ApplicationClassLoader : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋ž˜์Šค ํŒจ์Šค์—์„œ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด ๋กœ๋“œํ•œ๋‹ค. 

        ๊ฐœ๋ฐœ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™์„ ์œ„ํ•ด ์ง์ ‘ ์ž‘์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํด๋ž˜์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด ๋กœ๋”ฉ๋œ๋‹ค.

     

    Linking

    Linkging์€ ์ฝ”๋“œ ๋‚ด๋ถ€์˜ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์„ ์—ฐ๊ฒฐํ•œ๋‹ค. 

     

    1. Verify : ์ƒ์„ฑ๋œ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์ ์ ˆํ•œ์ง€ ๊ฒ€์ฆํ•œ๋‹ค. 

    2. Prepare : ๋ชจ๋“  static ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์–ด์ง€๊ณ  default ๊ฐ’๋“ค์ด ํ• ๋‹น๋œ๋‹ค.

    3. Resolve : ๋ชจ๋“  Symblic Memory Reference๊ฐ€ Run-time Data Area์˜ Method Area์— ์žˆ๋Š” Original Reference๋กœ ๋Œ€์ฒด๋œ๋‹ค. 

    Method Area์˜ Content Pool์€ Symblic Reference๋ฅผ Direct Reference๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์ž‘์—…์„ ํ•œ๋‹ค. 

    * Symblic Reference : ์ด๋ฆ„์— ๋Œ€ํ•œ ์ฐธ์กฐ / Direct Reference : ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ 

     

    Initializtion

    ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ Static ๋ณ€์ˆ˜๋“ค์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  Original ๊ฐ’๋“ค๋กœ ํ• ๋‹น๋œ๋‹ค. ์ด ํ›„ Static Bloak์ด ์‹คํ–‰๋œ๋‹ค.


    Execution Engine

    ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋œ ํด๋ž˜์Šค๋“ค์„ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์‹คํ–‰ํ•œ๋‹ค.

    ๊ธฐ๋ณธ์ ์œผ๋กœ JVM์€ Interpreter ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ์ • ๊ธฐ์ค€(?)์„ ๋„˜์–ด์„œ๋ฉด JIT Compier๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

     

    Interpreter

    ์ž๋ฐ”๊ฐ€ ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ ์ด๊ณ  ์ด์‹์„ฑ์ด ๋†’์€ ๊ฒƒ์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

    ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ line์”ฉ ์ฝ๊ณ  ์‹คํ–‰์‹œํ‚จ๋‹ค. 

    ๊ทธ๋ ‡๊ธฐ์— ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. 

    JIT(Just-In-Time) Compier

    Interpreter ์†๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋””์ž์ธ๋œ ๊ธฐ๋Šฅ์ด๋‹ค.

    1. ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ Binary ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. 

    2. ์ดํ›„ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ด์ƒ Interpretingํ•˜์ง€ ์•Š๊ณ , Binary ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•œ๋‹ค. 

     

    GC(Garbage Collector)

    ์ฐธ์กฐ๋˜์–ด ์žˆ์ง€ ์•Š์€ Object๋“ค์„ ๋ชจ์œผ๊ณ  ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


    Run-time Data Area

    JVM ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์™€์žˆ๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. 

    Heap Area

    Heap Area์—๋Š” ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•œ Java๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด ๋ฐ JRE ํด๋ž˜์Šค๋“ค์ด ํƒ‘์žฌ๋œ๋‹ค.

    ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ String Pool, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ธ์Šคํ„ด์Šค, ๋ฐฐ์—ด ๋“ฑ์ด ์ €์žฅ๋œ๋‹ค.

    JVM๋‹น ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜์–ด ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๊ฐ€๊ณต์œ ๋œ๋‹ค. 

    Heap ์˜์—ญ์ด ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋“  Java Stack ์˜์—ญ์— ์ฐธ์กฐ๋˜์–ด Thread๊ฐ„ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

    Heap ์˜์—ญ์ด ๊ฐ€๋“์ฐฐ ๊ฒฝ์šฐ, OutofMemoryError๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

    Heap์—์„œ๋Š” ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์„œ GC์˜ ์ฃผ ๋Œ€์ƒ์ด๋œ๋‹ค.

     

    Method Area

    Method Area์—๋Š” static ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค ์ˆ˜์ค€์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.

    JVM๋งˆ๋‹ค ์˜ค์ง ํ•˜๋‚˜์˜ Method Area๊ฐ€ ์žˆ๊ณ , ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ณต์œ ๋œ๋‹ค.

    ๋Ÿฐํƒ€์ž„ ์ค‘ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ Class Loader๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ .class ํŒŒ์ผ์„ ์ฝ์–ด ๋ถ„์„ํ•œ๋‹ค.

    ์ด ๋•Œ ์œ ํšจํ•˜๋‹ค๋ฉด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ ์ฝ”๋“œ๋“ค์„ Method Area ์— ์ €์žฅํ•œ๋‹ค.

    ํด๋ž˜์Šค ๋ณ€์ˆ˜๋„ ์ด ์˜์—ญ์— ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.

    ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ ํ•ด๋‹น ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ Method Area์— ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

     

    JVM Stacks

    JVM Stack์€ Thread์˜ ์ˆ˜ํ–‰ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๋Š” Frame์„ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

    ๊ฐ๊ฐ์˜ Thread๋ฅผ ์œ„ํ•ด ๋ถ„๋ฆฌ๋œ Runtime Stack์ด ์ƒ์„ฑ๋œ๋‹ค.

    JVM์€ JVM Stack์— StackFrame์„ push, popํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    1. Method๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค JVM์€ Stack Frame์„ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑํ•˜์—ฌ Stack์— Push ํ•œ๋‹ค.
    2. ์ด ๋•Œ ์ƒˆ๋กœ ๋“ค์–ด๊ฐ„ StackFrame์ด Current Frame์ด ๋œ๋‹ค.
    3. Method๊ฐ€ ์ˆ˜ํ–‰์ข…๋ฃŒ ์‹œ pop๋˜์–ด ์ด์ „ StackFrame์ด Current Frame์ด ๋œ๋‹ค. 
    Stack Frame : Thread๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉ”์„œ๋“œ ๋‹จ์œ„๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ณณ
     

    PC(Program Counter) Regiter

    Java์—์„œ Thread๋Š” ๊ฐ์ž์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

    ์ด ๋•Œ Thread๋ณ„๋กœ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

    ๊ทธ๋ ‡๊ธฐ ์œ„ํ•ด์„œ๋Š” JVM์—์„œ ๋ช…๋ น์–ด ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.

    ์ด ์ €์žฅ ๊ณต๊ฐ„์„ PC Regiter ์˜์—ญ์ด ๊ด€๋ฆฌํ•˜์—ฌ ์ถ”์ ๋˜๋„๋ก ํ•œ๋‹ค.

     

    Thread ๊ฐ€ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค PC Register๊ฐ€ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋œ๋‹ค.

    PC Register์—๋Š” Native Pointer์™€ Return Address๋ฅผ ๊ฐ€์ง„๋‹ค.

    Thread์—์„œ ์‹คํ–‰ํ–ˆ๋˜ ๋ฉ”์†Œ๋“œ๊ฐ€ Native ํ•˜๋‹ค๋ฉด Undefined๊ฐ€ ๊ธฐ๋ก๋˜๊ณ ,

    ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด JVM์—์„œ ์‚ฌ์šฉ๋œ ๋ช…๋ น์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. 

     

    Native Method Stacks

    Native Method Stack์€ Java๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” ์˜์—ญ์ด๋‹ค. 

    Java๋Š” Java์™ธ์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ, API ํˆดํ‚ท๋“ฑ๊ณผ์˜ ํ†ตํ•ฉ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด JNL(Java Native Interface) ๋ผ๋Š” ํ‘œ์ค€๊ทœ์•…์„ ์ œ๊ณตํ•œ๋‹ค. ์ฆ‰, Native Code๋กœ ๋˜์–ด์žˆ๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ Java ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›์•„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

    Java Stack ์ƒ์—์„œ Native Method๋ฅผ ๋งŒ๋‚˜ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ์•„๋ž˜ ๊ณผ์ •๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค. 

    1. Native Method Stack์— Native Function์„ ๋งŒ๋“ค์–ด ํ˜ธ์ถœํ•œ๋‹ค.
    2. Native Function์ด ๋๋‚˜๋ฉด, JVM Stack์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜จ๋‹ค. ์ด ๋•Œ, ํ˜ธ์ถœํ•œ Stack Frame์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด Stack Frame์„ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    ์ตœ์‹  ๋ฒ„์ „ JVM์€ JVM Stack๊ณผ Native Method Stack ๋‘ ์˜์—ญ์„ ๋‚˜๋ˆ„์–ด ์“ฐ์ง€ ์•Š๊ณ  ํ†ตํ•ฉํ•˜์—ฌ ์“ด๋‹ค. ๋‹ค๋งŒ Java Method์ธ์ง€ Native Method์ธ์ง€์— ๋”ฐ๋ผ StackFunction์ธ์ง€ Native Stack Frame์ธ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

     

     

    โ€ป ์ฐธ์กฐ๋ธ”๋กœ๊ทธ 

    ๋Œ“๊ธ€

Designed by Tistory.