JVM, JRE, JDK - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

JVM์ด๋ž€?

  • Java Virtual Machine์˜ ์ค„์ž„๋ง
  • Java Byte Code(.class)๋ฅผ ๊ฐ OS์— ๋งž๊ฒŒ ํ•ด์„ํ•˜๊ณ , ํ•ด์„๋œ ์ฝ”๋“œ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ€์ƒ ๋จธ์‹  (OS๋ณ„ JVM ์„ค์น˜ ํ•„์š”)

JRE๋ž€?

  • Java Runtime Environment์˜ ์ค„์ž„๋ง
  • JVM๊ณผ ์ž๋ฐ” ์‹คํ–‰์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Java Class Library)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • JRE๋ฅผ ๋‹ค์šด๋กœ๋“œ๋ฐ›์•„ Java Byte Code(.class)๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. (.java ์ปดํŒŒ์ผ ๋ถˆ๊ฐ€)

JDK๋ž€?

  • Java Development Kit์˜ ์ค„์ž„๋ง
  • JRE์™€ javac, jconsole, jhat ๋“ฑ์˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํˆด์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
  • JDK๋ฅผ ๋‹ค์šด๋กœ๋“œ๋ฐ›์•„ Java Byte Code(.class)๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ  .javaํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

JVM์„ ์™œ ์•Œ์•„์•ผ ํ• ๊นŒ?

์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ทธ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

JVM์œผ๋กœ ๊ตฌ๋™๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ, JVM์ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ „๋ฐ˜์— ๊ด€ํ•œ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ๋‹ด๋‹นํ•œ๋‹ค.

JVM์˜ ํŠน์ง•

  • Java Byte Code(.class)๋Š” ๊ธฐ๊ณ„์–ด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— OS์—์„œ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. JVM์€ Java Byte Code๋ฅผ ๊ฐ OS์— ๋งž๊ฒŒ ํ•ด์„ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜์—ฌ JVM ์ƒ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—๊ฒŒ '์šด์˜์ฒด์ œ์— ๋…๋ฆฝ์ ์ผ ์ˆ˜ ์žˆ๋‹ค'๋Š” ์žฅ์ ์„ ์„ ๋ฌผํ•œ๋‹ค.

  • JVM์—์„  ์ฝ”๋“œ ์‹คํ–‰๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด๋ฅผ ์œ„ํ•ด, Java Byte Code(.class)๋ฅผ OS์— ๋งž๊ฒŒ ๊ธฐ๊ณ„์–ด๋กœ ํ•ด์„ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€ ์–ธ์–ด(ex C, C++)์˜ ์‹คํ–‰ํ™˜๊ฒฝ์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. ํ•˜์ง€๋งŒ JIT(Just In Time)์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์†๋„ ์ด์Šˆ๋ฅผ ๊ทน๋ณตํ–ˆ๋‹ค.

JVM Language (JVM์—์„œ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์–ธ์–ด)

  • Scala
  • Groovy
  • Clojure
  • Kotlin
  • Ceylon
  • Xtend
  • Fantom
  • X10

(Java ์‹คํ–‰ ๊ณผ์ •์—์„œ ์•Œ์•„๋ณด๋Š”) JVM์˜ ๊ตฌ์ฒด์ ์ธ ์—ญํ• 

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ .java ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  java ์ปดํŒŒ์ผ๋Ÿฌ๋Š” .java ํŒŒ์ผ์„ .class ๋ผ๋Š” Java Byte Code๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ JVM์ด ์ž‘๋™๋œ๋‹ค.


Class Loader

Class Loader(ํด๋ž˜์Šค ์ ์žฌ๊ธฐ)๋Š” load, link, initialize ์„ธ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Loading
Java Byte Code๋ฅผ Runtime Data Area ๋‚ด์˜ Method Area๋กœ ์ ์žฌ
Linking
Java Byte Code๊ฐ€ ์ž๋ฐ” ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ณ , ํด๋ž˜์Šค์— ์ •์˜๋œ 
ํ•„๋“œ, ๋ฉ”์†Œ๋“œ, ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ค€๋น„ํ•˜๋ฉฐ 
๊ทธ ํด๋ž˜์Šค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค.
Initialization 
static block ์˜ ์ดˆ๊ธฐํ™” ๋ฐ static ๋ฐ์ดํ„ฐ๋“ค์„ ํ• ๋‹นํ•œ๋‹ค.

Class Loader๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ์‹์€ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

๋กœ๋“œํƒ€์ž„ ๋™์  ๋กœ๋”ฉ(load-time dynamic loading)
.class ํŒŒ์ผ๋“ค์„ ๋กœ๋“œํ•˜๋Š” ์‹œ์ (๋กœ๋“œํƒ€์ž„)์— ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ ๋กœ๋“œํ•œ๋‹ค.
๋Ÿฐํƒ€์ž„ ๋™์  ๋กœ๋”ฉ(run-time dynamic loading)
๋กœ๋“œํƒ€์ž„ ๋™์  ๋กœ๋”ฉ์ด ๋๋‚œ ํ›„ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด์„œ(๋Ÿฐํƒ€์ž„) ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ ๋กœ๋“œํ•œ๋‹ค.

Execution Engine

Execution Engine(์‹คํ–‰ ์—”์ง„)์€ Runtime Data Area์˜ Method Area์— ์ ์žฌ๋œ Java Byte Code๋ฅผ

๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•œ ํ›„ ์‹คํ–‰์‹œํ‚จ๋‹ค. (์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.)

๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Garbage Collection์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.