JVM
Java Virtual Machine, JVM ์ด๋ Java ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒฝ์ ์ ๊ณตํด์ฃผ๋ ์ํํธ์จ์ด๋ค.
Java ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ชจ๋ ์ด์์ฒด์ ์์ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด๋ JVM ์ Java ์ ์ด์์ฒด์ ์ฌ์ด์ ์ค๊ฐ์ ์ญํ ์ ์ํํ์ฌ Java ๊ฐ ์ด์์ฒด์ ์ ์ข ์์ ์ด์ง ์๋๋ก ๋์์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ, GC ๋ฅผ ํตํด ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํํ๋ฉฐ ๋ค๋ฅธ ํ๋์จ์ด์ ๋ค๋ฅด๊ฒ ๋ ์ง์คํฐ ๊ธฐ๋ฐ์ด ์๋ ์คํ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
JVM ์ ๊ตฌ์กฐ
JVM ์ ClassLoader
ExecutionEngine
RuntimeDataArea
JNI
NativeMethodLibrary
๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
1. Class Loader
- ํด๋์ค ํ์ผ๋ค์ ์ฎ์ด์ JVM์ด OS๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ญ(Runtime Data Area)์ ์ ์ฌ
2. Execution Engine
- Class Loader ์ ์ํด ์ ์ฌ๋ ํด๋์ค(๋ฐ์ดํธ ์ฝ๋)๋ค์ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํด ๋ช
๋ น์ด ๋จ์๋ก ์คํ
- Interpreter ๋ฐฉ์
- ๋ช ๋ น์ด ํ๋ ํ๋ ์คํํ๋ ๋ฐฉ์
- JIT(Just-In-TIme) Compiler ๋ฐฉ์
- ์ ์ ํ ์๊ฐ์ ์ ์ฒด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํด ์คํํ์ฌ ์ฑ๋ฅ์ ๋์ด๋ ๋ฐฉ์
- Interpreter ๋ฐฉ์
3. Garbage Collector
- GC๋ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด๋ค ์ค ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ํ์ ํ ์ ๊ฑฐ
4. Runtime Data Area
- JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ์๋ฐ ํ์ผ์ด ์คํ๋ ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๋ ์์ญ
- ๋ฉ์๋, ํ, ์คํ ๋ชจ๋ GC ์ ๋์
- ๋ฉ์๋, ํ ์์ญ์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์
- ์คํ, PC ๋ ์ง์คํฐ, Native ๋ฉ์๋ ์คํ์ ๊ฐ ์ค๋ ๋๋ง๋ค ์์ฑ ๊ณต์ X
Class Loader
ClassLoader
๋ ๋ฐํ์ ์์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ๋ค. Java ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ ๋ฐ์ดํธ ์ฝ๋๋ฅผ JVM ์ด ์ด์์ฒด์ ๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ธ RuntimeDataArea
๋ก ์ ์ฌํ๋ ์ญํ ์ ์ํํ๋ค.
Execution Engine
ExecutionEngine
์ ClassLoader
์ ์ํด RuntimeDataArea
์ Method Area ์ ์ ์ฌ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํ์ฌ ๋ช
๋ น์ด ๋จ์๋ก ์คํํ๋ ์ญํ ์ ์ํํ๋ค.
Interpreter
๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ์ค๋ง๋ค ์ปดํ์ผํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณํํ๋ ์์ ์ ์ํํ๋ค. ์ค๋ณต๋๋ ๋ฐ์ดํธ ์ฝ๋์ ๋ํด์๋ ๋งค๋ฒ ์ปดํ์ผํ๋ ๋นํจ์จ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ JIT Compiler ๋ฅผ ์ฌ์ฉํ๋ค.
JIT Compiler
Interpreter ์ ํจ์จ์ ๋์ด๊ธฐ ์ํ Compiler ๋ก Interpreter ๊ฐ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด JIT Complier ๊ฐ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํ ๋ค ํด๋น ์ฝ๋๋ฅผ ์บ์ฑํ๋ค. ์ดํ Interpreter ๊ฐ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ๋ ๋ฐ๊ฒฌํ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ค.
Garbage Collector
RuntimeDataArea
์ Heap Area ์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ค์ ์ ๊ฑฐํ๋ ์์
์ ์ํํ๋ค. GC ๊ฐ ์ํ๋๋ ๋์ GC ๋ฅผ ์ํํ๋ ์ค๋ ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ค๋ ๋๊ฐ ์ ์ง๋๋ค.
Runtime Data Area
Method Area
ํด๋์ค ์ ๋ณด, ๋ณ์ ์ ๋ณด, ๋ฉ์๋ ์ ๋ณด, static
๋ณ์ Constant Pool ๋ฑ์ด ์์ฑ๋๋ ์์ญ์ด๋ค.
- JVM ์ด ์์๋ ๋ ์์ฑ๋๋ ์์ญ
- ๋ฐ์ดํธ ์ฝ๋๊ฐ ์ ์ฅ๋จ
- ํด๋์ค ์ ๋ณด, ๋ณ์ ์ ๋ณด, static ๋ณ์
Heap Area
new
์ฐ์ฐ์ผ๋ก ๋์ ์ผ๋ก ์์ฑ๋ ์ธ์คํด์ค์ ๋ฐฐ์ด์ด ์์ฑ๋๋ ์์ญ์ด๋ค. Method Area ์ ๋ก๋๋ ํด๋์ค๋ง ์์ฑ ๊ฐ๋ฅํ๋ฉฐ Garbage Collector ๊ฐ ์ฐธ์กฐ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ธํ๊ณ ์ ๊ฑฐํ๋ ์์ญ์ด๋ค.
- new ์ฐ์ฐ์ผ๋ก ๋์ ์ผ๋ก ์์ฑ๋ instance ๋ณ์(๊ฐ์ฒด)๊ฐ ์ ์ฅ๋จ
- e.g. ํด๋์ค์ ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ
- ํจ์จ์ ์ธ GC ๋ฅผ ์ํด 5๊ฐ์ง ์์ญ์ผ๋ก ๋๋จ
- GC์ ํ๋ก์ธ์ค
- Minor GC: new ์์ญ
- Eden ์์ญ์ ์ต์ด์ ๊ฐ์ฒด ์์ฑ
- Eden ์์ญ์ด ๊ฐ๋ ์ฐจ๋ฉด ์ฒซ ๋ฒ์งธ GC ๋ฐ์
- Survivor1 ์ Eden์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณต์ฌ ํ Survivor1 ์ ์ ์ธํ ๋ค๋ฅธ ์์ญ์ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์ ๊ฑฐ
- Eden ๊ณผ Survivor1 ๋ชจ๋ ๊ฐ๋ ์ฐผ๋ค๋ฉด ๋ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด ์ค์ ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๊ฐ ์๋์ง ๊ฒ์ฌ
- ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๋ฅผ Survivor2 ์ ๋ณต์ฌ ํ Survivor2 ๋ฅผ ์ ์ธํ ๋ค๋ฅธ ์์ญ์ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์ ๊ฑฐ
- ์ ๊ณผ์ ์ค ์ผ์ ํ์ ์ด์ ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๋ค์ Survivor2 ์์ Old ์์ญ์ผ๋ก ์ด๋
- ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ Survivor2 ๊ฐ ๊ฐ๋ ์ฐจ๊ธฐ ์ ์ ๊ณ์ํด์ Old ๋ก ๋น์
- Major GC (Full GC): old ์์ญ
- Old ์์ญ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ฌํ๋ฉฐ ์ฐธ์กฐ๋๊ณ ์๋์ง ํ์ธ
- ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ๋ชจ์ ํ ๋ฒ์ ์ ๊ฑฐ
- Minor GC ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๊ณ ์คํ ์ค GC๋ฅผ ์ ์ธํ ๋ชจ๋ ์ค๋ ๋๊ฐ ์ค์ง๋จ
- Full GC ๊ฐ ์ผ์ด๋๋ฉด, Old ์์ญ์ ์๋ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์ ๊ฑฐ
- Heap ์์ญ์ ๋น ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ๊ตฌ์ฑํจ
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ ๋์ค ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ค๋ ๋ ์ ์ง
- Minor GC: new ์์ญ
// ํ์ Person("ํ๊ธธ๋", 20) ์ด ์ ์ฅ๋จ
// ์ฆ, ์ธ์คํด์ค๊ฐ ์ ์ฅ๋จ
Person p = new Person("ํ๊ธธ๋", 20);
Stack Area
๋ฉ์๋ ํธ์ถ ์ ๋ง๋ค ๊ฐ๊ฐ์ ๋ฉ์๋๋ง์ ์ํ ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์ ๋ฑ์ด ์์ฑ๋๋ ์์ญ์ด๋ค. ์ค์ ์ธ์คํด์ค๋ Heap Area ์ ํ ๋น๋๊ณ ์ฐธ์กฐ๋ง Stack ์ ์ ์ฅ๋๋ค.
- ์ง์ญ๋ณ์, ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์์์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ณ์, ๋ฉ์๋์ ์ ๋ณด ๋ฑ์ด ์ ์ฅ๋๋ ์์ญ
// ์คํ์ p ๊ฐ ์ ์ฅ๋จ
// ์ฆ, ํ์ ์ ์ฅ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ณ์๊ฐ ์ ์ฅ๋จ
Person p = new Person("ํ๊ธธ๋", 20);
Program Counter Register
์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ฉฐ ํ์ฌ ์ํ์ค์ธ ๋ถ๋ถ์ ์ฃผ์์ ๋ช ๋ น์ ์ ์ฅํ๋ ์์ญ์ด๋ค.
- ์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ
- ํ์ฌ ์ค๋ ๋๊ฐ ์คํ๋๋ ๋ถ๋ถ์ ์ฃผ์์ ๋ช ๋ น์ ์ ์ฅํ๋ ์์ญ
- ์ค๋ ๋๋ฅผ ๋์๊ฐ๋ฉด์ ์ํํ ์ ์์
Native Method Stack
Java ๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ ๋ ์ฌ์ฉ๋๋ ์์ญ์ด๋ค. ์ฆ, JNI(Java Native Interface) ๋ฅผ ํตํด ํธ์ถํ C/C++ ๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ์คํ์ ์๋ฏธํ๋ค.
- ์๋ฐ๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ํ ๊ณต๊ฐ
- ์ฆ, JNI(Java Native Interface)๋ฅผ ํตํด ํธ์ถํ C/C++๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ๊ณต๊ฐ
JNI
Java ์ ํ๋ฆฌ์ผ์ด์
์์ C/C++ ๋ฑ์ผ๋ก ์์ฑ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ค๋ค. native
ํค์๋๋ฅผ ํตํด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ๋ํ์ ์ผ๋ก Thread
์ currentThread()
๋ฉ์๋๊ฐ ์๋ค.
Native Method Library
C/C++ ๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด JNI ๊ฐ ํ์ํ๋ค.