...

์ ๋ฒ ํฌ์คํ ์์๋ JRE / JDK / JVM์ ๋ํด์ ๊ฐ๋ตํ๊ฒ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค๋ฉด, ์ด๋ฒ ํฌ์คํ ์์๋ JVM์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํด ์ข ๋ ์์ธํ๊ฒ ์์๋ณด๋๋ก ํ ์์ ์ด๋ค.
JVM(์๋ฐ ๊ฐ์ ๋จธ์ )์ ์๋ฐ ์ธ์ด์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ค. ์ฝํ๋ฆฐ, ์ค์นผ๋ผ ์ธ์ด์์๋ JVM ๋์ ๋ฐฉ์์ ๊ทธ๋๋ก ๋ฐ๋ฅธ๋ค.
๋ฐ๋ผ์ JVM์ ์ ํํ ์ดํดํ๋ฉด ์ถํ์ ์๋ฐ์์ ํ์๋ ๋ชจ๋ ์ธ์ด๋ฅผ ์ดํดํ๋๋ฐ ์์ด ์์ํด์ง๋ฉฐ, ๋ด๋ถ์์ ์ ํํ ์ด๋ป๊ฒ ๋์์ ํด์ ์ฝ๋๊ฐ ์คํ์ด ๋๋์ง ๊ฐ๋ ์ ์๋ฉด ์ฝ๋ ์ต์ ํ๋ ๋ฆฌํฉํ ๋ง์ ํ๋๋ฐ ๋งค์ฐ ๋์์ด ๋๋ค.

์์ ๊ทธ๋ฆผ์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋์๋ฆฌ๋ฅผ ๊ฐ๋ตํ๊ฒ ๊ทธ๋ ค๋ณธ ๊ฒ์ธ๋ฐ, ์ง๊ธ๋ถํฐ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ธ JVM(์๋ฐ ๊ฐ์ ๋จธ์ ) ์คํ ๋ถ๋ถ์ ๋นจ๊ฐ ๋ฐ์ค๋ฅผ ์น ๋ถ๋ถ์ธ, ์ปดํ์ผ๋ .class ํ์ผ์ ์ด๋ ํ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์ณ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๊ณผ์ ์ด๋ค.
๋ฉด์ ์์๋ ๋จ๊ณจ๋ก ๋์ค๋ ์ง๋ฌธ์ด๋, JVM ํ๋ฉด ๊ตฌ์กฐ๊ฐ ๋์ ์๋ฅธ๊ฑฐ๋ฆด ์ ๋๋ก ์๋ฒฝํ๊ฒ ์์งํด๋ณด์.
์๋ฐ ๊ฐ์ ๋จธ์ (JVM)์ ๋์ ๋ฐฉ์
์๋ฐ ๊ฐ์ ๋จธ์ (Java Virtual Machine)์ธ JVM์ ์ญํ ์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋์ค ๋ก๋๋ฅผ ํตํด ์ฝ์ด ์๋ฐ API์ ํจ๊ป ์คํํ๋ ๊ฒ์ด๋ค.
๋ค์์ ์๋ฐ ์์ค ํ์ผ์ ์ด๋ค ๋์์ผ๋ก ์ฝ๋๋ฅผ ์ฝ๋์ง์ ๋ํ ๊ฐ๋จํ ์์ฝ ๋์์ด๋ค.

- ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด JVM์ OS๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋๋ค.
- ์๋ฐ ์ปดํ์ผ๋ฌ(javac)๊ฐ ์๋ฐ ์์ค์ฝ๋(.java)๋ฅผ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋(.class)๋ก ์ปดํ์ผ ํ๋ค.
- Class Loader๋ ๋์ ๋ก๋ฉ์ ํตํด ํ์ํ ํด๋์ค๋ค์ ๋ก๋ฉ ๋ฐ ๋งํฌ ํ์ฌ Runtime Data Area(์ค์ง์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์ ๊ด๋ฆฌํ๋ ์์ญ)์ ์ฌ๋ฆฐ๋ค.
- Runtime Data Area์ ๋ก๋ฉ ๋ ๋ฐ์ดํธ ์ฝ๋๋ Execution Engine์ ํตํด ํด์๋๋ค.
- ์ด ๊ณผ์ ์์ Execution Engine์ ์ํด Garbage Collector์ ์๋๊ณผ Thread ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์๋ฐ ๊ฐ์ ๋จธ์ (JVM)์ ๊ตฌ์กฐ
JVM ๋์ ๋ฐฉ์์ ๊ฐ๋ตํ๊ฒ ์์๋ดค์ผ๋ ์ด์ ๊ตฌ์ฑ ์์๋ฅผ ์์ธํ ์์๋ณด์.
๋ค์์ ์์์ ๋ค๋ค๋ณธ JVM ๋์ ๊ณผ์ ์ค Class Loader โ Execution Engine โ Runtime Data Area ๋ถ๋ถ์ ์ข๋ ์์ธํ ํ ๋์์ด๋ค.

