์๋ฐ๋ฅผ ๊ณต๋ถํด๋ณด์๋ค๋ฉด ์ตํ ๋ค์์ JVM, Java Virtual Machine ์ ๋ํด์ ์ด์ผ๊ธฐํด๋ณด๋ ค ํ๋ค.
๋ง์ฐํ๊ฒ JVM ์ด ๋์ํ๊ณ JVM์ด ์๊ธฐ ๋๋ฌธ์ ํ๋ซํผ์ ๋ ๋ฆฝ์ ์ด๋ฉฐ Garbage Collection ์ผ๋ก ์ฅ์ ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํ๋ ์ฌ๋๋ค์ด ๋ง์ ๊ฒ์ด๋ค.
์ค๋์ JRE์ ๊ตฌ์ฑ์์์ธ JVM์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๊ณ Garbage Collection ์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋์ง ์์๋ณผ ๊ฒ์ด๋ค.
JVM ์ด๋?
์ง๋ 2๋ฒ์ ์๊ฐ์ ๊ฑฐ์ณ ์ฐ๋ฆฌ๋ Java Bytecode์ Java ClassLoader ์ ๋ํด์ ์์๋ณด์๋ค.
์ง๋ ์๊ฐ์๋ ์ด๋ป๊ฒ ์๋ฐ ํ์ผ์ด ์ปดํ์ผ๋์ด ํด๋์ค ํ์ผ๋ก ๋ณํ์ด ๋๊ณ , ์ด๋ป๊ฒ ํด๋์ค๋ก๋์ ์ํด์ ๋์ ์ ์ฌ๋๋ฉฐ verification ์ ์ํํ๋์ง ์์๋ณด์๋ค.
์ค๋์ ๊ทธ ์ดํ์ ์ผ์ด๋ ํด๋์ค๋ก๋์ ์ํด์ ๋ก๋๋ ๋ฐ์ดํธ์ฝ๋๊ฐ Runtime Data Areas ์ ๋ก๋๋๊ณ Execution Engine ์ด ๋ก๋๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ ๋ถ๋ถ์ ๋ํด์ ์์๋ณด๋ ค ํ๊ณ ์ด๊ฒ์ด ๋ฐ๋ก JVM์ด ํ๋ ์ผ์ด๋ค.
JVM์ Java Virtual Machine ์ผ๋ก Host Machine ๋ด์์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์๊ฐ๋ Machine ์ด๊ธฐ ๋๋ฌธ์ ์ตํ ๋ค์์ ์๋ฐ์ ์ด์์ฑ์ด๋ผ๋ ํน์ง์ด ๋์ค๊ฒ ๋๋ค.
JVM์ ํฌ๊ฒ 2๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
- Stack Based Machine
- Register Based Machine
1. Stack Based Machine
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ JVM์ด ๋ชจ๋ ์คํ ๊ธฐ๋ฐ ๋จธ์ ์ด๋ค.
์คํ ๊ธฐ๋ฐ ๋จธ์ ์ target hardware ์ ๋ํ ์ข ์์ด ์ ๊ธฐ ๋๋ฌธ์ ์ด์์ฑ์ด ๋ฐ์ด๋์ผํ๋ VM์์ ์์ฃผ ์ฌ์ฉ๋๋ค.
ํ์ง๋ง Stack ์ ํน์ฑ์ ๋ฐ๋ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋จ์ ๋ง์ ์ ์ฐ์ฐ์๋ 4๋จ๊ณ ๋ช ๋ น์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
POP 10
POP 20
ADD 10, 20 RESULT
PUSH RESULT
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ Stack Based JVM์์๋ Oracle์ Hotspot JVM๊ณผ Eclipse์ OpenJ9 ๊ฐ ์กด์ฌํ๋ค.
Oracle์ Hotspot JDK ๋ CPU ํจ์จ์ด ์ข๋ค๋ ํน์ฑ์ด ์๊ณ OpenJDK์ OpenJ9 ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ์ข๋ค๋ ํน์ฑ์ด ์๋๋ฐ, ์ด ๋ JDK์ ๋น๊ต๋ ์๋์์ ์ฐธ๊ณ ํ ์ ์๋ค.
2. Register Based Machine
ํน์ํ ๊ฒฝ์ฐ์ ๋ชฉ์ ์๋ง ์ฌ์ฉ๋๋ JVM ์ธ๋ฐ, ์๋๋ก์ด๋์ Dalvik JVM์ด ๊ทธ๋ ๋ค๊ณ ํ๋ค.
Dalvik JVM์ ์ผ๋ฐ JVM์ ๋ช ์ธ๋ฅผ ๋ฐ๋ฅด์ง ์๋ ๋์ ํจ์จ๊ณผ ์ฑ๋ฅ์ด ์ฐ์ํ๋ค.
- 30% fewer instruction
- 35% fewer code units
- 35% more bytes in instruction stream
์ด๋ผ๋ ์ฅ์ ๊ณผ ํน์ง์ด ์กด์ฌํ์ง๋ง ํ๋์จ์ด (์๋๋ก์ด๋)์ ์ข ์์ ์ด๋ผ๋ ํน์ฑ์ผ๋ก ์ธํด์ ์ด์์ฑ์ด ๋ฐ์ด๋จ์ ํฌ๊ธฐํ case ๋ผ๊ณ ํ ์ ์๋ค.
JVM ์ ๊ตฌ์ฑ์์
JVM ์์๋ ํฌ๊ฒ 3๊ฐ์ง์ ๊ตฌ์ฑ ์์๊ฐ ์กด์ฌํ๋ค.
- Runtime Data Areas
- Execution Engine
- Garbage Collection
ํ๋ ํ๋ ๊ฐ๊ฐ ์์๋ณด์
1. Runtime Data Areas
์๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ Runtime Area ๋ ํด๋์ค๋ก๋๊ฐ Bytecode ๋ฅผ ๋ก๋ํ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค.
์ด๋ OS๋ก๋ถํฐ ํ ๋น๋ฐ๋ ์ค์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ฑํ ๋ชจ๋ ์ฝ๋์ ๋์์ ์ด ๋ฉ๋ชจ๋ฆฌ ์์์ ๋์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
Runtime Data Area ๋ Thread๋ก ๊ตฌ๋ถํ ์ ์๋๋ฐ, Thread๊ฐ ๋ค๋ฅธ Thread ์ ๊ณต์ ํ๋ ์ฌ๋ถ์ ๊ณต์ ํ์ง ๋ชปํ๋ ์ฌ๋ถ์ ๋ฐ๋ผ์ ๋๋ ์ ์๋ค.
Thread ๋ณ๋ก ์์ฑ๋๋ ์์ญ : PC Register
, JVM Stack
, Native Method Stack
- PC Register
- Program Count Register ๋ ํ์ฌ ์ํ ์ค์ธ JVM Instruction ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
- Register Based ์ธ CPU ๋ด์ PC์๋ ๋ค๋ฅด๊ฒ Stack-Based ๋ก ๋์ํ๋ค.
- JVM Stack
- Thread ์ Method ๊ฐ ํธ์ถ๋ ๋์ ์ํ ์ ๋ณด์ ๊ฐ์ StackFrame ์ ์ ๋ณด, ๋ฉ์๋ ํธ์ถ ์ฃผ์, ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์์ ๊ฐ์ ์ํ ์ ๋ณด๋ฅผ ๋ํ๋ธ๋ค.
Exception.printStackTrace()
์ ๋์ค๋ ์ ๋ณด๊ฐ ๋ฐ๋ก JVM ์คํ์ ์ ๋ณด์ด๋ค.
- Native Method Stack
- Java ์ธ์ ์ธ์ด๋ก ์์ฑ๋ Native Code ๋ฅผ ์ํ ๋ณ๋์ Stack์ด๋ค.
- JNI ๋ฅผ ํตํด์ ํธ์ถ๋๋ C๋ C++์ ์ฝ๋์ ๋ง๊ฒ ์คํ์ด ์์ฑ๋๋ค.
๋ชจ๋ Thread ๊ฐ ๊ณต์ ํ๋ ์์ญ : Heap
, Method Area
, Runtime Constant Pool
- Heap
- ์ผ๋ฐ์ ์ธ Heap Memory ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ์ธ์คํด์ค๋ ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ์ ๋์ ์ผ๋ก ์ ์ฅํ๋ ๊ณต๊ฐ์ผ๋ก ์ด๊ณณ์ด ๋ฐ๋ก Garbage Collection์ ๋์์ด ๋๋ ๊ณต๊ฐ์ด๋ค.
- JVM ์ฑ๋ฅ ์ด์์์ ๊ฐ์ฅ ๋ง์ด ์ธ๊ธ๋๋ ๊ณต๊ฐ์ด๊ธฐ๋ ํ๋ค.
- Method Area
- ClassLoader ๊ฐ ์ ์ฌํ ํด๋์ค์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
- ๋ ผ๋ฆฌ์ ์ผ๋ก Heap ์ ํฌํจ๋๋๋ฐ PermGen ์ด๋ผ๋ ์์ญ์ด๋ค
- Java 8 ์ดํ๋ถํฐ Metaspace OS๊ฐ ๊ด๋ฆฌํ๋ ๊ณต๊ฐ์ผ๋ก ์ฎ๊ฒจ์ง๊ฒ ๋๋ค.
- ์ด๋ ์ถํ์ ๊ธฐํ๊ฐ ๋๋ค๋ฉด ๋ฐ๋ก ํฌ์คํ ์ ํ๋๋ก ํ๊ฒ ๋ค.
- Runtime Constant Pool
- Method Area ๋ด๋ถ์ ์ํ ์์ญ์ผ๋ก ๋ชจ๋ Constant ๋ ํผ๋ฐ์ค๋ฅผ ์ ์ฅํ๋ค.
- ์ด์ธ์๋ Class Variable, Field Information, Type Information ๋ฑ์ด Method Area ์ ํฌํจ๋์ด ์๋ค.
2. Execution Engine
์คํ ์์ง, Execution Engine ์ Runtime Data Area ์ ์ ํ ๋น๋ Bytecode ๋ฅผ ์คํ์ํค๋ ์ผ์ ์ํํ๋ค.
CPU๋ Java Bytecode ๋ฅผ ๋ฐ๋ก ์คํ์ํฌ ์ ์๋ค.
๊ทธ๋์ Bytecode๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๊ณผ์ ์ด ๊ผญ ํ์ํ๋ฐ, ์ด ๊ณผ์ ์ผ๋ก ์ธํด์ Java๊ฐ C๋ C++์ ๋นํด ๋๋ฆฌ๋ค๊ณ ํ๋ค.
Bytecode๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ๊ณ ๋ฒ์ญํ๋ ๋ฐฉ์์ ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋๊ฒ ๋๋ค.
- Interpreter ๋ฐฉ์
- JIT(Just In Time) ์ปดํ์ผ ํน์ ๋์ ๋ฒ์ญ ๋ฐฉ์
Interpreter ๋ฐฉ์์ ๊ฐ OS ํ๋ซํผ์ ๋ง๋ ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํ(๋ฒ์ญ)ํ๋๋ฐ, ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ๋ผ์ธ์ฉ ์ฝ๊ณ ์คํ(๋ฒ์ญ)์ ํ๊ฒ ๋๋ค.
ํ์ง๋ง ํ ๋ผ์ธ์ฉ ์ฝ๋ Interpreting ๋ฐฉ์์ ์๋ issue ๊ฐ ๋๋ฐ๋๋ค.
์ด ๋ ์์ฃผ ์คํ๋๋ ๋ฐ์ดํธ ์ฝ๋ ์์ญ์ ๊ธฐ๊ณ์ด๋ก ํต์ผ๋ก ์ปดํ์ผํ๋ ๊ฒ์ด ๋ฐ๋ก JIT ์ปดํ์ผ๋ฌ์ด๋ค.
JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ ์ฝ๋์์ญ์ ๊ธฐ์ตํ๋ค ํ ๋ฒ์ ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ์กฐ๊ธ ๋นจ๋ผ์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
์๋์ ์ฝ๋๋ Junhyunny ๋์ ๋ธ๋ก๊ทธ ์์ JIT๋ฅผ ํ ์คํธํ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.
public class JitCompilerTest {
public static void main(String[] args) {
int a = 0;
for (int index = 0; index < 500; index++) {
long startTime = System.nanoTime();
for (int subIndex = 0; subIndex < 1000; subIndex++) {
a++;
}
System.out.println("loop count: " + index + ", execution time: " + (System.nanoTime() - startTime));
}
}
}
์ด ๊ฒฐ๊ณผ๋ ์๊ฐ์ด ์ง๋ ์๋ก ์คํ๋๋ ์๋๊ฐ ๋นจ๋ผ์ง๋๋ฐ, ์ด๋ JIT ์ปดํ์ผ๋ฌ๊ฐ ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
loop count: 0, execution time: 8300
loop count: 1, execution time: 9000
loop count: 2, execution time: 8300
...
loop count: 51, execution time: 8100
loop count: 52, execution time: 890200
loop count: 53, execution time: 8500
...
loop count: 109, execution time: 231500
loop count: 110, execution time: 7700
loop count: 112, execution time: 1600
...
loop count: 335, execution time: 36000
loop count: 336, execution time: 3000
loop count: 337, execution time: 0
...
JIT ์ปดํ์ผ๋ฌ๋ ์์ ๋ด์ฉ์ผ๋ก ์ ์ ์์ง๋ง ๊ฐ์ ์ฝ๋๋ฅผ ๋งค๋ฒ ํด์ํ์ง ์๊ณ ์บ์ฑ์ ํ์ฌ ์ฌํธ์ถ์ด ์ผ์ด๋๋ฉด ์บ์ฑ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.
3. Garbage Collector
Garbage Collector์ JVM์ ์ฑ๋ฅ๊ณผ ๊ฐ์ฅ ์ฐ๊ด์ด ์๋ Runtime Data Areas ์ Heap ์์ญ์ ๋์ ํ ๋น ๋ฐ์ดํฐ๋ค์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
๊ด๋ฆฌ๋ผ๋ฉด ๋น์ฐํ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์์ ์ผ๋ก ๊ด์ฐฐํ๊ณ ์ฐพ์์ ์ ๊ฑฐ๋ผ๋ ์๋ฏธ๊ฐ ํฌํจ๋์ด ์๋ค.
Java ์์๋ c๋ c++๊ณผ ๋ค๋ฅด๊ฒ malloc
๊ณผ free
์ ๊ฐ์ด ๊ฐ๋ฐ์๊ฐ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ๊ณผ์ ์ด ์๋ ์ด์ ๋ ์ ์๋ค์ถ์ด ๋ฐ๋ก GC๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
GC๋ Weak Generational Hypothesis ๋ผ๋ ์ฝํ ์ธ๋ ๊ฐ์ค์ ๊ธฐ๋ฐํ๋ค๊ณ ํ๋ค.
์ฝํ ์ธ๋ ๊ฐ์ค์์๋ 2๊ฐ์ง Generation์ด ์กด์ฌํ๋ค.
- Young Generation
- ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์๊ฐ ์ด๊ณณ์ผ๋ก ์ด๋ํ๋ค.
- ๋ง์ฝ Young Generation ์ด ๊ฐ๋ ์ฐจ๋ฉด Minor Collection ์ด ๋ฐ์ํ๋ค
- Minor GC๊ฐ ๋ฐ์ํ๋ฉด ์ดํ์๋ ๊ฐ์ฒด๋ค๋ง ํ์ธํ๊ณ ๋๋จธ์ง๋ฅผ ๋ฒ๋ฆฐ๋ค.
- ์ด์๋จ์ ๊ฐ์ฒด์ค ๋ ์ค๋ ์ธ ๊ฒ ๊ฐ์ ๊ฐ์ฒด๋ฅผ Tenured Generation ์ผ๋ก ์ด๋์ํจ๋ค.
- Tenured Generation
- Young Generation ์์ ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์์นํ๊ฒ ๋๋ค.
- ์ญ์ Tenured Generation ๊ฐ ๊ฐ๋์ฐจ๋ฉด Major Collection์ด ๋ฐ์ํ๋ค.
์์ ๋ ์์ญ์ ๋ํด์ Minor GC์ Major GC๊ฐ ๋์ํ ๋ ๋ค์์ 2๊ฐ์ง ๊ณตํต์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๊ฒ ๋๋ค.
- Stop The World
- Mark And Sweep
1. Stop The World
Stop The World ๋ GC๋ฅผ ์คํํ๊ธฐ ์ํด์ ์์ฃผ ์ ๊น JVM์ด Application ์ ์คํ์ ๋ฉ์ถ๋ค.
์ด ๋ GC๊ฐ ๋์ํ๋ Thread ๋ฅผ ์ ์ธํ ๋๋จธ์ง Thread ์ ์์ ์ด ์ค๋จ๋๊ณ Collecting ๊ณผ์ ์ ๊ฑฐ์น ํ์ ๋ค์ Thread ๊ฐ ์คํ์ด ๋๋ค.
GC๊ฐ ๋ฉ์ถ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ฐ๋ฆฌ์ ๋์๋ Latency ๊ฐ ๋ฐ์ํ๊ฒ ๋๊ณ GC ์ฑ๋ฅ ๊ฐ์ ์ด๋ผ๊ณ ํ๋ฉด Stop-The-World ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค.
2. Mark And Sweep
Stop The World ๋ฅผ ํตํด์ ๋ชจ๋ ์ค๋ ๋์ ์์ ์ ์ค๋จ์ํค๋ฉด, GC๋ ๋์ ๊ฐ์ฒด์ ๋ํ ํ์์ ์ํํ๋ค.
๊ฐ์ฒด๊ฐ ์ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋ ๊ณผ์ ์ Mark ๊ณผ์ ์ด๋ผ๊ณ ํ๋๋ฐ, Mark ๊ณผ์ ์ด ๋์ง ์์๋ค๋ ์๋ฆฌ๋ ๊ฐ์ฒด๊ฐ ์ ์ ํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ์ด์ผ๊ธฐ์ด๋ฏ๋ก ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ค.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ ๊ณผ์ ์ด ๋ฐ๋ก Sweep ์ด๋ผ๊ณ ํ๋ค.
- Garbage Collector
- JVM์ด ๋์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์์ ์ผ๋ก ์ฐพ์์ ์ ๊ฑฐํ๋ ์ญํ
- ์คํ ์์
- ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ํ์ ํ ์ญ์ -> ์ญ์ ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๋ฐํ -> ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฌ์ฉ
๋๊ธ