์ถ์ฒ : https://www.youtube.com/watch?v=UzaGOXKVhwU

์ถ์ฒ: https://lilys.ai/digest/7250866/7790564/
๋ง์ฝ ์๋ฐ(Java)๊ฐ ์์๋ค๋ฉด ์ฐ๋ฆฌ๋ '์ด์์ฑ ์ง์ฅ'์ ๊ฐํ ์ปดํจํฐ ์ข
๋ฅ๋ง๋ค ํ๋ก๊ทธ๋จ์ ๋ค์ ๋ง๋ค์ด์ผ ํ์ ๊ฒ๋๋ค. JVM(์๋ฐ ๊ฐ์ ๋จธ์ )์ ์ด์์ฒด์ ๋ CPU ์ข
๋ฅ์ ์๊ด์์ด ์๋ฐ ์ฝ๋๊ฐ ์ด๋์๋ ์๋ํ๊ฒ ๋ง๋๋ ๋ง๋ฒ์ ํต์ญ์ฌ์ด์ ์คํ ํ๊ฒฝ์
๋๋ค . ํนํ JVM ๋ด๋ถ์ ์คํ(Stack)๊ณผ ํ(Heap)์ ์ด ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๋ ๋ฐ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ ๊ณต๊ฐ์ธ๋ฐ, ์คํ์ ์์ ์์
๊ณต๊ฐ์ฒ๋ผ ์ฐ๋ ๋๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ์กด์ฌํ๋ฉฐ ์คํ ์ค์ธ ๋ฉ์๋ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ณ , ํ์ ๋ชจ๋ ๊ฐ์ฒด๋ค์ด ๊ณต์ ํ๋ ์๊ตฌ์ ์ธ ์ฐฝ๊ณ ์ญํ ์ ํฉ๋๋ค .
1. JVM, ์ ํ์ํ๊ฐ์? ํ๋ซํผ ๋
๋ฆฝ์ฑ์ด๋ผ๋ ๋ง๋ฒ
- C๋ C++ ๊ฐ์ ์ธ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ๋๋ถํฐ ํน์ ์ปดํจํฐ(ํ๋ซํผ)์ ๋ง์ถฐ ์ปดํ์ผํด์ผ ํ๋ ๊น๋ค๋ก์์ด ์์ต๋๋ค .
- ์๋ฅผ ๋ค์ด, ๋ฆฌ๋
์ค์์ ๋ง๋ ์คํ ํ์ผ์ ์๋์ฐ์์ ๋๋ฆฌ๋ฉด ์ ๋ ์๋ํ์ง ์์ฃ .
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์๋์ฐ๋ฅผ ํ๊ฒ์ผ๋ก ๋ค์ ์ปดํ์ผํด์ผ ํ๋๋ฐ, ์ด๊ฑธ ํฌ๋ก์ค ์ปดํ์ผ(Cross-compile)์ด๋ผ๊ณ ํฉ๋๋ค .
- JVM์ ์ด ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๋๋ฐ, ์๋ฐ ์์ค ์ฝ๋๋ฅผ ์๋ฐ ์ปดํ์ผ๋ฌ(javac)๊ฐ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋(Byte Code)๋ผ๋ ์ค๊ฐ ์ธ์ด๋ก ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์
๋๋ค .
- ์ด ๋ฐ์ดํธ ์ฝ๋๋ ํน์ OS๋ CPU์ ์ข
์๋์ง ์๊ณ , JVM๋ง ์ค์น๋์ด ์๋ค๋ฉด ์ด๋ค ํ๊ฒฝ์์๋ ์คํ๋ ์ ์๋ ๊ณตํต์ด ์ญํ ์ ํฉ๋๋ค .

