JVM(Java Virtual Machine)์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ๊ฐ์ ์ปดํจํฐ(์ถ์ํ๋ ๊ธฐ๊ณ)์ด๋ค.
์๋ฐ์๋ WORA
๋ผ๋ ์ค์ํ ํน์ง์ด ์กด์ฌํ๋ค.
์ด๋ "Write Once Run Anywhere"
์ ์ค๋ง๋ก, ํ ๋ฒ ์์ฑ๋ ์ฝ๋๋ ์ด๋์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค.
์ฆ, ํ ๋ฒ ์ปดํ์ผ์ ํด ๋๋ฉด ์ด๋ค OS ์์์๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ฉฐ, ์ด๋ฅผ OS ์ข
์์ ์ด์ง ์๋ค
๊ณ ๋ ๋ถ๋ฅผ ์ ์๋ค.
ํด๋น ํน์ง์ ๊ธฐ์กด์ ์ด์ ๋ธ๋ฆฌ์ด, C์ธ์ด์ ๋จ์ ์ ๋ณด์ํด์ฃผ์๊ณ , ์ด๋ก ์ธํด ๋ง์ ์ฌ๋๋ค์ด ์๋ฐ๋ฅผ ์ ์ฉํ๊ฒ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด ์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก
JVM
์ ์ญํ ์ด๋ค.
Java๋ *.java
, Python์ *.py
์ ๊ฐ์ ์์์ฝ๋๋ฅผ ๋ง๋ค๊ฒ ๋๋ค.
์ด๋ ์ธ๊ฐ์ด ์ฝ์ ์ ์๋ ๊ณ ์์ค ์ธ์ด๋ก, CPU๊ฐ ์ฝ๊ฒ ํ๊ธฐ ์ํด์๋ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผ
์ ํด ์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
์ฌ๊ธฐ์ ์๋ฐ๋ JVM์ ๊ฑฐ์ณ์ OS๋ก ๋๋ฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผ ํ๋ ๊ฒ์ด ์๋๋ผ, JVM์ด ์ธ์ํ ์ ์๋ Java Bytecode
๋ก ๋ณํ๋๋ค.
์๋ฐ ๋ฐ์ดํธ์ฝ๋๋, JVM์ ๋ช ๋ น์ด ์งํฉ์ด๋ค. ํด๋น ๋ฐ์ดํธ์ฝ๋์ JVM์ ๋์์ ์ผ๊ด๋๊ธฐ ๋๋ฌธ์, OS์ ๊ตฌ๋ถ ์์ด ์คํํ ์ ์๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ๋ฐ์ดํธ์ฝ๋๋ ๊ฐ ๋ช ๋ น์ด๊ฐ 1๋ฐ์ดํธ ๋จ์๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ด๋ฆ์ด ๋ถ์๋ค.
๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ์ญํ ์ ๋๊ฐ ํ ๊น?
์ด๋ Java Compiler
๊ฐ ๋งก์ผ๋ฉฐ, JDK๋ฅผ ์ค์นํ๋ฉด bin ๋ด์ ์กด์ฌํ๋ javac.exe
๋ฅผ ๋งํ๋ค.
test.java
๋ผ๋ ํ์ผ์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
์๋ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด, .java(์์ ์ฝ๋) -> .class(๋ฐ์ดํธ์ฝ๋)
๋ก ๋ณํํ ์ ์๋ค.
javac test.java
๊ทธ๋ผ ๋์ผํ ๋๋ ํ ๋ฆฌ ๋ด์ ๋ฐ์ดํธ์ฝ๋ .class
ํ์ผ์ด ์๊ธฐ๊ฒ ๋๋ค.
๋ฐ์ดํธ์ฝ๋๋ JVM์ด ์ฝ์ ์ ์๋ ๋ช
๋ น์ด์ด๋ค.
JVM์ ์ด๋ฅผ ์ฝ๊ณ ์ปดํจํฐ๊ฐ ์ธ์ํ ์ ์๋ ๋ฐ์ด๋๋ฆฌ ์ฝ๋
๋ก ๋ณํํ๊ฒ ๋๋ค.
๋ฐ์ด๋๋ฆฌ ์ฝ๋
์ด์ง ์ฝ๋๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, 0๊ณผ 1๋ก๋ง ๊ตฌ์ฑ๋์ด ์๋ค.
CPU๊ฐ ์ดํดํ๋ ๋ช ๋ น์ด ์งํฉ์ธ๊ธฐ๊ณ์ด
๋ ํด๋น ์ด์ง ์ฝ๋๋ก ์ด๋ฃจ์ด์ง๋ค.
์ฌ๊ธฐ์ ๋ฐ์ดํธ์ฝ๋ -> ๋ฐ์ด๋๋ฆฌ ์ฝ๋
๋ก ๋ณํํด ์ฃผ๋ ๊ฒ์ด JIT ์ปดํ์ผ๋ฌ
์ด๋ค.
JIT ์ปดํ์ผ๋ฌ๋ ๋์ ๋ฒ์ญ์ ํ๋ค๊ณ ๋ ๋งํ๋๋ฐ, ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉฐ ์ค์๊ฐ์ผ๋ก ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๊ธฐ์ Just-In-Time(JIT) ์ปดํ์ผ๋ฌ
์ธ ๊ฒ์ด๋ค.
JIT ์ปดํ์ผ๋ฌ๋ ์ฒ์๋ถํฐ ์๋ ์์๋ ์๋๋ค.
์๋ฐ๋ WORA๋ผ๋ ์ฅ์ ์ด ์กด์ฌํ์ง๋ง, ์ด๋ฅผ ์ํด์๋ ์๋์ ๊ณผ์ ์ด ํ์ํ๋ค.
- ์์์ฝ๋๋ฅผ ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผํ๋ค.
- ๋ฐ์ดํธ์ฝ๋๋ฅผ JVM์ด ํ ์ค์ฉ, ์ฆ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์ฝ์ด์ ์คํํ๋ค.
๊ทธ๋ ๊ธฐ์ ๋ค๋ฅธ ์ธ์ด์ ๋นํด์ ์ฑ๋ฅ์ด ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์กด์ฌํ๊ณ , ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์ ํ์ํ ๊ฒ์ด JIT ์ปดํ์ผ๋ฌ์ด๋ค.
์ด๋ฌํ ํน์ง ๋๋ฌธ์ ์๋ฐ๋ ์ปดํ์ผ ์ธ์ด๊ฐ ์๋ ํ์ด๋ธ๋ฆฌ๋ ์ธ์ด๋ผ ๋ถ๋ฅด๋ ๊ฒ์ด ๋ง์ผ๋ฉฐ, ์ด์ ๋ํด์๋ ๊ธ๋ก ์ ๋ฆฌํด๋์๋ค.
JVM์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๋ค.
- ํด๋์ค ๋ก๋(Class Loader)
- ์คํ ์์ง(Execution Engine)
2-1. ์ธํฐํ๋ฆฌํฐ(Interpreter)
2-2. JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler)
2-3. ๊ฐ๋น์ง ์ฝ๋ ํฐ(Garbage Collector)- ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area)
์ด๋ฏธ์ง ์ถ์ฒ ๋ฐ ์์ธํ ์ค๋ช ๊ธ
ํด๋์ค ๋ก๋
๋ ์ด๋ฆ ๊ทธ๋๋ก, JVM ๋ด์ .class
ํ์ผ์ ๋ก๋ํ๊ณ ๋งํฌ๋ฅผ ํตํด ๋ฐฐ์นํ๋ ์์
์ ์ํํ๋ ๋ชจ๋์ด๋ค.
์๋ฐ๋ ์ปดํ์ผ ํ์์ด ์๋, ๋ฐํ์ ์์ ์ ํด๋์ค ๋ก๋ฉ ๋ฐ ๋งํฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ๋์ ๋ก๋ฉ(Dynamic Loading) ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค.
์ฌ๊ธฐ์ JVM์ ๋ฉ์๋ ์์ญ์ ๋์ ์ผ๋ก ํด๋์ค ๋ก๋๋ฅผ ๋ด๋นํ๋ ๋ถ๋ถ์ด ํด๋์ค ๋ก๋์ด๋ค.
ํด๋์ค ๋ก๋๋ 3๋จ๊ณ๋ก ๋๋์ด์ ธ ์๋ค.
๋ก๋ฉ
- ๋ฐ์ดํธ์ฝ๋(.class)๋ฅผ ๋ฉ์๋ ์์ญ์ ์ ์ฅํ๋ค.
- ๊ฐ ๋ฐ์ดํธ์ฝ๋๋ JVM์ ์ํด์ ๋ฉ์๋ ์์ญ์ ๋ค์ ์ ๋ณด๋ค์ ์ ์ฅํ๋ค.
1) ๋ก๋๋ ํด๋์ค + ๊ทธ์ ๋ถ๋ชจ ํด๋์ค์ ์ ๋ณด
2) ํด๋์ค ํ์ผ๊ณผ Class, Interface, Enum์ ๊ด๋ จ ์ฌ๋ถ
3) ๋ณ์ & ๋ฉ์๋ ๋ฑ ์ ๋ณด
๋งํฌ
1)๊ฒ์ฆ
: ์ฝ์ ํด๋์ค(๋ฐ์ดํธ์ฝ๋)๊ฐ ์๋ฐ ์ธ์ด ๋ช ์ธ ๋ฐ JVM ๋ช ์ธ์ ๋ช ์๋๋๋ก ์ ๊ตฌ์ฑ๋์ด ์๋์ง ๊ฒ์ฌํ๋ค.
2)์ค๋น
: ํด๋์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ , ํด๋์ค์์ ์ ์๋ ํ๋ & ๋ฉ์๋ & ์ธํฐํ์ด์ค๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๋นํ๋ค.
3)๋ถ์
: ์ฌ๋ณผ๋ฆญ ๋ฉ๋ชจ๋ฆฌ ๋ ํผ๋ฐ์ค๋ฅผ ๋ฉ์๋ ์์ญ์ ์๋ ์ค์ ๋ ํผ๋ฐ์ค๋ก ๊ต์ฒดํ๋ค.
๋ฐ์ดํธ์ฝ๋ ๊ฒ์ฆ๊ธฐ(Verifier)
๊ฐ ์ํํ๋ฉฐ, Java Language Specification (JLS, ์๋ฐ ๋ช
์ธ) & Java Virtual Machine Specification (JVMS, JVM ๋ช
์ธ)๋ฅผ ์ฐธ์กฐํ๋ค.์ด๊ธฐํ
- ํด๋์ค ๋ณ์๋ค์ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํ, ์ฆ static ํ๋๋ค์ด ์ค์ ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ค.
ํด๋์ค ์ด๊ธฐํ ๋จ๊ณ์์๋ static ํ๋์ ๋ํด์๋ง ์ด๊ธฐํ๋ฅผ ์ํํ๋ค.
์๋ํ๋ฉด static
ํ๋๋ ํด๋์ค ๋จ์๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ๋ ์ ์ญ์ ์ธ ์์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ ํด๋น ์์์ ์ธ์คํด์ค ์์ฑ ์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ ์ฌ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์, JVM์ ํด๋์ค๊ฐ ์ฒ์ ๋ก๋ฉ๋ ๋ ํ ๋ฒ๋ง ์ด๊ธฐํ๋ฅผ ์ํํ๊ณ , ์ดํ์๋ ํด๋น ํ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค ๋๊ณ ์ฌ์ฌ์ฉํ๋ค.
๋ฐ๋ฉด, non-static
ํ๋๋ ๊ฐ ์ธ์คํด์ค๋ง๋ค ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ฉฐ, ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ๋ณ๋๋ก ์ด๊ธฐํ๋๋ฏ๋ก ํด๋์ค ์ด๊ธฐํ ๋จ๊ณ์์๋ ์ฒ๋ฆฌ ๋์์ด ์๋๊ฒ ๋๋ค.
์ฆ, ํด๋์ค ์ด๊ธฐํ๋ ์ ์ญ์ ์ธ ์์์ ์ผ๊ด์ฑ๊ณผ ํจ์จ์ ์ธ ๊ด๋ฆฌ๋ฅผ ์ํด static ํ๋์ static ๋ธ๋ก๋ง์ ๋์์ผ๋ก ์ํ๋๋ค.
์ค์ง์ ์ผ๋ก ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํ์ํค๋ ๊ณณ์ด๋ค.
ํด๋์ค ๋ก๋๊ฐ JVM ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ ๋ด์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฐฐ์น์ํค๊ฒ ๋๊ณ , ์ด๋ฅผ ์คํ ์์ง์ด ์คํํ๋ค.
์ฌ๊ธฐ์๋ ์๋ 3๊ฐ์ง ๊ตฌ์ฑ์์๊ฐ ์กด์ฌํ๋ค.
- ์ธํฐํ๋ฆฌํฐ
- JIT ์ปดํ์ผ๋ฌ
- GC(Garbage Collector)
1, 2๋ฒ์ ์ JIT ์ปดํ์ผ๋ฌ๊ฐ ์๊ธด ์ด์
์์ ์ค๋ช
ํ์ผ๋ ๋์ด๊ฐ๊ณ , 3๋ฒ GC
์ ๋ํด์๋ง ๊ฐ๋จํ ์ค๋ช
ํ๊ณ ์ ํ๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ
๋ JVM์ด ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด(๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด)๋ฅผ ์๋์ผ๋ก ํ์งํ๊ณ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ์ง ์์๋ ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์๋ฐ์ ์์ ์ฑ์ ๋์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค.
GC์ ๋ํด์๋ ํด๋น ๊ธ๋ก ์ ๋ฆฌํด๋์๋ค.
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ
์ JVM์ด ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ปํ๋ค.
์ด๋ ํด๋์ค ์ ๋ณด, ๊ฐ์ฒด, ๋ณ์, ์ค๋ ๋ ์คํ ์ ๋ณด ๋ฑ์ ์ ์ฅํ๋ ์ฌ๋ฌ ์์ญ์ผ๋ก ๋๋๋ค.
๊ฐ ์ค๋ ๋๋ง๋ค 1๊ฐ์ฉ ์กด์ฌํ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก, ์ค๋ ๋๊ฐ ์๋ก ์์ฑ๋ ๋ ํจ๊ป ์์ฑ๋๋ค.
ํ์ฌ ์คํ ์ค์ธ ์๋ฐ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ฉฐ, JVM์ด ์ด๋ค ๋ช ๋ น์ด๋ฅผ ๋ค์์ ์คํํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ค๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ด๋ฏ๋ก, ์ค๋ ๋ ๊ฐ ๊ฐ์ญ ์์ด ๋ช ๋ น์ด ์คํ ํ๋ฆ์ ์ถ์ ํ ์ ์๋ค.
ํ๋ก๊ทธ๋จ ์คํ๊ณผ์ ์์ ์์๋ก ํ ๋น๋์๋ค๊ฐ, ๋ฉ์๋๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉด ์๋ฉธ๋๋ ํน์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์ญ์ด๋ค.
๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค, ํด๋น ์์ญ์ ๊ณ ์ ํ ์คํ ํ๋ ์
์ด ์์ฑ๋๋ค. ๋ฉ์๋ ์ํ์ด ์๋ฃ๋๋ฉด ํ๋ ์์ด ์ ๊ฑฐ๋๋ค.
์ด ์์ญ์๋ ์ง์ญ ๋ณ์, ๋งค๊ฐ ๋ณ์, ๋ฆฌํด ๊ฐ, ์ฐ์ฐ ์ค๊ฐ ๊ฒฐ๊ณผ, ๊ทธ๋ฆฌ๊ณ ํ ์์ญ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ๊ฐ(์ฃผ์) ๋ฑ์ด ์ ์ฅ๋๋ค.
PC Register ์์ญ๊ณผ ๋์ผํ๊ฒ ์ค๋ ๋๋น 1๊ฐ์ฉ ์์ฑ๋๋ค. ๋ํ ์ค๋ ๋ ์ข ๋ฃ ์ ํจ๊ป ์๋ฉธํ๋ค.
Native Method Stack์ ์๋ฐ ์ฝ๋๊ฐ ์๋, C/C++ ๋ฑ ๋ค์ดํฐ๋ธ ์ธ์ด๋ก ์์ฑ๋ ๋ฉ์๋(native method)๋ฅผ ์คํํ ๋ ์ฌ์ฉ๋๋ ์ค๋ ๋๋ณ ์คํ ์์ญ์ด๋ค.
JVM์ JNI(Java Native Interface)
๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํธ์ถํ ์ ์์ผ๋ฉฐ, ์ด๋ ์๋ฐ ๋ฐ์ดํธ์ฝ๋๊ฐ ์๋ ๊ธฐ๊ณ์ด ์์ค์ ๋ค์ดํฐ๋ธ ์ฝ๋ ์คํ์ ์ํ ๋ณ๋์ ํธ์ถ ์คํ์ด ์ฌ์ฉ๋๋ค.
์ด ์์ญ์ ์ด์์ฒด์ ์ ํธ์ถ ๊ท์ฝ์ ๋ฐ๋ผ, ํจ์ ํธ์ถ ์ ๋ณด(๋ฆฌํด ์ฃผ์, ๋งค๊ฐ๋ณ์, ์ง์ญ ๋ณ์ ๋ฑ)๋ฅผ ์ ์ฅํ๋ฉฐ, ์ผ๋ฐ์ ์ธ C ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ์คํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋งค์ฐ ์ ์ฌํ๊ฒ ๋์ํ๋ค.
์ด ์คํ ์ญ์ ํฌ๊ธฐ์๋ ์ ํ์ด ์์ผ๋ฉฐ, ๊ณผ๋ํ ๋ค์ดํฐ๋ธ ํธ์ถ์ด๋ ์ค๋ ๋ ์์ฑ ์ StackOverflowError๋ OutOfMemoryError๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํ ์ค SLASH22 - Java Native Memory Leak ์์ธ์ ์ฐพ์์
Method Area๋ JVM์ด ํด๋์ค ์ ๋ณด๋ฅผ ์ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ ๋, ํด๋น ํด๋์ค ์์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์์ญ์ด๋ค.
์ฌ๊ธฐ์๋ ํด๋์ค ์ด๋ฆ, ๋ถ๋ชจ ํด๋์ค ์ ๋ณด, static ๋ณ์, ๋ฉ์๋ ์ ๋ณด, ์์ ํ(Runtime Constant Pool) ๋ฑ์ด ์ ์ฅ๋๋ค.
๋ํ ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ static ํ๋์ ๊ธฐ๋ณธ๊ฐ ํ ๋น ๋ฐ static ๋ธ๋ก ์คํ ์ ๊น์ง์ ์ ๋ณด๊ฐ ์ด ์์ญ์ ์ค๋น๋๋ค.
Runtime Constant Pool(๋ฐํ์ ์์ ํ)
ํด๋์ค ๋๋ ์ธํฐํ์ด์ค๊ฐ ์ฌ์ฉํ๋ ๋ฆฌํฐ๋ด(๋ฌธ์์ด, ์ซ์ ์์ ๋ฑ)์ด๋ ๊ธฐํธ ์ฐธ์กฐ ์ ๋ณด(๋ฉ์๋/ํ๋ ์ฐธ์กฐ, ํด๋์ค ์ด๋ฆ ๋ฑ)๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐ๋ก,
JVM์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ค์ํ ์์ ๋ฐ ์ฐธ์กฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
Heap์ ์๋ฐ์์ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค.
new
์ฐ์ฐ์๋ฅผ ํตํด ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด๋ Heap์ ์ ์ฅ๋๋ฉฐ, ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)์ ๊ด๋ฆฌ ๋์์ด ๋๋ค.
ํ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
1. Young Generation
์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ผ๋ก,Minor GC
๊ฐ ์์ฃผ ๋ฐ์ํ์ฌ ์งง์ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ฑฐํ๊ฒ ๋๋ค.
Eden, Survivor ์์ญ(S0, S1)
์ผ๋ก ๊ตฌ์ฑ๋๋ค.
2. Old Generation
Young ์์ญ์ ์ง๋ ์ด์๋จ์ ์ค๋๋ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณณ์ด๋ค.
YG์ ๋นํด์ ์๋์ ์ผ๋ก GC๊ฐ ์ ๊ฒ ๋ฐ์ํ๋ฉฐ,Major GC ๋๋ Full GC
์ ๋์์ด ๋๋ค.
3. Metaspace(Permanent Generation)
ํด๋์ค ๋ฉํ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ผ๋ก, JVM์ด ์๋ OS๊ฐ ์ง์ ๊ด๋ฆฌํ๋๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
์ ์ฌ์ฉํ๋ค.
1. PermGen์ ๋จ์ ๋ณด์ ๋ชฉ์
Java 8 ์ด์ ์๋PermGen
์ด๋ผ๋ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํ๋๋ฐ, ํฌ๊ธฐ๊ฐ ๊ณ ์ ์ด๋ผOOM
์ด ์์ฃผ ๋ฐ์ํ์๋ค.
2. ์ ์ฐํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
Java 8๋ถํฐ ๋์ ๋Metaspace
๋ JVM ๋ด๋ถ ๋ฉ๋ชจ๋ฆฌ ๋์ , OS๊ฐ ๊ด๋ฆฌํ๋๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ ์์ญ
์ ์ฌ์ฉํ๊ฒ ๋์๋ค.
๋ฐ๋ผ์ ํ์ํ ๋งํผ ๋์ ์ผ๋ก ์ฆ๊ฐํ ์ ์์ด, PermGen๋ณด๋ค ํจ์ฌ ์์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ 1
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ 2
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ 3