๋ก๋ ๋ฉ๋ชจ๋ฆฌ ์์ง
JVM
JVM(Java Virtual Machine)์ด๋, ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ฐ์ ํ๊ฒฝ์ด๋ค. ์๋ฐ ์ฝ๋๊ฐ ์์ฑ๋๋ฉด, ์ด๋ฅผ ๋ฐ๋ก ๊ธฐ๊ณ์ด๋ก ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ JVM์ด ์ค๊ฐ์์ ๋ฐ์ดํธ์ฝ๋(.class ํ์ผ)์ ํด์ํ๊ณ , ์ด์์ฒด์ ์ ๋ง๋ ๊ธฐ๊ณ์ด๋ก ๋ณํํ์ฌ ์คํํ๋ค.
JVM์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ํ๋ซํผ ๋ ๋ฆฝ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ ์์์ด๋ค. ์ฆ JVM๋ง ์์ผ๋ฉด ์ด๋ค ์ด์์ฒด์ ์์๋ ์คํ๋ ์ ์๋ค. "Write Once, Run Anywhere"๋ JVM์ ํตํด ์คํ๋๋ค.
JVM (Java Virtual Machine) ๊ตฌ์ฑ
JVM์ ์ธ ๊ฐ์ง ์์๋ง ๊ธฐ์ต/ํ์ตํ๋ฉด ๋๋ค.
1. Class Loader(ํด๋์ค ๋ก๋, ๋ก๋): ์ปดํ์ผ๋ ๋ฐ์ดํธ์ฝ๋(.class)๋ฅผ JVM์ ๋ก๋ํ๋ค.
2. Runtime Data Area(๋ฐํ์ ๋ฐ์ดํฐ ์์ญ, ๋ฉ๋ชจ๋ฆฌ):๋ฉ๋ชจ๋ฆฌ์์ ์คํ ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค.(๋ฉ๋ชจ๋ฆฌ์ ์น๋๋ค.)
3. Execution Engine(์คํ ์์ง, ์์ง): ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ์ฌ ์คํํ๋ค.
Class Loader(ํด๋์ค ๋ก๋)
Class Loader๋ JVM์ด ์คํํ ๋ ํ์ํ ๋ฐ์ดํธ์ฝ๋(.class)๋ฅผ ๋ก๋ฉํ๋ ์ญํ ์ ํ๋ค.
์ด๋ ๋์ ๋ก๋ฉ(Dynamic Loading) ๋ฐฉ์์ผ๋ก ํ์ํ ๋ฐ์ดํธ์ฝ๋๋ง์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ค.
Class Loader๋ 3๊ฐ์ง ์ ์ฐจ๋ฅผ ์ํํ๋ค.
- Loading: ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋
- Linking: ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ํด๋์ค๋ฅผ ์ฐ๊ฒฐ
- Initialzation: ํด๋์ค์ ํ๋ ์ด๊ธฐํ ๋ฐ static ๋ธ๋ก ์คํ
Runtime Data Area(JVM ๋ฉ๋ชจ๋ฆฌ)
JVM์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๊ณต๊ฐ์ผ๋ก ํฌ๊ฒ ์ฐ๋ ๋ ์์ญ๊ณผ ๋น์ฐ๋ ๋ ์์ญ์ผ๋ก ๋๋ ์ ์๋ค.
์ฐ๋ ๋(Thread) ์์ญ
์ฐ๋ ๋๋ง๋ค ๋ณ๋๋ก ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก, ํจ์ ์คํ์ ํ์ํ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋๋ค.
- Stack ์์ญ (Thread Stack Area)
- ํจ์ ํธ์ถ ์ ํ๋ผ๋ฏธํฐ, ์ง์ญ ๋ณ์, ๋ฆฌํด ๊ฐ์ด ์ ์ฅ๋๋ค.
- Primitive ํ์ ๋ณ์(์์ ํ์ )๋ ์คํ ์์ญ์ ์ง์ ๊ฐ์ ์ ์ฅํ๋ค.
- Reference ํ์ ๋ณ์(์ฐธ์กฐ ํ์ )๋ Heap ์์ญ์ด๋ Method ์์ญ์ ์๋ ๊ฐ์ฒด์ ์ฃผ์(์ฐธ์กฐ๊ฐ)๋ฅผ ์ ์ฅํ๋ค.
- ์คํ์ ํจ์ ํธ์ถ ์ ํ ๋น๋๊ณ ํจ์ ์คํ์ด ๋๋๋ฉด ํด์ ๋๋ LIFO(Last In First Out) ๊ตฌ์กฐ์ด๋ค.
- Method/Static ์์ญ
- ๊ฐ ํด๋์ค์ ๋ํ ๋ฉ์๋ ์ ๋ณด์ Static ๋ณ์๊ฐ ์ ์ฅ๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ํด๋์ค ์ ๋ณด๊ฐ ์ด๊ณณ์ ์ ์ฌ๋๊ณ , ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง ์ ์ง๋๋ค.
๋น์ฐ๋ ๋ ์์ญ(Thread-Shared ์์ญ)
๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค.
- Heap ์์ญ (Heap Area)
- ๊ฐ์ฒด์ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ค.
- ์๋ฐ ํ๋ก๊ทธ๋จ์์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ ํํ ๋ํ๋๋ OutOfMemoryError๋, Heap ์์ญ์ ๋๋ฌด ๋ง์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ Garbage Collection์ด ์ ๋๋ก ์ํ๋์ง ์์ ๋ ๋ฐ์ํ๋ค. ์ฆ, ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๊ฐ ์ ๊ฑฐ๋์ง ์์ผ๋ฉด ์ด ์์ญ์ด ๊ฐ๋ ์ฐจ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
- Method ์์ญ
- ํด๋์ค ๊ตฌ์กฐ ๋ฐ ๋ฉ์๋์ ๋ํ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค.
- ํด๋์ค ๋ก๋๊ฐ ํด๋์ค ํ์ผ์ ์ฝ์ด๋ค์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ ๋, ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ด๊ณณ์ ์ ์ฅ๋๋ค.
Garbage Collection (GC)
Garbage Collection(GC๋) JVM์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ Heap ์์ญ์์ ์ ๊ฑฐํด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ค.
- Stop-The-World ์ด๋ฒคํธ: GC๊ฐ ์คํ๋ ๋ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ฉ์ถ๋ ํ์์ด๋ค. Heap์ด ๊ณต์ ์์ญ์ด๋ฏ๋ก, ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ฉ์ถฐ์ผ ์์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
Generational GC
Heap ์์ญ์ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ ๊ฐ์ ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ์ผ๋ก ๋๋๋ค.
- Young Generation: ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ๊ณง๋ฐ๋ก ์ฌ๋ผ์ง๋ ๊ณต๊ฐ
- Eden ์์ญ๊ณผ Survivor ์์ญ์ผ๋ก ๋๋๋ฉฐ, Minor GC๊ฐ ์์ฃผ ์ผ์ด๋๋ค.
- Old Generation: Young Generation์์ ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ด๊ณณ์ผ๋ก ์ด๋ํ๋ค. Major GC๊ฐ ๋ฐ์ํ๋ค.
- Permanent Generation: ํด๋์ค ์ ๋ณด์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
GC ์ค์ ์ ํตํ ํ๋
GC๋ JVM์์ ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด๋ค. ํ์ง๋ง GC์ ๋น๋๋ ์คํ ์๊ฐ์ด ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์, Heap ์ฌ์ด์ฆ์ GC์๊ณ ๋ฆฌ์ฆ์ ์ ์ ํ ์ค์ ํด ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
Heap ์ฌ์ด์ฆ ์ค์
- -Xms: JVM์ด ์์ํ ๋ ํ ๋นํ ์ต์ Heap ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค.
- -Xmx: JVM์ด ์ฌ์ฉํ ์ ์๋ ์ต๋ Heap ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค.
์: `-Xms512m -Xmx2048m` → ์ต์ 512MB, ์ต๋ 2048MB๋ก Heap ์์ญ์ ์ค์
Execution Engine (์คํ ์์ง)
Execution Engine์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ์ฌ ์คํํ๋ค. ์ด ๊ณผ์ ์ ๋๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ์ธํฐํ๋ฆฌํฐ: ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํด ๊ธฐ๊ณ์ด๋ก ๋ณํํ๊ณ ์คํํ๋ค.
- JIT(Just-In-Time) ์ปดํ์ผ๋ฌ: ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ค.
๋ํ, Execution Engine์ Garbage Collection์ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
Runtime Data Area์ ๋ณ์ ๋ถ๋ฅ
- ์ ์ (ํด๋์ค) ๋ณ์ (Static Variable): ํด๋์ค ๋ด์์ ์ ์ธ๋ static ๋ณ์๋ Method/Static ์์ญ์ ์ ์ฅ๋๋ค.
- ์ธ์คํด์ค ๋ณ์ (Instance Variable): ์ธ์คํด์ค ์์ฑ ์ Heap ์์ญ์ ์ ์ฅ๋๋ค.
- ์ง์ญ ๋ณ์ (Local Variable): ๋ฉ์๋ ํธ์ถ ์ ์์ฑ๋๋ฉฐ, Stack ์์ญ์ ์ ์ฅ๋๋ค.
JVM์ ๊ตฌ์ฑ ๊ทธ๋ฆผ ํ์ฅ์ผ๋ก ์ดํดํ๊ธฐ
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
https://chamalwr.medium.com/inside-the-jvm-part-05-execution-engine-15857827ac82
https://goodgid.github.io/Java-Class-Loader/#google_vignette
'๐ปDEV-STUDY > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Final๊ณผ Static (2) | 2024.09.30 |
---|---|
[Java] Collection (0) | 2024.09.28 |
[Java] ๊ฐ์ฒด ์์ฑํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2024.09.25 |
[Java] Exception ์์ธ์ฒ๋ฆฌ (0) | 2024.09.25 |
[Java] Java ๋์ ์๋ฆฌ (0) | 2024.09.25 |