2. ์ปดํ์ผ๋ฌ์ ์ญํ : ํ๋ก ํธ์๋์ ๋ฐฑ์๋์ ๋ถ๋ฆฌ
- ์ผ๋ฐ์ ์ธ ์ปดํ์ผ๋ฌ๋ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ (ํ๋ก ํธ์๋), ๊ทธ๊ฒ์ ์ค์ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ๋ ์ผ(๋ฐฑ์๋)์ ๋ชจ๋ ๋ด๋นํฉ๋๋ค .
- ํ๋ก ํธ์๋๋ ์์ค ์ฝ๋์ ์๋ฏธ๋ฅผ ํ์
ํ๋ ๋ถ๋ถ์ด๋ผ ํ๋ซํผ์ด ๋ฐ๋์ด๋ ํฌ๊ฒ ๋ฌ๋ผ์ง์ง ์์์ .
- ํ์ง๋ง ๋ฐฑ์๋๋ ์ด์์ฒด์ ๋ ๊ธฐ๊ณ์ด์ ์์กด์ ์ด๊ธฐ ๋๋ฌธ์ ์๋์ฐ์ฉ, ๋ฆฌ๋
์ค์ฉ ๋ฑ ์ข
๋ฅ๋ณ๋ก ๋ฌ๋ผ์ ธ์ผ ํฉ๋๋ค .
- ์๋ฐ๋ ์ด ์ญํ ์ ๋ถ๋ฆฌํ๋๋ฐ, JavaC(์๋ฐ ์ปดํ์ผ๋ฌ)๊ฐ ํ๋ก ํธ์๋ ์ญํ ์ ๋งก์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ง๋ค๊ณ .
- JVM(์๋ฐ ๊ฐ์ ๋จธ์ )์ด ๋ฐฑ์๋ ์ญํ ์ ๋งก์์ ์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ฐ ํ๋ซํผ์ ๋ง๊ฒ ์คํํด์ฃผ๋ ๊ฒ๋๋ค .

3. JVM์ ๋ด๋ถ ๊ตฌ์กฐ: ๋ฉ๋ชจ๋ฆฌ ๊ตฌํ ๋๋๊ธฐ
- JVM์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ฌ๋ฌ ์ข
๋ฅ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ฉฐ, ํฌ๊ฒ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ๊ณผ ์ฐ๋ ๋๋ณ๋ก ๋
๋ฆฝ์ ์ธ ์์ญ์ผ๋ก ๋๋ฉ๋๋ค .
| ๊ตฌ๋ถ | ์์ญ ์ด๋ฆ | ํน์ง (๋น์ ) | ๊ณต์ ์ฌ๋ถ |
|---|
| ๊ณต์ ์์ญ | ๋ฉ์๋ ์์ญ (Method Area) | ํด๋์ค ์ ๋ณด(๋ณ์, ๋ฉ์๋ ๊ตฌ์กฐ ๋ฑ)๋ฅผ ๋ณด๊ดํ๋ ๋์๊ด | ๋ชจ๋ ์ฐ๋ ๋ ๊ณต์ |
| ๊ณต์ ์์ญ | ํ (Heap) | ํ๋ก๊ทธ๋จ ์คํ ์ค ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์ ์ฅํ๋ ์ฐฝ๊ณ | ๋ชจ๋ ์ฐ๋ ๋ ๊ณต์ |
| ๊ฐ๋ณ ์์ญ | ์คํ (Stack) | ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ง๋ค ์๊ธฐ๋ ์์ ์์
๋ | ์ฐ๋ ๋๋ณ๋ก ๋
๋ฆฝ์ |
- ๋ฉ์๋ ์์ญ์ ํด๋์ค ํ์ผ์ด ๋ก๋๋ ๋ ํด๋์ค์ ๊ตฌ์กฐ ์ ๋ณด(๋ณ์, ๋ฉ์๋ ์ ์ ๋ฑ)๋ฅผ ํ์ฑํด์ ์ ์ฅํ๋ ๊ณณ์
๋๋ค .
- ํ์ ์ฐ๋ฆฌ๊ฐ
new ํค์๋๋ก ์์ฑํ๋ ๋ชจ๋ ์ธ์คํด์ค(๊ฐ์ฒด)๋ค์ด ๋ชจ์ฌ ์ฌ๋ ๊ฑฐ๋ํ ์ํํธ ๋จ์ง๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค .
4. ์ฐ๋ ๋๋ณ ์์
๊ณต๊ฐ: ์คํ๊ณผ ์คํ ํ๋ ์
- ํ๋ก๊ทธ๋จ์์ ์ด๋ค ์์
์ ์คํํ๋ ๋จ์์ธ ์ฐ๋ ๋(Thread)๋ ๊ฐ๊ฐ ๋
๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค .
- ์๋ฐ ์คํ (Java Stack)์ ์ฐ๋ ๋๋ณ๋ก ํ๋์ฉ ์กด์ฌํ๋ฉฐ, ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด ์คํ ํ๋ ์(Stack Frame)์ด ์๊ฒจ๋ฉ๋๋ค .
- ์คํ์ ๋ง์น ์ ์ ์๊ธฐ์ฒ๋ผ ์๋ก ์์ด๊ณ (์ฑ์ฅํ๊ณ ), ๋ฉ์๋ ์คํ์ด ๋๋๋ฉด ๊ฐ์ฅ ์์ ์๋ ํ๋ ์(์ ์)๋ถํฐ ์ฌ๋ผ์ง๋๋ค .
- ์คํ ํ๋ ์์ ํด๋น ๋ฉ์๋ ์คํ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์์ ๋ฐ์ค์
๋๋ค .

