[Java] JVM๐Ÿ˜€

99GAGAยท2021๋…„ 1์›” 4์ผ
0

Java

๋ชฉ๋ก ๋ณด๊ธฐ
1/2
post-thumbnail

JVM

Java Virtual Machine์ด๋ž€?

Java๋Š” "ํ•œ ๋ฒˆ ์ž‘์„ฑํ•˜๋ฉด ์–ด๋””์„œ๋‚˜ ์‹คํ–‰"์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ํ”Œ๋žซํผ ์šฉ์œผ๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” C++์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ Java ์†Œ์Šค๋Š” ๋จผ์ € .class ํŒŒ์ผ์ธ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ๋œ๋‹ค. ์ปดํŒŒ์ผ ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์€ VM(๊ฐ€์ƒ ๋จธ์‹ )์—์„œ ํ•ด์„์ด๋œ๋‹ค.

์ฆ‰, ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


JVM

Class Loader

  • java ํด๋ž˜์Šค๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ํ”Œ๋žซํผ๊ณผ ๊ธฐ๊ณ„์— ๋…๋ฆฝ์ ์ธ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค๋Š” .class ํŒŒ์ผ๋กœ ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค.
  • .class ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด Java ClassLoader๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

Class Loader ๋‚ด๋ถ€์˜ ์ž์„ธํ•œ ์„ค๋ช… : (https://javatutorial.net/java-class-loaders-explained)

Runtime Data Area์˜ 5๊ฐ€์ง€ ์˜์—ญ

  • Method Area
    ์ •์  ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜์—ฌ(Constant Pool ํฌํ•จ) ๋ชจ๋“  ํด๋ž˜์Šค ์ˆ˜์ค€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๊ธฐ์— ์ €์žฅ๋œ๋‹ค. JVM ๋‹น ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ ์˜์—ญ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•˜๋Š” ์ž์›์ด๋‹ค.
    ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์Šค๋ ˆ๋“œ๋กœ ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ๋ชปํ•˜๋‹ค.
  • Heap Area
    ๋ชจ๋“  ๊ฐ์ฒด์™€ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ๋ฐ ๋ฐฐ์—ด์ด ์—ฌ๊ธฐ์— ์ €์žฅ๋œ๋‹ค. JVM ๋‹น ํ•˜๋‚˜์˜ ํž™์˜์—ญ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•˜๋Š” ์ž์›์ด๋‹ค.
    ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ๋ชปํ•˜๋‹ค.
  • Stack Area
    ๋ชจ๋“  ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋Ÿฐํƒ€์ž„ ์Šคํƒ์ด ์ƒ์„ฑ๋œ๋‹ค. ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์Šคํƒ ํ”„๋ ˆ์ž„์ด๋ผ๊ณ  ํ•˜๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค. ๋ชจ๋“  ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋œ๋‹ค. ์Šคํƒ ์˜์—ญ์€ ๊ณต์œ  ์ž์›์ด ์•„๋‹ˆ๋ฏ€๋กœ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๋‹ค.
  • PC Register
    Program Count์˜ ์•ฝ์ž๋กœ ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋ณ„๋„์˜ PC ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ํ•ด๋‹น ์˜์—ญ์€ ํ˜„์žฌ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์˜ ์ฃผ์†Œ(address)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ PC์˜ ๊ฐ’์€ ํ˜„์žฌ ๋ช…๋ น์ด ๋๋‚œ ๋’ค ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์‹คํ–‰๋  ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • Native Method Stack
    ์ผ๋ฐ˜์ ์œผ๋กœ JVM์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐฉ์‹(c์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ) ์„ ์ง€์›ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ Stack Area์— ์Œ“์ด๋‹ค๊ฐ€ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด์„œ ๋ณ„๋„์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ์ด ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค.

Execution Engine

Runtime Data Area์— ํ• ๋‹น ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ Execution Engine์— ์˜ํ•ด์„œ ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ์— 2์ข…๋ฅ˜์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉ (Interpreter, JIT Compiler)

Interpreter

Interpreter๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋” ๋นจ๋ฆฌ ํ•ด์„ํ•˜์ง€๋งŒ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋œ๋‹ค. Interpreter์˜ ๋‹จ์ ์€ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด๋„ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ํ•ด์„์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

JIT Compiler

Just-In-Time์˜ ์•ฝ์ž๋กœ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด "๋™์  ๋ณ€ํ™˜"์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ 2๊ฐ€์ง€์˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋ฐฉ์‹์ด ์žˆ์—ˆ๋‹ค.

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ(interpreter) ๋ฐฉ์‹: ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ปดํ“จํ„ฐ๊ฐ€ ์•Œ์•„ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ => ๊ฐ„ํŽธํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋Š๋ฆฌ๋‹ค
  • ์ •์ (static) ์ปดํŒŒ์ผ ๋ฐฉ์‹: ์‹คํ–‰ํ•˜๊ธฐ์ „์— ์ปดํ“จํ„ฐ๊ฐ€ ์•Œ์•„ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ๋ฏธ๋ฆฌ ์‹คํ–‰ํ•œ๋‹ค => ๋ณ€ํ™˜์ž‘์—…์„ ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค

JIT Compiler๋Š” Interpreter์˜ ๋‹จ์ ์„ ๋ฌด๋ ฅํ™”ํ•œ๋‹ค. Execution Engine์€ ์ฒ˜์Œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ Interpreter๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์œผ๋ฉด JIT Compiler๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค ๋‘์—ˆ๋‹ค๊ฐ€ ์žฌ์‚ฌ์šฉ์„ ํ•˜๊ฒŒ๋œ๋‹ค.

JNI (Java Native Interface)

JNI๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ณ  Execution Engine์— ํ•„์š”ํ•œ Native Library๋ฅผ ์ œ๊ณต

Native Method Library

Execution Engine์— ํ•„์š”ํ•œ Native Libraries์˜ ๋ชจ์Œ

GC(Garbage Collector)

GC๋Š” ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ œ๊ฑฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด์ค€๋‹ค. ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋˜์ง€ ์•Š๊ณ  ์“ธ๋ชจ ์—†๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช… ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

  1. null
  2. ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ฐธ์กฐ ํ• ๋‹น
  3. ์ต๋ช… ๊ฐ์ฒด
JVM์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜์—ญ์„ ๋‚˜๋ˆ„์–ด Heap Area์— ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค.

GC)

