๋ชฉํ
์๋ฐ ์์ค ํ์ผ(.java)์ JVM์ผ๋ก ์คํํ๋ ๊ณผ์ ์ดํดํ๊ธฐ
JVM์ด๋ ๋ฌด์์ธ๊ฐ
- JVM(Java Virtual Machine): ์๋ฐ ๊ฐ์ ๋จธ์
- ์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํ ๊ฐ์ ๊ธฐ๊ณ(์ปดํจํฐ)
- Java๊ฐ OS์ ์ข ์๋ฐ์ง ์๊ณ , ์ด๋ OS ์์์๋ ์คํ๋๊ธฐ ์ํด์ ํ์ํ ์ฅ์น
- ์ฆ, OS์ ์ข ์๋ฐ์ง ์๊ณ CPU๊ฐ Java ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์๊ฒ ํ๊ธฐ ์ํ ๊ฐ์ ์ปดํจํฐ
์ปดํ์ผํ๋ ๋ฐฉ๋ฒ
์ผ๋ฐ์ ์ธ ์ธ์ด๋ ์์ค ์ฝ๋๋ฅผ CPU๊ฐ ๋ฐ๋ก ์ดํดํ ์ ์๋ ๊ธฐ๊ณ๋ก ํ ๋ฒ์ ๋ณํํฉ๋๋ค.
ํ์ง๋ง ์๋ฐ๋ JVM์ด๋ผ๋ ์ค๊ฐ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ๋ณํ ๊ณผ์ ์ด ๋ ๋จ๊ณ๋ก ๋๋์ด์ง๋๋ค.
- 1์ฐจ ๋ณํ: ์์ค ์ฝ๋ → ๋ฐ์ดํธ์ฝ๋(Bytecode)
์๋ฐ ์์ค ์ฝ๋(`.java`)๊ฐ ์๋ฐ ๋ฐ์ดํธ์ฝ๋( `.class`)๋ก ๋ณํ๋ฉ๋๋ค.
์ด๋ ๋ฐ์ดํธ์ฝ๋๋ CPU๊ฐ ์๋๋ผ, JVM์ด ์ธ์ํ๋ ์ธ์ด๋ก
์๋ฐ์ ํ๋ซํผ ๋ ๋ฆฝ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์์์ ๋๋ค.
- 2์ฐจ ๋ณํ: ๋ฐ์ดํธ์ฝ๋ → ๊ธฐ๊ณ์ด
JVM์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฐ์ CPU๊ฐ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๊ณผ์ ์ผ๋ก
`.class` ํ์ผ์ ์ฝ์ด ํด๋น OS์ ๋ง๋ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ํด์๋ฉ๋๋ค.
์ฆ, OS๊ฐ ์๋ฐ ์ฝ๋๋ฅผ ์ง์ ์ธ์ํ๋ ๊ฒ์ด ์๋๋ผ, OS ์์์ ๋์ํ๋ JVM์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฐ์์ OS์ ์ธ์ด๋ก ํต์ญํด ์ฃผ๋ ์ญํ ์ ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("JVM ์ค์ต");
}
}
`javac` ๋ช ๋ น์ด๋ก ์๋ฐ ์์ค์ฝ๋๋ฅผ ์ปดํ์ผํ ์ ์์ต๋๋ค.
`javac HelloWorld.java`๋ฅผ ์ ๋ ฅํ๋ฉด ์๋ ์ฌ์ง์ฒ๋ผ `.class` ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.

์คํํ๋ ๋ฐฉ๋ฒ
`java` ๋ช ๋ น์ด๋ก `.class` ํ์ผ์ ์คํํ ์ ์์ต๋๋ค.

JIT ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ CPU๊ฐ ์๋๋ผ JVM์ด ์ดํดํ ์ ์๋ ์ธ์ด๋ก,
JVM์ ์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ํด๋น OS์ CPU๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ๋ณํํฉ๋๋ค.
์ด๋ JVM์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.
- ์ธํฐํ๋ฆฌํฐ๋ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ํ ์ค์ฉ ์ฝ๊ณ , ์ด๋ฅผ OS์ ๋ง๋ ๊ธฐ๊ณ์ด๋ก ์ฆ์ ํด์ํ์ฌ CPU์ ์ ๋ฌํ๊ณ , CPU๊ฐ ์ด ๋ช ๋ น์ ๋ฐ๋ก ์คํํฉ๋๋ค.
- ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์ปดํ์ผํ ํ์๊ฐ ์์ด ํ๋ก๊ทธ๋จ ๊ตฌ๋ ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
- ๊ทธ๋ฌ๋ ๋์ผํ ์ฝ๋๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋ ๋๋ ๋งค๋ฒ ๋ค์ ํด์ํด์ผ ํ๋ฏ๋ก, ์ ์ฒด ์คํ ์๋๋ ๋๋ฆฝ๋๋ค.
์ด์ฒ๋ผ ๋๋ฆฐ ์๋๋ผ๋ ์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
JIT ์ปดํ์ผ๋ฌ๋?
- JIT(Just-In-Time) ์ปดํ์ผ๋ฌ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ค ์ ์ ํ ์์ ์ ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋ ๋ธ๋ก(๋ฉ์๋ ๋จ์)๋ฅผ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ๋ณํํฉ๋๋ค.
- ์ปดํ์ผ๋ ์ฝ๋(๊ธฐ๊ณ์ด)๋ ์บ์์ ๋ณด๊ด๋๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ปดํ์ผ๋ ์ฝ๋๋ ์ดํ ์คํ ์ ๋น ๋ฅด๊ฒ ์ํ๋ฉ๋๋ค.
JIT ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ๋ฉด ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํ๋ ๊ฒ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ฏ๋ก ํ ๋ฒ๋ง ์คํ๋๋ ์ฝ๋๋ผ๋ฉด ์ธํฐํ๋ฆฌํ ์ ํ๋ ๊ฒ ๋ซ์ต๋๋ค.
๋ฐ๋ผ์ JVM์ ๋ด๋ถ์์ ํด๋น ๋ฉ์๋์ ์ํ ๋น๋๋ฅผ ํ์ธํ ํ ์ผ์ ์ ๋๋ฅผ ๋์ ๋ JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
JVM ๊ตฌ์ฑ ์์