์ด์ฒ๋ผ JVM์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๋ค.
- ํด๋์ค ๋ก๋(Class Loader)
- ์คํ ์์ง(Execution Engine)
- ์ธํฐํ๋ฆฌํฐ(Interpreter)
- JIT ์ปดํ์ผ๋ฌ(Just-in-Time)
- ๊ฐ๋น์ง ์ฝ๋ ํฐ(Garbage collector)
- ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ (Runtime Data Area)
- ๋ฉ์๋ ์์ญ
- ํ ์์ญ
- PC Register
- ์คํ ์์ญ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋
- JNI - ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์ธํฐํ์ด์ค (Native Medthod Interface)
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Native Method Library)
ํด๋์ค ๋ก๋ (Class Loader)

ํด๋์ค ๋ก๋๋ JVM ๋ด๋ก ํด๋์ค ํ์ผ(*.class)์ ๋์ ์ผ๋ก ๋ก๋ํ๊ณ , ๋งํฌ๋ฅผ ํตํด ๋ฐฐ์นํ๋ ์์ ์ ์ํํ๋ ๋ชจ๋์ด๋ค.
์ฆ, ๋ก๋๋ ๋ฐ์ดํธ ์ฝ๋(.class)๋ค์ ์ฎ์ด์ JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ธ Runtime Data Areas์ ๋ฐฐ์นํ๋ค.
ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ๋ก๋ฉ ๊ธฐ๋ฅ์ ํ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์๊ณ , ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ๊ฒฝ์ฐ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๊ฒ ๋๋ค.
ํด๋์ค ํ์ผ์ ๋ก๋ฉ ์์๋ ๋ค์๊ณผ ๊ฐ์ด 3๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ค. (Loading โ Linking โ Initialization)

- Loading(๋ก๋) : ํด๋์ค ํ์ผ์ ๊ฐ์ ธ์์ JVM์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค.
- Linking(๋งํฌ) : ํด๋์ค ํ์ผ์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฒ์ฆํ๋ ๊ณผ์ ์ด๋ค.
- Verifying(๊ฒ์ฆ) : ์ฝ์ด๋ค์ธ ํด๋์ค๊ฐ JVM ๋ช ์ธ์ ๋ช ์๋ ๋๋ก ๊ตฌ์ฑ๋์ด ์๋์ง ๊ฒ์ฌํ๋ค.
- preparing(์ค๋น) : ํด๋์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
- Resolving(๋ถ์) : ํด๋์ค์ ์์ ํ ๋ด ๋ชจ๋ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ๋ค์ด๋ ํธ ๋ ํผ๋ฐ์ค๋ก ๋ณ๊ฒฝํ๋ค.
- Initialization(์ด๊ธฐํ) : ํด๋์ค ๋ณ์๋ค์ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค. ( static ํ๋๋ค์ ์ค์ ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ ๋ฑ )
์คํ ์์ง (Execution Engine)
์คํ ์์ง์ ํด๋์ค ๋ก๋๋ฅผ ํตํด ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ฐฐ์น๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํํ๋ค
์๋ฐ ๋ฐ์ดํธ ์ฝ๋(*.class)๋ ๊ธฐ๊ณ๊ฐ ๋ฐ๋ก ์ํํ ์ ์๋ ์ธ์ด๋ณด๋ค๋ ๊ฐ์๋จธ์ ์ด ์ดํดํ ์ ์๋ ์ค๊ฐ ๋ ๋ฒจ๋ก ์ปดํ์ผ ๋ ์ฝ๋์ด๋ค. ๊ทธ๋์ ์คํ ์์ง์ ์ด์ ๊ฐ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ค์ ๋ก JVM ๋ด๋ถ์์ ๊ธฐ๊ณ๊ฐ ์คํํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝํด์ค๋ค.
์ด ์ํ ๊ณผ์ ์์ ์คํ ์์ง์ ์ธํฐํ๋ฆฌํฐ์ JIT ์ปดํ์ผ๋ฌ ๋ ๊ฐ์ง ๋ฐฉ์์ ํผํฉํ์ฌ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ๋ค.