5. ์คํ ํ๋ ์ ์์ ์์
๋๊ตฌ: ๋ก์ปฌ ๋ณ์์ ์คํผ๋๋ ์คํ
- ํ๋์ ์คํ ํ๋ ์ ์์๋ ํด๋น ๋ฉ์๋๊ฐ ๋์๊ฐ๋ ๋ฐ ํ์ํ ์ค์ํ ์ธ ๊ฐ์ง ์ ๋ณด๊ฐ ๋ค์ด์์ต๋๋ค .
- ๋ก์ปฌ ๋ณ์ ๋ฐฐ์ด (Local Variable Array): ์ฐ๋ฆฌ๊ฐ ๋ฉ์๋ ์์์ ์ ์ธํ ๋ณ์๋ค(์:
int a = 10;)์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์
๋๋ค .
- ๋ฐ์ดํธ ์ฝ๋๊ฐ "๋ก์ปฌ ๋ณ์ 1๋ฒ ์ธ๋ฑ์ค์ ์ ์ฅํด!"๋ผ๊ณ ๋ช
๋ นํ๋ฉด ์ด ๋ฐฐ์ด์ ํน์ ์์น์ ๊ฐ์ด ๋ค์ด๊ฐ๋๋ค .
- ์คํผ๋๋ ์คํ (Operand Stack): ์ค์ ์ฐ์ฐ์ ์ํ ์์ ์ ์ฅ์๋ก, CPU์ ๋ ์ง์คํฐ์ฒ๋ผ ์ฌ์ฉ๋ฉ๋๋ค .
- ์๋ฅผ ๋ค์ด, ๋ ์ซ์๋ฅผ ๋ํ๋ ค๋ฉด ๋ฐ์ดํธ ์ฝ๋ ๋ช
๋ น(
dadd)์ ํตํด ์ด ์คํ์์ ๋ ๊ฐ์ ๊บผ๋ด์ ์ฐ์ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ด ์คํ์ ๋ฃ์ต๋๋ค .

6. JVM์ด ๋ ์ง์คํฐ ๋์ ์คํ์ ์ฐ๋ ์ด์ : ๋จ์ํจ๊ณผ ์ด์์ฑ
- ์ผ๋ฐ์ ์ธ CPU๋ ๋ ์ง์คํฐ๋ผ๋ ์ด๊ณ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์ฉํด ์ฐ์ฐ์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ JVM์ ์ ์ด ๋ณต์กํ ์คํ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ ํํ์๊น์?
- JVM์ด ์คํ์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ์ด์์ฑ(Portability)์ ๊ทน๋ํํ๊ธฐ ์ํด์์
๋๋ค .
- ๋ ์ง์คํฐ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฐ๋ ค๋ฉด, ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์ปดํจํฐ์ CPU ๋ ์ง์คํฐ ๊ฐ์๋ ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์์ด์ผ ์ฝ๋๋ฅผ ์งค ์ ์์ต๋๋ค .
- ์ด๋ ์๋ฐ๊ฐ ๋ชฉํ๋ก ํ๋ "์ด๋์๋ ๋์"ํ๋ ๋ฒ์ฉ์ฑ๊ณผ ์ ๋ฉด์ผ๋ก ์ถฉ๋ํฉ๋๋ค.
- ์คํ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ ์ค์ ํ๋์จ์ด์ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ์จ๊ธฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๋(Push/Pop) ๋จ์ํ ๋ฐฉ์์ผ๋ก ์ฐ์ฐ์ ์ถ์ํํ๊ธฐ ๋๋ฌธ์ .
- JVM์ ํ๋์จ์ด์ ์ฐจ์ด์ ์ต์ํ์ผ๋ก ๊ด์ฌํ๋ฉด์๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์์ ์ ์ผ๋ก ์คํํ ์ ์๊ฒ ๋ฉ๋๋ค .