Skip to content

Latest commit

ย 

History

History
110 lines (76 loc) ยท 6.36 KB

JVM.md

File metadata and controls

110 lines (76 loc) ยท 6.36 KB

JVM, JRE, JDK

Java์˜ ๊ฐœ๋ฐœ ์ฒ ํ•™

WORA = Write Once, Run Anywhere
ํ•œ ๋ฒˆ ์“ฐ๊ณ  ๋ชจ๋“  ๊ณณ์—์„œ ์‹คํ–‰ํ•œ๋‹ค

JVM

Java Virtual Machine์˜ ์ค„์ž„๋ง.
JVM์€ OS ์œ„์—์„œ CPU๊ฐ€ Java๋ฅผ ์ธ์‹, ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฐ€์ƒ ์ปดํ“จํ„ฐ์ด๋‹ค.

JVM์€ 2๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

  1. ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋Š ๊ธฐ๊ธฐ, ์–ด๋Š ์šด์˜์ฒด์ œ ์ƒ์—์„œ๋„ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค. => WORA
  2. ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ & ์ตœ์ ํ™”ํ•ด ์ค€๋‹ค.

Java๋Š” JVM์„ ํ†ตํ•ด ํ”Œ๋žซํผ์— ๊ด€๊ณ„์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Java ์†Œ์Šค์ฝ”๋“œ, ์ฆ‰ ์›์‹œ์ฝ”๋“œ(.java)๋Š” CPU๊ฐ€ ์ธ์‹์„ ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ Java๋Š” ์ด JVM ์ด๋ผ๋Š” ๊ฐ€์ƒ๋จธ์‹ ์„ ๊ฑฐ์ณ์„œ OS์— ๋„๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— OS๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๋กœ ์ปดํŒŒ์ผ ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ JVM์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” Java bytecode(.class)๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

Java compiler ๊ฐ€ .java ํŒŒ์ผ์„ .class ๋ผ๋Š” Java bytecode๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

๐Ÿ’ก ์—ฌ๊ธฐ์„œ Java compiler๋Š” JDK๋ฅผ ์„ค์น˜ํ•˜๋ฉด bin ์— ์กด์žฌํ•˜๋Š” javac.exe๋ฅผ ๋งํ•œ๋‹ค. (JDK์— Java compiler๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค). javac ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด .java๋ฅผ .class๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€ํ™˜๋œ bytecode๋Š” ๊ธฐ๊ณ„์–ด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— OS์—์„œ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
์ด ๋•Œ, JVM์ด OS๊ฐ€ bytecode๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์„ํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ Byte Code๋Š” JVM ์œ„์—์„œ OS ์ƒ๊ด€์—†์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
OS์— ์ข…์†์ ์ด์ง€ ์•Š๊ณ , Java ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๋ฉด ์–ด๋Š ๋””๋ฐ”์ด์Šค๋“  JVM ์œ„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ”์ดํŠธ์ฝ”๋“œ๋ž€

๊ฐ€์ƒ ์ปดํ“จํ„ฐ(VM)์—์„œ ๋Œ์•„๊ฐ€๋Š” ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ์ด์ง„ ํ‘œํ˜„๋ฒ•.

์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(Java bytecode)๋Š” JVM์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ณ€ํ™˜๋œ ์ž๋ฐ” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ณ€ํ™˜๋œ ์ฝ”๋“œ์˜ ๋ช…๋ น์–ด ํฌ๊ธฐ๊ฐ€ 1๋ฐ”์ดํŠธ๋ผ์„œ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ณ  ์žˆ๋‹ค.

๋ฐ”์ดํŠธ ์ฝ”๋“œ๋Š” ๋‹ค์‹œ ์‹ค์‹œ๊ฐ„ ๋ฒˆ์—ญ๊ธฐ ๋˜๋Š” JIT ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

๐Ÿ’ก ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ž€?
๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ ๋˜๋Š” ์ด์ง„ ์ฝ”๋“œ๋ผ๊ณ  ํ•œ๋‹ค. ์ปดํ“จํ„ฐ๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” 0๊ณผ 1๋กœ ๊ตฌ์„ฑ๋œ ์ด์ง„์ฝ”๋“œ