์ธํฐํ๋ฆฌํฐ(Interpreter)
๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ฝ์ด์ ํด์ํ๊ณ ๋ฐ๋ก ์คํํ๋ค.
JVM์์์ ๋ฐ์ดํธ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๋ค๋ง ๊ฐ์ ๋ฉ์๋ ๋ผ๋ ์ฌ๋ฌ๋ฒ ํธ์ถ์ด ๋๋ค๋ฉด ๋งค๋ฒ ํด์ํ๊ณ ์ํํด์ผ ๋์ ์ ์ฒด์ ์ธ ์๋๋ ๋๋ฆฌ๋ค.
JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler)
์์ Interpreter์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์
๋ ๋ฐฉ์์ผ๋ก ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ์ฌ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ Native Code๋ก ๋ณ๊ฒฝํ๊ณ ์ดํ์๋ ํด๋น ๋ฉ์๋๋ฅผ ๋ ์ด์ ์ธํฐํ๋ฆฌํ
ํ์ง ์๊ณ ์บ์ฑํด ๋์๋ค๊ฐ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ง์ ์คํํ๋ ๋ฐฉ์์ด๋ค.
ํ๋์ฉ ์ธํฐํ๋ฆฌํ
ํ์ฌ ์คํํ๋๊ฒ์ด ์๋๋ผ, ์ปดํ์ผ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์คํ ์๋๋ ์ธํฐํ๋ฆฌํ
๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค.
ํ์ง๋ง ๋ฐ์ดํธ์ฝ๋๋ฅผ Native Code๋ก ๋ณํํ๋ ๋ฐ์๋ ๋น์ฉ์ด ์์๋๋ฏ๋ก, JVM์ ๋ชจ๋ ์ฝ๋๋ฅผ JIT ์ปดํ์ผ๋ฌ ๋ฐฉ์์ผ๋ก ์คํํ์ง ์๊ณ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ค ์ผ์ ๊ธฐ์ค์ด ๋์ด๊ฐ๋ฉด JIT ์ปดํ์ผ ๋ฐฉ์์ผ๋ก ๋ช
๋ น์ด๋ฅผ ์คํํ๋ ์์ผ๋ก ์งํํ๋ค.
๋ค์ดํฐ๋ธ ์ฝ๋๋, JAVA์์ ๋ถ๋ชจ๊ฐ ๋๋ C์ธ์ด๋, C++, ์ด์ ๋ธ๋ฆฌ์ด๋ก ๊ตฌ์ฑ๋ ์ฝ๋๋ฅผ ์๋ฏธํ๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ (Garbage Collector ,GC)

์๋ฐ ๊ฐ์ ๋จธ์ ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(garbage collector)๋ฅผ ์ด์ฉํ์ฌ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๋๋ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ์ํด ์ค๋ค.
C์ธ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ง์ ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ค์ผ ๋์ง๋ง, JAVA๋ ์ด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ด์ฉํด ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์๊ฐ ์ต์ ํ ์์ผ์ค๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ์ง ์์๋ ๋๋ฏ๋ก, ๋์ฑ ์์ฝ๊ฒ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋๋ก ํด์ค๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋์ผ๋ก ์คํ๋์ง๋ง, ๋จ GC(๊ฐ๋น์ง ์ปฌ๋ ํฐ) ๊ฐ ์คํ๋๋ ์๊ฐ์ ์ ํด์ ธ ์์ง ์๋ค.
ํนํ Full GC ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, GC ๋ฅผ ์ ์ธํ ๋ชจ๋ ์ค๋ ๋๊ฐ ์ค์ง๋๊ธฐ ๋๋ฌธ์ ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋์ผ๋ก GC(๊ฐ๋น์ง ์ปฌ๋ ํฐ)๋ฅผ ์คํํ๊ธฐ์ํดSystem.gc()๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ํจ์ ์ค์ ์คํ์ ๋ณด์ฅ๋์ง๋ ์๋๋ค.
[JAVA] โ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ ์๋ฆฌ & GC ์ข ๋ฅ ๐ฏ ์ด์ ๋ฆฌ
๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ๋? ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collectoin, ์ดํ GC)์ ์๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก JVM(์๋ฐ ๊ฐ์ ๋จธ์ )์ Heap ์์ญ์์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์ค ํ์ ์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด
inpa.tistory.com
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ (Runtime Data Area)

๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ์ฝ๊ฒ ๋งํ๋ฉด JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฌํ๋ ์์ญ์ด๋ค.
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํฌ๊ฒ Method Area, Heap Area, Stack Area, PC Register, Native Method Stack๋ก ๋๋ ์ ์๋ค.

์ด๋ Method Area, Heap Area ๋ ๋ชจ๋ ์ฐ๋ ๋(Thread)๊ฐ ๊ณต์ ํ๋ ์์ญ์ด๊ณ , ๋๋จธ์ง Stack Area, PC Register, Native Method Stack ์ ๊ฐ ์ฐ๋ ๋ ๋ง๋ค ์์ฑ๋๋ ๊ฐ๋ณ ์์ญ์ด๋ค.
๋ฐ๋ผ์ ์์ ๊ทธ๋ฆผ์ ์ข๋ ์์ธํ ํํํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋์์ด ๋๋ค.

๋ฉ์๋ ์์ญ (Method Area)
๋ฉ์๋ ์์ญ์ JVM์ด ์์๋ ๋ ์์ฑ๋๋ ๊ณต๊ฐ์ผ๋ก ๋ฐ์ดํธ ์ฝ๋(.class)๋ฅผ ์ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ๋ฆด ๋ ์ด๊ธฐํ๋๋ ๋์์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค.
JVM์ด ๋์ํ๊ณ ํด๋์ค๊ฐ ๋ก๋๋ ๋ ์ ์ฌ๋์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ์ ์ฅ ๋๋ค.
๋ฉ์๋ ์์ญ(Method Area) ์ Class Area ๋ Static Area ๋ก๋ ๋ถ๋ฆฌ์ด๋ค.
๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ด๋ผ ๋ค์๊ณผ ๊ฐ์ด ์ด๊ธฐํ ์ฝ๋ ์ ๋ณด๋ค์ด ์ ์ฅ๋๊ฒ ๋๋ค.
- Field Info : ๋ฉค๋ฒ ๋ณ์์ ์ด๋ฆ, ๋ฐ์ดํฐ ํ์ , ์ ๊ทผ ์ ์ด์์ ์ ๋ณด
- Method Info : ๋ฉ์๋ ์ด๋ฆ, return ํ์ , ํจ์ ๋งค๊ฐ๋ณ์, ์ ๊ทผ ์ ์ด์์ ์ ๋ณด
- Type Info : Class ์ธ์ง Interface ์ธ์ง ์ฌ๋ถ ์ ์ฅ, Type์ ์์ฑ, ์ด๋ฆ Super Class์ ์ด๋ฆ

๊ฐ๋จํ ๋งํ์๋ฉด ๋ฉ์๋ ์์ญ์๋ ์ ์ ํ๋์ ํด๋์ค ๊ตฌ์กฐ๋ง์ ๊ฐ๊ณ ์๋ค๊ณ ํ ์์๋ค.
โป ๋ฉ์๋ ์์ญ / ๋ฐํ์ ์์ ํ์ ์ฌ์ฉ๊ธฐ๊ฐ ๋ฐ ์ค๋ ๋ ๊ณต์ ๋ฒ์
- JVM ์์์ ์์ฑ
- ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง
- ๋ช ์์ ์ผ๋ก null ์ ์ธ ์
[ Runtime Constant Pool ]
- ๋ฉ์๋ ์์ญ์ ์กด์ฌํ๋ ๋ณ๋์ ๊ด๋ฆฌ์์ญ.
- ๊ฐ ํด๋์ค/์ธํฐํ์ด์ค ๋ง๋ค ๋ณ๋์ constant pool ํ ์ด๋ธ์ด ์กด์ฌํ๋๋ฐ, ํด๋์ค ์์ฑํ ๋ ์ฐธ์กฐํด์ผํ ์ ๋ณด๋ค์ ์์๋ก ๊ฐ์ง๊ณ ์๋ ์์ญ์ด๋ค.
- JVM์ ์ด Constant Pool์ ํตํด ํด๋น ๋ฉ์๋๋ ํ๋์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฃผ์๋ฅผ ์ฐพ์ ์ฐธ์กฐํ๋ค.
- ์ ๋ฆฌํ๋ฉด ์์ ์๋ฃํ์ ์ ์ฅํ์ฌ ์ฐธ์กฐํ๊ณ ์ค๋ณต์ ๋ง๋ ์ญํ ์ ์ํํ๋ค.
ํ ์์ญ (Heap Area)
ํ ์์ญ์ ๋ฉ์๋ ์์ญ์ ํจ๊ป ๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๋ฉฐ, JVM์ด ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋จ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฐํ์ ์ ๋์ ์ผ๋ก ํ ๋นํ์ฌ ์ฌ์ฉํ๋ ์์ญ์ด๋ค.
์ฆ, new ์ฐ์ฐ์๋ก ์์ฑ๋๋ ํด๋์ค์ ์ธ์คํด์ค ๋ณ์, ๋ฐฐ์ด ํ์ ๋ฑ Reference Type์ด ์ ์ฅ๋๋ ๊ณณ์ด๋ค.
๋น์ฐํ Method Area ์์ญ์ ์ ์ฅ๋ ํด๋์ค๋ง์ด ์์ฑ์ด ๋์ด ์ ์ฌ๋๋ค. (๋น์ฐํ ์๋ฆฌ์ด๊ธด ํ๋ค)

