• [Java] JVM ๋™์ž‘๋ฐฉ์‹ & ๊ตฌ์„ฑ์š”์†Œ

    2023. 8. 9.

    by. @leeeun

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

    JVM(์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ )์€ ์ž๋ฐ” ์–ธ์–ด์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ, ์Šค์นผ๋ผ ์–ธ์–ด์—์„œ๋„ JVM ๋™์ž‘ ๋ฐฉ์‹์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค.
    ๋”ฐ๋ผ์„œ JVM์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด ์ถ”ํ›„์— ์ž๋ฐ”์—์„œ ํŒŒ์ƒ๋œ ์–ธ์–ด๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ์—๋„ ๋„์›€์ด ๋œ๋‹ค.

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


    JVM ๊ตฌ์„ฑ์š”์†Œ์™€ ์—ญํ• 

    • ํด๋ž˜์Šค ๋กœ๋”(Class Loader)
    • ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)
    • ์‹คํ–‰ ์—”์ง„(Execution Engine)
    • JNI - ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค (Native Method Interface)
    • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Native Method Library)

    ํด๋ž˜์Šค ๋กœ๋”

    ํด๋ž˜์Šค ๋กœ๋”๋Š” JVM ๋‚ด๋กœ ํด๋ž˜์Šค ํŒŒ์ผ(.class)์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ , ๋งํฌ๋ฅผ ํ†ตํ•ด ๋ฐฐ์น˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ
    ์ฆ‰, ๋กœ๋“œ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋“ค์„ ์—ฎ์–ด์„œ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ Runtime Data Areas์— ๋ฐฐ์น˜ํ•œ๋‹ค.

    ํด๋ž˜์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š” ๋กœ๋”ฉ ๊ธฐ๋Šฅ์€ ํ•œ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๊ฒŒ ๋œ๋‹ค. (๋™์  ๋กœ๋”ฉ)

    ํด๋ž˜์Šค ํŒŒ์ผ์˜ ๋กœ๋”ฉ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. (Loading → Linking → Initialization)

    ๋กœ๋”ฉ

    ํด๋ž˜์Šค ํŒŒ์ผ์„ JVM์— ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค์ด ์žˆ๋‹ค.

    • BootStrap ClassLoader: ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋กœ๋”, jre/lib/rt.jar์— ๋‹ด๊ธด JDK ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋”ฉํ•˜๋ฉฐ Native C๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.
    • Extension ClassLoader: jre/lib/ext ๋˜๋Š” java.ext.dirs ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ง€์ •๋œ ํด๋”์— ์žˆ๋Š” ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋”ฉํ•œ๋‹ค.
      Java9 ์ดํ›„ Platform ClassLoader๋กœ ๋ช…์นญ์ด ๋ณ€๊ฒฝ๋จ.
    • Application ClassLoader: classpath๋‚˜ JAR ํŒŒ์ผ ์•ˆ์— ์žˆ๋Š” Manifest ํŒŒ์ผ์˜ Class-Path ์†์„ฑ๊ฐ’์œผ๋กœ ์ง€์ •๋œ ํด๋”์— ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™์„ ์œ„ํ•ด ์ง์ ‘ ์ž‘์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํด๋ž˜์Šค๊ฐ€ ์ด ํด๋ž˜์Šค๋กœ๋”์— ์˜ํ•ด ๋กœ๋”ฉ๋œ๋‹ค.
      Java9 ์ดํ›„ System ClassLoader๋กœ ๋ช…์นญ์ด ๋ณ€๊ฒฝ๋จ., classpath, modulepath์— ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค.

    ๋งํ‚น

    ํด๋ž˜์Šค ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •

    • Verifying(๊ฒ€์ฆ) : ์ฝ์–ด๋“ค์ธ ํด๋ž˜์Šค๊ฐ€ ์ ์ ˆํ•œ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ๊ฒ€์ฆ์— ์‹คํŒจํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • preparing(์ค€๋น„) : ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
    • Resolving(๋ถ„์„) : ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ํ’€ ๋‚ด ๋ชจ๋“  ์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹ค์ด๋ ‰ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

    ์ดˆ๊ธฐํ™”

    ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๋ชจ๋“  static ๋ณ€์ˆ˜๋“ค์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•˜๊ณ , static block์„ ์‹คํ–‰ํ•œ๋‹ค.


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

    ๋Ÿฐํƒ€์ž… ๋ฐ์ดํ„ฐ ์˜์—ญ์€ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ ์žฌํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

    ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ ์œ„ ํฌ๊ฒŒ Method Area, Heap Area, Stack Area, PC Register, Native Method Stack๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

    • ๋ฉ”์†Œ๋“œ ์˜์—ญ(=class area=static area): JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋ฉฐ, ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์˜ฌ๋ฆด ๋•Œ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋Œ€์ƒ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„์ด๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ„ ๊ณต์œ ๋œ๋‹ค.

    Field Info : ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ •๋ณด
    Method Info : ๋ฉ”์†Œ๋“œ ์ด๋ฆ„, return ํƒ€์ž…, ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ •๋ณด
    Type Info : Class ์ธ์ง€ Interface ์ธ์ง€ ์—ฌ๋ถ€ ์ €์žฅ, Type์˜ ์†์„ฑ, ์ด๋ฆ„ Super Class์˜ ์ด๋ฆ„

    ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค.

    • ํž™ ์˜์—ญ: ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ์˜์—ญ. new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ๋˜๋Š” ํด๋ž˜์Šค์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ๋ฐฐ์—ด ๋“ฑ์ด ์ €์žฅ๋จ. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ„ ๊ณต์œ , GC์˜ ๋Œ€์ƒ
    • ์Šคํƒ ์˜์—ญ: ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ, int, log, boolean๋“ฑ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•๊ณผ ๊ฐ™์ด ์ž„์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋‚˜ ์ •๋ณด๋“ค์ด ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค. (์Šคํƒ ํ”„๋ ˆ์ž„์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋งŒ๋“ค์–ด์ง€๊ณ , ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋˜๋ฉด ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. ์Šคํƒ ํ”„๋ ˆ์ž„์—๋Š” ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ๋ฆฌํ„ด๊ฐ’, ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ’ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ)
    • PC Register: ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ JVM ๋ช…๋ น์–ด ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์Šค๋ ˆ๋“œ ๋งˆ๋‹ค PC Register๋ฅผ ๊ฐ€์ง. ์ด๋Š” Java ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์œ„์น˜๋งŒ ๊ธฐ๋ก
    • Native Method Stack: native๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์œผ๋กœ ์Šค๋ ˆ๋“œ ๋งˆ๋‹ค ์ƒ์„ฑ. ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ, ์‹ค์ œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์ž๋ฐ” ์ด์™ธ์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ native์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„์ด๊ธฐ๋„ ํ•˜๋‹ค. JNI์™€๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

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

    ์‹คํ–‰ ์—”์ง„์€ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ๋ฐฐ์น˜๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ ์‹คํ–‰ํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
    ์ค‘๊ฐ„ ๋ ˆ๋ฒจ๋กœ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋ฅผ ์‹ค์ œ๋กœ JVM ๋‚ด๋ถ€์—์„œ ๊ธฐ๊ณ„๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

    • ์ธํ„ฐํ”„๋ฆฌํ„ฐ
    • JIT ์ปดํŒŒ์ผ๋Ÿฌ
    • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ
      ์„ธ๊ฐ€์ง€์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค. (์‹คํ–‰ ์—”์ง„์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰)

    ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ (Garbage Collector, GC)

    Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ๋”๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•ด ์ค€๋‹ค.

    C์–ธ์–ด ๊ฐ™์ด ์ง์ ‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ, JAVA๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹ค์‹œ๊ฐ„ ์ตœ์ ํ™” ์‹œ์ผœ์ค€๋‹ค.


    JNI(Java Native Interface)

    ์ž๋ฐ”๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
    JNI๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด native mathod stack์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์ ์žฌ๋œ๋‹ค.


    Native Method Library

    C, C++๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์นญํ•œ๋‹ค.
    ๋งŒ์ผ ํ—ค๋”๊ฐ€ ํ•„์š”ํ•˜๋ฉด JNI๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋”ฉํ•ด ์‹คํ–‰ํ•œ๋‹ค.

     

     

    ์ฐธ์กฐ

     

    โ˜• JVM ๋‚ด๋ถ€ ๊ตฌ์กฐ & ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ๐Ÿ’ฏ ์ด์ •๋ฆฌ

    ์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” JRE / JDK / JVM์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค๋ฉด, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” JVM์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๋„๋ก ํ•  ์˜ˆ์ •์ด๋‹ค. JVM(์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ )์€ ์ž๋ฐ” ์–ธ

    inpa.tistory.com

     

    ๋ฐฑ๊ธฐ์„ ๋‹˜ ์˜จ๋ผ์ธ ์Šคํ„ฐ๋”” 1์ฃผ์ฐจ - JVM์€ ๋ฌด์—‡์ด๋ฉฐ ์ž๋ฐ” ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€.

    1์ฃผ์ฐจ!

    velog.io

     

    ๋Œ“๊ธ€