๐Ÿ’ก ๊ธฐ๊ณ„์–ด๋ž€?
0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ์ด๋‹ค. ๊ธฐ๊ณ„์–ด๊ฐ€ ์ด์ง„์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์กŒ์„ ๋ฟ ๋ชจ๋“  ์ด์ง„์ฝ”๋“œ๊ฐ€ ๊ธฐ๊ณ„์–ด์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ธฐ๊ณ„์–ด๋Š” ํŠน์ •ํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ CPU๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ด๋ฉฐ, CPU ์ œ์กฐ์‚ฌ๋งˆ๋‹ค ๊ธฐ๊ณ„์–ด๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, CPU๊ฐ€ ์ดํ•ดํ•˜๋Š” ์–ธ์–ด๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ, ๊ฐ€์ƒ ๋จธ์‹ ์ด ์ดํ•ดํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ์ด๋‹ค.

JVM ๊ตฌ์„ฑ์š”์†Œ

JVM์€ ํฌ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

  • ํด๋ž˜์Šค ๋กœ๋”(Class Loader)
  • ์‹คํ–‰ ์—”์ง„(Execution Engine)
    • ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter)
    • JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-in-Time)
    • ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ(Garbage collector)
  • ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ (Runtime Data Area)

JIT ์ปดํŒŒ์ผ๋Ÿฌ

JIT ์ปดํŒŒ์ผ(just-in-time compliation) ๋˜๋Š” ๋™์  ๋ฒˆ์—ญ(dynamic translation) ์ด๋ผ๊ณ  ํ•œ๋‹ค.
JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹ค์ œ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค.

์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ๋‹ค.
์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์ ์ ˆํ•œ ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ดํ›„์—๋Š” ํ•ด๋‹น ๋” ์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ… ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๊ณ„์–ด๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ธฐ๊ณ„์–ด(์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ)๋Š” ์บ์‹œ์— ๋ณด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
๋ฌผ๋ก  JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์˜ค๋ž˜๊ฑธ๋ฆฌ๋ฏ€๋กœ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ผ๋ฉด ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค.
๋”ฐ๋ผ์„œ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” JVM๋“ค์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์ฒดํฌํ•˜๊ณ  ์ผ์ • ์ •๋„๋ฅผ ๋„ฃ์„๋•Œ์—๋งŒ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ž๋ฐ”์—์„  ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ, ์‹ค์ œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์—์„œ ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ (JVM, ์ •ํ™•ํžˆ๋Š” JRE)์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JIT ์ปดํŒŒ์ผ์„ ํ†ตํ•ด ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

Garbage Collection.

JVM์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ฐพ์•„๋‚ด์„œ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

JRE

Java SE Runtime Environment (์ž๋ฐ” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ)

JVM + ์ž๋ฐ” ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Java Class Library) ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
์ปดํŒŒ์ผ ๋œ Java ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€์ด๋‹ค.

๐Ÿ’ก SDK๋ž€?
Software Development Kit (์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ‚คํŠธ)
ํ•˜๋“œ์›จ์–ด ํ”Œ๋žซํผ, ์šด์˜์ฒด์ œ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ œ์ž‘์‚ฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํˆด์ด๋‹ค. ํ‚คํŠธ์˜ ์š”์†Œ๋Š” ์ œ์ž‘์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค.
SDK์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ, JDK ๋“ฑ์ด ์žˆ๋‹ค.
SDK๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

JDK

Java SE Development Kit (์ž๋ฐ” ๊ฐœ๋ฐœ ํ‚คํŠธ)

Java ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ Java์šฉ SDK (Software Development Kit)์ด๋‹ค.
JDK ๋Š” JRE๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. JRE์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ(javac)์™€ jdb, javadoc ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋„ ์žˆ๋‹ค.

์ฆ‰, JDK๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑ, ์‹คํ–‰, ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์•ฝ
JDK๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰, ์ปดํŒŒ์ผ, ๊ฐœ๋ฐœ์šฉ ๋„๊ตฌ.
JRE, JVM๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์ ์ด ํ‚คํŠธ์ด๋‹ค.

JRE๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. JVM์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿ“—์ฐธ๊ณ