โป ํ ์์ญ์ ์ฌ์ฉ๊ธฐ๊ฐ ๋ฐ ์ค๋ ๋ ๊ณต์ ๋ฒ์
- ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ฑฐ๋ ๋ช ์์ ์ผ๋ก null ์ ์ธ ์
- GC(Garbage Collection) ๋์
์ ์ํ ์ ์ ํ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ Reference Type์ผ๋ก์, JVM ์คํ ์์ญ์ ๋ณ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋์์ ์ฐธ์กฐ๋๋ค๋ ์ ์ด๋ค.
์ฆ, ํ์ ์ฐธ์กฐ ์ฃผ์๋ "์คํ"์ด ๊ฐ๊ณ ์๊ณ ํด๋น ๊ฐ์ฒด๋ฅผ ํตํด์๋ง ํ ์์ญ์ ์๋ ์ธ์คํด์ค๋ฅผ ํธ๋ค๋งํ ์ ์๋ ๊ฒ์ด๋ค.

๋ง์ผ ์ฐธ์กฐํ๋ ๋ณ์๋ ํ๋๊ฐ ์๋ค๋ฉด ์๋ฏธ ์๋ ๊ฐ์ฒด๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ฐ๋ ๊ธฐ๋ก ์ทจ๊ธํ๊ณ JVM์ ์ฐ๋ ๊ธฐ ์์ง๊ธฐ์ธ Garbage Collector๋ฅผ ์คํ์์ผ ์ฐ๋ ๊ธฐ ๊ฐ์ฒด๋ฅผ ํ ์์ญ์์ ์๋์ผ๋ก ์ ๊ฑฐ๋๋ค.
์ด์ฒ๋ผ ํ ์์ญ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ ๊ณต๊ฐ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํจ์จ์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ๊ธฐ ์ํด์ ์ธ๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด 5๊ฐ์ง ์์ญ์ผ๋ก ๋๋๊ฒ ๋๋ค.

์ด๋ ๊ฒ ๋ค์ฏ๊ฐ์ง ์์ญ(Eden, survivor 0, survivor 1, Old, Permanent)์ผ๋ก ๋๋ ํ ์์ญ์ ๋ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก Young Generation ๊ณผ Old Generation ์์ญ์ผ๋ก ๊ตฌ๋ถ๋๊ฒ ๋๋๋ฐ ๋ค์๊ณผ ๊ฐ๋ค.
- Young Generation : ์๋ช
์ฃผ๊ธฐ๊ฐ ์งง์ ๊ฐ์ฒด๋ฅผ GC ๋์์ผ๋ก ํ๋ ์์ญ.
- Eden : new๋ฅผ ํตํด ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์์น. ์ ๊ธฐ์ ์ธ ์ฐ๋ ๊ธฐ ์์ง ํ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ Survivor๋ก ์ด๋
- Survivor 0 / Survivor 1 : ๊ฐ ์์ญ์ด ์ฑ์์ง๊ฒ ๋๋ฉด, ์ด์๋จ์ ๊ฐ์ฒด๋ ๋น์์ง Survivor๋ก ์์ฐจ์ ์ผ๋ก ์ด๋
- Old Generation : ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธด ๊ฐ์ฒด๋ฅผ GC ๋์์ผ๋ก ํ๋ ์์ญ. Youn Generation์์ ๋ง์ง๋ง๊น์ง ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ด๋
์ด ์์ญ์์ ์ด๋ป๊ฒ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์์ด ์ผ์ด๋๋์ง ์์๋ณด๊ณ ์ถ์ผ๋ฉด ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค.
[JAVA] โ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ ์๋ฆฌ & GC ์ข ๋ฅ ๐ฏ ์ด์ ๋ฆฌ
๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ๋? ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collectoin, ์ดํ GC)์ ์๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก JVM(์๋ฐ ๊ฐ์ ๋จธ์ )์ Heap ์์ญ์์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์ค ํ์ ์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด
inpa.tistory.com
์คํ ์์ญ (Stack Area)
์คํ ์์ญ์ int, long, boolean ๋ฑ ๊ธฐ๋ณธ ์๋ฃํ์ ์์ฑํ ๋ ์ ์ฅํ๋ ๊ณต๊ฐ์ผ๋ก, ์์์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ณ์๋ ์ ๋ณด๋ค์ด ์ ์ฅ๋๋ ์์ญ์ด๋ค.