JVM ๋ด๋ถ ํฌ๊ฒ ํด๋์ค ๋ก๋, ๋ฉ๋ชจ๋ฆฌ ์์ญ, ์คํ ์์ง์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
- ํด๋์ค ๋ก๋ ์์คํ
(Class Loader System)
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํ์ํ ํด๋์ค ํ์ผ์ JVM ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ๋์ ์ผ๋ก ๋ก๋ํ๋ ์ญํ
- ๋ฐ์ดํธ์ฝ๋(`.class`)๋ค์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐฐ์น์ํค๋ ์ญํ
- ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋ฒ์ ์ฌ๋ฆฌ์ง ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ๊ฒฝ์ฐ ๋์ ์ผ๋ก ์ฌ๋ฆฝ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ(Runtime Data Area)
- ํ๋ก๊ทธ๋จ ์คํ์ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- ์ด ์์ญ์ ๋ค์ ์ค๋ ๋ ๊ณต์ ์์ญ๊ณผ ์ค๋ ๋ ๋ ๋ฆฝ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
- ์ค๋ ๋ ๊ณต์ ์์ญ
- ๋ชจ๋ ์ค๋ ๋๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ์์ญ์ผ๋ก ํ, ๋ฉ์๋ ์์ญ์ด ํด๋น๋ฉ๋๋ค.
- ํ(heap): ๊ฐ์ฒด์ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ์์ญ
- ๋ฉ์๋ ์์ญ: ํด๋์ค ๊ตฌ์กฐ ์ ๋ณด, ์ ์ ๋ณ์, ์์ ๋ฑ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์์ญ
- ์ค๋ ๋ ๋
๋ฆฝ ์์ญ
- ๊ฐ ์ค๋ ๋๊ฐ ์์ฑ๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ํ ๋น๋๋ ์์ญ์ผ๋ก ์คํ, PC ๋ ์ง์คํฐ, ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ด ํด๋น๋ฉ๋๋ค.
- ์คํ(stack): ๋ฉ์๋ ํธ์ถ ์ ์ฌ์ฉ๋๋ ์ง์ญ ๋ณ์, ๋งค๊ฐ ๋ณ์, ๋ฉ์๋ ์ ๋ณด ๋ฑ์ด ์ ์ฅ๋๋ ์์ญ
- PC ๋ ์ง์คํฐ(Program Counter Register): ํ์ฌ ์คํ ์ค์ธ JVM ๋ช ๋ น์ด์ ์ฃผ์๊ฐ ์ ์ฅ๋๋ ์์ญ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ(Native Method Stack): ์๋ฐ ์ธ์ ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉํ๋ ์คํ
- ์คํ ์์ง(Execution Engine)
- ํด๋์ค ๋ก๋๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋์ ๋ฐ์ดํธ์ฝ๋(ํด๋์ค ํ์ผ)๋ฅผ ์ค์ ๋ก ์คํํ๋ ์ญํ
- ์ธํฐํ๋ฆฌํฐ(Interpreter): ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ฝ์ด ์ฆ์ ๊ธฐ๊ณ์ด๋ก ํด์ํ์ฌ ์คํํ๋ ๋ฐฉ์
- JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler): ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํ์ฌ ์บ์ํด๋๋ ๋ฐฉ์
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Garbage Collector, GC): ํ ์์ญ์์ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๊ณ ์์์ ํ์ํ๋ ์ญํ
JDK์ JRE
JRE๋?: JVM + ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Java Runtime Environment: ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ํ ํ๊ฒฝ
- JVM๊ณผ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌ์ฑ๋์ด ์ปดํ์ผ ๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ํ์ํ ํจํค์ง
- ์ด๋ฏธ ๋ง๋ค์ด์ง ์๋ฐ ํ๋ก๊ทธ๋จ(`.jar` ๋๋ `.class`)์ ์คํ๋ง ํ ๋ ํ์
JDK๋?: JRE + ๊ฐ๋ฐ ๋๊ตฌ
- Java Development Kit: ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ๋๊ตฌ ์ธํธ
- JRE+๊ฐ๋ฐ์ ํ์ํ ํด๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๊ฐ๋ฐ(์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์ปดํ์ผํ๊ณ , ๋๋ฒ๊น )ํ๊ธฐ ์ํด ํ์
- Java11๋ถํฐ๋ JDK๋ง ์ ๊ณตํ๋ฉฐ, JRE๋ ๋ฐ๋ก ์ ๊ณต๋์ง ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
- ๋ชฉํ์ ํ์ต ๋ด์ฉ์ ๋ฐฑ๊ธฐ์ ๋์ ์คํฐ๋ ํ๋ก์ ํธ๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค.
- [JAVA] JVM์ด๋? ๊ฐ๋ ๋ฐ ๊ตฌ์กฐ (JDK, JRE, JIT, ๊ฐ๋น์ง ์ฝ๋ ํฐ...)
- [1์ฃผ์ฐจ] JVM์ ๋ฌด์์ด๋ฉฐ ์๋ฐ ์ฝ๋๋ ์ด๋ป๊ฒ ์คํํ๋ ๊ฒ์ธ๊ฐ.