๊ฐ€์žฅ ์™ผ์ชฝ์— Young์˜์—ญ์—๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ Š์€ ๊ฐ์ฒด๋“ค์ด ์กด์žฌ Old ์˜์—ญ์—๋Š” ๋Š™์€ ๊ฐœ์ฒด๋“ค์ด ์ž๋ฆฌ์žก๊ฒŒ ๋œ๋‹ค. Permanent ์˜์—ญ์—๋Š” ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์Œ“์ธ๋‹ค.

  1. Eden ์˜์—ญ์— ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  2. Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๊ณ  ๋‹ค์‹œ Eden ์˜์—ญ์„ ์ฑ„์šฐ๊ฒŒ ๋œ๋‹ค.
  3. Survivor ์˜์—ญ์ด ๊ฝ‰์ฐจ๋ฉด ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๋ณต์‚ฌ๋œ๋‹ค. ์ด ๋•Œ, Eden์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค ์ค‘ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋“ค๋„ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ๊ฐ„๋‹ค. ์ฆ‰, Survivor ์˜์—ญ์— ๋‘˜์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ˜๋“œ์‹œ ๋น„์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

Young Generation์—์„œ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ Young GC, Old Generation ์—์„œ ์ผ์–ด๋‚˜๋Š” GC๋ฅผ Full GC ๋ผ๊ณ  ํ•œ๋‹ค.

  • ์žฅ์ 
    ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ GC์—์„œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ˆ˜๋™์ ์ด์ง€ ์•Š๋‹ค.
    ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ด€๋ฆฌ

  • ๋‹จ์ 
    ๊ฐ์ฒด ์ฐธ์กฐ ์ƒ์„ฑ / ์‚ญ์ œ๋ฅผ ์ถ”์ ํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ CPU ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๋ฉฐ ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์š”์ฒญ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.
    ์ผ๋ถ€ GC ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ค‘์ง€ ๋  ์ˆ˜ ์žˆ๋‹ค.
    ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํšจ์œจ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

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