์๋ฃ๊ตฌ์กฐ Stack์ ๋ง์ง๋ง์ ๋ค์ด์จ ๊ฐ์ด ๋จผ์ ๋๊ฐ๋ LIFO ๊ตฌ์กฐ๋ก push์ pop ๊ธฐ๋ฅ ์ฌ์ฉ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๋ฉ์๋ ํธ์ถ ์๋ง๋ค ๊ฐ๊ฐ์ ์คํ ํ๋ ์(๊ทธ ๋ฉ์๋๋ง์ ์ํ ๊ณต๊ฐ)์ด ์์ฑ๋๊ณ ๋ฉ์๋ ์์์ ์ฌ์ฉ๋๋ ๊ฐ๋ค์ ์ ์ฅํ๊ณ , ํธ์ถ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฐ ์ฐ์ฐ ์ ์ผ์ด๋๋ ๊ฐ๋ค์ ์์๋ก ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์๋ ์ํ์ด ๋๋๋ฉด ํ๋ ์๋ณ๋ก ์ญ์ ๋๋ค.
[ ์คํ ํ๋ ์(stack frame) ]
๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ํ๋ ์์ด ๋ง๋ค์ด์ง๋ฉฐ, ํ์ฌ ์คํ์ค์ธ ๋ฉ์๋ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ณณ์ด๋ค
๋ฉ์๋ ํธ์ถ ๋ฒ์๊ฐ ์ข ๋ฃ๋๋ฉด ์คํ์์ ์ ๊ฑฐ๋๋ค.
์คํ ํ๋ ์์ ์์ด๋ ๋ฐ์ดํฐ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด๊ฐ, ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฑ์ด ์๋ค.
๋จ, ๋ฐ์ดํฐ์ ํ์ ์ ๋ฐ๋ผ ์คํ(stack) ๊ณผ ํ(haeap)์ ์ ์ฅ๋๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค.
- ๊ธฐ๋ณธ(์์)ํ์ ๋ณ์๋ ์คํ ์์ญ์ ์ง์ ๊ฐ์ ๊ฐ์ง๋ค.
- ์ฐธ์กฐํ์ ๋ณ์๋ ํ ์์ญ์ด๋ ๋ฉ์๋ ์์ญ์ ๊ฐ์ฒด ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
์๋ฅผ๋ค์ด Person p = new Person(); ์ ๊ฐ์ด ํด๋์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ, new ์ ์ํด ์์ฑ๋ ํด๋์ค๋ Heap Area ์ ์ ์ฅ๋๊ณ , Stack Area ์๋ ์์ฑ๋ ํด๋์ค์ ์ฐธ์กฐ์ธ p ๋ง ์ ์ฅ๋๋ค.

์คํ ์์ญ์ ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํ๋ฉฐ, ์ค๋ ๋๊ฐ ์์๋ ๋ ํ ๋น๋๋ค.
ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ ๋ ๋ ์คํ ์ฌ์ด์ฆ๊ฐ ๊ณ ์ ๋์ด ์์ด, ๋ฐํ์ ์์ ์คํ ์ฌ์ด์ฆ๋ฅผ ๋ฐ๊ฟ ์๋ ์๋ค.
๋ง์ผ ๊ณ ์ ๋ ํฌ๊ธฐ์ JVM ์คํ์์ ํ๋ก๊ทธ๋จ ์คํ ์ค ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ์ง ์๋ค๋ฉด StackOverFlowError๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ฐ๋ ๋๋ฅผ ์ข ๋ฃํ๋ฉด ๋ฐํ์ ์คํ๋ ์ฌ๋ผ์ง๋ค.

์ฌ๊ธฐ๊น์ง ๋ฐฐ์ด ๋ฉ์๋ ์์ญ, ํ ์์ญ, ์ค๋ ๋ ์์ญ์ ํ ๊ทธ๋ฆผ์ผ๋ก ํ์ํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์์ด ๊ทธ๋ ค์ง๊ฒ ๋๋ค.

PC ๋ ์ง์คํฐ (Program Counter Register)
PC ๋ ์ง์คํฐ๋ ์ฐ๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ฉฐ, ํ์ฌ ์ํ์ค์ธ JVM ๋ช ๋ น์ด ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ด๋ค.
JVM ๋ช ๋ น์ ์ฃผ์๋ ์ฐ๋ ๋๊ฐ ์ด๋ค ๋ถ๋ถ์ ๋ฌด์จ ๋ช ๋ น์ผ๋ก ์คํํด์ผํ ์ง์ ๋ํ ๊ธฐ๋ก์ ๊ฐ์ง๊ณ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ์ CPU์์ ๋ช ๋ น์ด(Instruction)์ ์ํํ๋ ๊ณผ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ด๋ CPU๋ ์ฐ์ฐ์ ์ํํ๋ ๋์ ํ์ํ ์ ๋ณด๋ฅผ ๋ ์ง์คํฐ๋ผ๊ณ ํ๋ CPU ๋ด์ ๊ธฐ์ต์ฅ์น๋ฅผ ์ด์ฉํ๊ฒ ๋๋ค.
์๋ฅผ๋ค์ด, A์ B๋ผ๋ ๋ฐ์ดํฐ์ ํผ์ฐ์ฐ ๊ฐ์ธ Operand๊ฐ ์๊ณ ์ด๋ฅผ ๋ํ๋ผ๋ ์ฐ์ฐ Instruction์ด ์๋ค๊ณ ํ์.
A์ B, ๊ทธ๋ฆฌ๊ณ ๋ํ๋ผ๋ ์ฐ์ฐ์ด ์์ฐจ์ ์ผ๋ก ์งํ์ด ๋๊ฒ ๋๋๋ฐ, ์ด๋ A๋ฅผ ๋ฐ๊ณ B๋ฅผ ๋ฐ๋ ๋์ ์ด ๊ฐ์ CPU๊ฐ ์ด๋๊ฐ์ ๊ธฐ์ตํด ๋์ด์ผ ํ ํ์๊ฐ ์๊ธด๋ค.
์ด ๊ณต๊ฐ์ด ๋ฐ๋ก CPU ๋ด์ ๊ธฐ์ต์ฅ์น Register์ด๋ค.

ํ์ง๋ง ์๋ฐ์ PC Register๋ ์์ cpu Register์ ๋ค๋ฅด๋ค.
์๋ฐ๋ OS๋ CPU์ ์ ์ฅ์์๋ ํ๋์ ํ๋ก์ธ์ค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋จธ์ (JVM)์ ๋ฆฌ์์ค๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
๊ทธ๋์ ์๋ฐ๋ CPU์ ์ง์ ์ฐ์ฐ์ ์ํํ๋๋ก ํ๋ ๊ฒ์ด ์๋, ํ์ฌ ์์ ํ๋ ๋ด์ฉ์ CPU์๊ฒ ์ฐ์ฐ์ผ๋ก ์ ๊ณตํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ํ ๋ฒํผ ๊ณต๊ฐ์ผ๋ก PC Register๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ง๋ค๊ฒ ๋ ๊ฒ์ด๋ค
๋ฐ๋ผ์ JVM์ ์คํ์์ ๋น์ฐ์ฐ๊ฐ Operand๋ฅผ ๋ฝ์ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ธ PC Register์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ทจํ๋ค.

๋ง์ฝ์ ์ค๋ ๋๊ฐ ์๋ฐ ๋ฉ์๋๋ฅผ ์ํํ๊ณ ์์ผ๋ฉด JVM ๋ช ๋ น(Instruction)์ ์ฃผ์๋ฅผ PC Register์ ์ ์ฅํ๋ค.
๊ทธ๋ฌ๋ค ๋ง์ฝ ์๋ฐ๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด(C์ธ์ด, ์ด์ ๋ธ๋ฆฌ)์ ๋ฉ์๋๋ฅผ ์ํํ๊ณ ์๋ค๋ฉด, undefined ์ํ๊ฐ ๋๋ค.
์๋ํ๋ฉด ์๋ฐ์์๋ ์ด ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ถ๋ถ์ด ๋ฐ๋ก ๋ค์ ์ธ๊ธํ๊ฒ ๋ Native Method Stack ๊ณต๊ฐ์ด๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ (Native Method Stack)
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ๋ ์๋ฐ ์ฝ๋๊ฐ ์ปดํ์ผ๋์ด ์์ฑ๋๋ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋ ์ค์ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ด๋ค.
๋ํ ์๋ฐ ์ด์ธ์ ์ธ์ด(C, C++, ์ด์ ๋ธ๋ฆฌ ๋ฑ)๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ๊ณต๊ฐ์ด๊ธฐ๋ ํ๋ค.
์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก๋ ์ผ๋ฐ์ ์ธ C ์คํ์ ์ฌ์ฉํ๋ค.
์์์ ๋ฐฐ์ด JIT ์ปดํ์ผ๋ฌ์ ์ํด ๋ณํ๋ Native Code ์ญ์ ์ฌ๊ธฐ์์ ์คํ์ด ๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค. (์์ง ์ดํด๊ฐ ์๋๋ฉด ์คํ ์์ง ์น์ ๋ถ๋ถ์ ๋ค์ ๋ณต์ตํ๊ณ ์ค์)

์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ JVM ์คํ์ ์์ด๋ค๊ฐ ํด๋น ๋ฉ์๋ ๋ด๋ถ์ ๋ค์ดํฐ๋ธ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ํด๋น ๋ฉ์๋๋ ๋ค์ดํฐ๋ธ ์คํ์ ์์ธ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ดํฐ๋ธ ๋ฉ์๋๊ฐ ์ํ์ด ๋๋๋ฉด ๋ค์ ์๋ฐ ์คํ์ผ๋ก ๋์์ ๋ค์ ์์ ์ ์ํํ๋ค.
๊ทธ๋์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋์ด ์๋ ํจ์์ ํธ์ถ์ ์๋ฐ ํ๋ก๊ทธ๋จ ๋ด์์๋ ์ง์ ์ํํ ์ ์๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ฌ ์๋ ์๋ ๊ฒ์ด๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ ๋ฐ๋ก ๋ค์์ ๋ฐฐ์ธ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์ธํฐํ์ด์ค(JNI)์ ์ฐ๊ฒฐ๋์ด ์๋๋ฐ, JNI๊ฐ ์ฌ์ฉ๋๋ฉด ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ ๋ฐ์ดํธ ์ฝ๋๋ก ์ ํ๋์ด ์ ์ฅ๋๊ฒ ๋๋ค.
JNI (Java Native Interface)
JNI๋ ์๋ฐ๊ฐ ๋ค๋ฅธ ์ธ์ด๋ก ๋ง๋ค์ด์ง ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ ์ ์๋ ์ธํฐํ์ด์ค ์ ๊ณตํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
์์์ ๋ค๋ค๋ดค๋ฏ์ด, JNI๋ JVM์ด Native Method๋ฅผ ์ ์ฌํ๊ณ ์ํํ ์ ์๋๋ก ํ๋ค.
ํ์ง๋ง ์ค์ง์ ์ผ๋ก ์ ๋๋ก ๋์ํ๋ ์ธ์ด๋ C / C++ ์ ๋ ๋ฐ์ ์๋ค๊ณ ํ๋ค.

Native Method Library
C, C++๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์นญํ๋ค.
๋ง์ผ ํค๋๊ฐ ํ์ํ๋ฉด JNI๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ฉํด ์คํํ๋ค.

# ์ฐธ๊ณ ๋ฌธํ
https://steady-snail.tistory.com/67
https://performeister.tistory.com/m/41
https://jiwonxdoori.tistory.com/33
https://gyoogle.dev/blog/computer-language/Java/Java%20Virtual%20Machine.html
https://www.youtube.com/watch?v=AWXPnMDZ9I0
https://steady-coding.tistory.com/305
https://riptutorial.com/java/example/18231/overview
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.