JVM์ ๋ํด
๐ฏ ๋ฐฐ๊ฒฝ
์๋ฐ์์ ์ ์ผ ์ค์ํ๋ค๋๊ฒ ๋ฌด์์ด๋๊ณ ๋ฌผ์ด๋ณด๋ฉด ๋๋ถ๋ถ JVM์ด๋ผ๊ณ ๋งํ๋ค. ์๋ํ๋ฉด JVM์ ์๋ฐ์์ ํต์ฌ ๋์์ด๋ผ ์๊ฐํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๋ JVM์ ๋ํด ์ ์์ง ๋ชปํ๋ค. ์๋ํ๋ฉด JVM์ ๋ชฐ๋ผ๋ JAVA๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ JVM์ ํ์ตํ๋ ๋ชฉ์ ์ ๋ค๋ฅธ ์ง์์ ํ์ต ํ๊ธฐ ์ํด์๋ JVM์ ์๋๊ฒ์ด ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
โ๏ธ ํต์ฌ ๋ด์ฉ (What & How)
- ๐๏ธ JVM์ ๋ํด
- โ๏ธ JVM ๋์๋ฐฉ์
๐ ๊ฒฐ๊ณผ์ ์ธ์ฌ์ดํธ (So what?)
๐๏ธ JVM์ ๋ํด
JVM์ Java Virtual Machine์ ์ฝ์๋ก, ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ๊ฐ์ ๋จธ์ ์ด๋ผ๊ณ ํ๋ค. ์ง๊ธ์ด์ผ ๋ง์๊ฒ๋ค์ด ๋ฐ์ ํด์ ์ด๋์์๋ ์ง ์ฝ๋๋ฅผ ์คํ์ด ๊ฐ๋ฅํ์ง๋ง, ์๋ฐ๊ฐ ํ์ํ์๋๋ 1995๋ ๋๋ก ์๊ณ ์๋ค. ๊ทธ๋๋ ์๋์ฐ์์ ์์ฑํ ์ฝ๋์ ๋ฆฌ๋ ์ค์์ ์์ฑํ ์ฝ๋์ ์คํํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ๋ค. ๊ทธ๋์ ํ์ํ๊ฒ์ด JVM์ด๋ผ ์๊ณ ์๋ค. ๊ทธ๋ ๋ค๋ฉด, JVM์ ์ด๋ป๊ฒ ํด์ ๋ชจ๋ ํ๊ฒฝ์์ ์คํ์ ์ํฌ ์ ์๋ ๊ฑธ๊น?
์์์ ์ธ๊ธํ๋ฏ์ด, JVM์ ์๋ฐ์ ๊ฐ์๋จธ์ ์ด๋ค. ์ด๋์์ ๊ฐ๋ฅํ๋ค๋ ๋ป์ JVM๋ด์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ผ ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ์์๋ ์ถ๋ค. ์ด์ ์ด๊ฑฐ์ ๋ํด ์์๋ณด์.
โ๏ธ JVM ๋์๋ฐฉ์
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
1
2
3
4
5
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
์์ฝ๊ฒ๋ ์ด ์ฝ๋๋ ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ๊ณ ๊ธ ์ธ์ด(Java ์์ค์ฝ๋)๋ก ์์ฑ๋์๊ธฐ ๋๋ฌธ์, ์ปดํจํฐ๋ ์ด ์ฝ๋๋ฅผ ์ง์ ์คํํ ์ ์๋ค. ๊ทธ๋์ ์ด ์ฝ๋๋ฅผ ์ด๋๊ฐ์์ ํด์ํด์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๋ฐ, ์ด ์ญํ ์ ์ํํ๋ ๊ฒ์ด ๋ฐ๋ก JVM(Java Virtual Machine)์ด๋ค.
๊ทธ๋ฐ๋ฐ JVM์ด ์ด ์ฝ๋๋ฅผ ๊ณง๋ฐ๋ก ์คํํ ์ ์์๊น? ์ ์ํ๊ฒ๋ JVM๋ ์ด ์์ค์ฝ๋๋ฅผ ์ง์ ์ดํดํ ์๋ ์๋ค. ๊ทธ๋์ ๊ทธ ์ ์ ๋ฐ๋์ ์ปดํ์ผ์ด๋ผ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค. ์ด ๊ณผ์ ์ .java ํ์ผ์ .class ํ์ผ๋ก ๋ณํํด์ฃผ๋ ์์ ์ด๋ฉฐ, ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ปดํ์ผ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ง๊ธ๊น์ง, Java ์ฝ๋๋ฅผ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๋ ๊ณผ์ ๊น์ง ์ดํด๋ณด์๋ค.
๊ทธ๋ฌ๋ฉด JVM์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์คํํ ๊น?
์ผ๋ฐ์ ์ผ๋ก JVM์ ์คํ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํ๋ฉฐ ์คํํ๋ค. ๋ฐ์ดํธ์ฝ๋๋ ๋ช ๋ น์ด ๋จ์๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, JVM์ ์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ํด์ํ๋ฉด์ ๋์์ ์ํํ๋ค. ์ด ๋ฐฉ์์ ์ฐ๋ฆฌ๋ ์ธํฐํ๋ฆฌํ (Interpreting)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ๋นํจ์จ์ ์ด๋ค. ์๋ํ๋ฉด ๋์ผํ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋งค๋ฒ ํด์ํด์ ์คํํด์ผ ํ๊ณ , ๊ทธ์ ๋ฐ๋ผ ์๋ชจ๋๋ ๋ฆฌ์์ค ๋น์ฉ๋ ๋ฌด์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ JVM์ ์์ฃผ ์คํ๋๋ ๋ฐ์ดํธ์ฝ๋ ์์ญ์ ํ์งํ์ฌ, ์ด ๋ถ๋ถ์ JIT(Just-In-Time) ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ์ฝ๋(๊ธฐ๊ณ์ด)๋ก ๋ณํํ๋ค. ์ด๋ ๊ฒ ๋ณํ๋ ์ฝ๋๋ ํด์ ์์ด ๋ฐ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ํจ์ฌ ํฅ์๋๋ค.
์ด๋ฌํ ์ต์ ํ ๋์์ด ๋๋ ์์ฃผ ์คํ๋๋ ์ฝ๋ ์์ญ์ ํํ Hot Method๋ผ๊ณ ๋ถ๋ฅธ๋ค. (์ฐธ๊ณ ๋ก, HotSpot์ด๋ผ๋ ์ฉ์ด๋ JVM์ ๋ํ์ ์ธ ๊ตฌํ์ฒด ์ด๋ฆ์ด๋ค.)
๊ฒฐ๊ตญ ์ปดํ์ผ๋ฌ๊ฐ Java ์์ค์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๊ณ , JVM์ ์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ํด์ํ๊ฑฐ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณํํด ์คํํจ์ผ๋ก์จ Java ์ฝ๋๋ ์ค์ ํ๋์จ์ด ์์์ ๋์ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด์ ํ๋์ ์ง๋ฌธ์ ๋์ ธ๋ณด์. Java์๋ ๋ณ์, ๋ฉ์๋, ํด๋์ค ๋ฑ ๋ค์ํ ์์๊ฐ ์กด์ฌํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ชจ๋ ์์๋ฅผ ํ๋์ ๊ณต๊ฐ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์๊น? ์๋๋ฉด ๊ฐ ์์์ ํน์ฑ์ ๋ฐ๋ผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ๊น?
๐ข JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ณด๋ฉด ์คํ, PC Register, Native Method Stack, ํ, ๋ฉ์๋ ์์ญ์ด ์ด๋ ๊ฒ ์กด์ฌํ๋ค.
์ด๊ฒ๋ค์ด ์ด๋ค๊ฒ์ธ์ง ์๊ฐ์ ํ๊ธฐ์ ์ ์ด๋ ๊ฒ ์ ๊ตฌ๋ถ์ด ๋๋์ง๋ถํฐ ์๊ฐ์ ํด์ผ ํ ๊ฑฐ ๊ฐ๋ค.
์ ์ ๋ค๋ฅธ ์๊ธฐ๋ฅผ ํ์๋ฉด ์ด๊ฑด ์ฐ๋ฆฌ๊ฐ ๋ถ๋ฆฌ์๊ฑฐ๋ฅผ ํ๋๊ฑฐ์ ๊ต์ฅํ ์ ์ฌํ๋ค๊ณ ์๊ฐํ๋ค. ๋ถ๋ฆฌ์๊ฑฐ๋ฅผ ํ๊ธฐ ์ํด์๋ ๊ฐ ํฌ์ง์ ์ ๋ง๊ฒ ๋ฃ์ด์ผ ํ๋ค. ๊ทธ๊ฑฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ๊ฐ ํฌ์ง์ ์ ๋ง๊ฒ ๋ฃ์ด์ผ ๋๋ค๊ณ ์๊ฐํ๋ค.
๐ JVM ๋ฉ๋ชจ๋ฆฌ ์์ญ๋ณ ์ ๋ณด
๋ฉ๋ชจ๋ฆฌ ์์ญ | ์ ์ฅ๋๋ ์ ๋ณด | ๊ด๋ จ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด |
---|---|---|
์คํ | - ์ง์ญ ๋ณ์ - ํผ์ฐ์ฐ์ ์คํ - ๋ฉ์๋ ํธ์ถ ํ๋ ์ | bipush , iload , iadd invoke* , istore , aload astore |
ํ | - ๊ฐ์ฒด ์ธ์คํด์ค - ๋ฐฐ์ด | new , getfield putfield , areturn |
๋ฉ์๋ ์์ญ | - ํด๋์ค ๋ฉํ๋ฐ์ดํฐ - static ๋ณ์ - ์์ ํ - final ์์ | getstatic , putstatic invokestatic |
PC ๋ ์ง์คํฐ | ํ์ฌ ์คํ ์ค์ธ JVM ๋ช ๋ น์ด ์ฃผ์ | (JVM ์๋ ๊ด๋ฆฌ) |
๋ค์ดํฐ๋ธ ์คํ | JNI๋ฅผ ํตํ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ํธ์ถ ์ ๋ณด | native ํค์๋ ๋ฉ์๋ |
๊ฒฐ๊ตญ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฅ์ ์ํจ๋ค๋๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ ์์ํ ์ ์ฅ์ด ๋์ด์ง๊น?
์๊ฐ์ ํด๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด๊ฐ ์์ํ ์ ์ฅ์ด ๋๋ค๋ฉด, java๋ ์ ์ ๋๋ ค์ง๊ฑฐ๋ผ ์๊ฐํ๋ค. ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ๋ค์ ์๊ฐ์ด ์ง๋๋ฉด ์ ๊ฑฐ๋ฅผ ์์ผ์ผ ํ๋ค๋ ์๋ฆฌ์ธ๋ฐ ์ด๋ป๊ฒ ์ ๊ฑฐ๋ฅผ ์ํฌ ์ ์์๊น?
ํ -> GC(Garbage Collector)๊ฐ ๊ฐ์ฒด์ ๋ ์ด์ ์ฐธ์กฐ ์์ ๋ Stack -> ๋ฉ์๋ ์ข ๋ฃ ์์ Method Area -> ํด๋์ค ์ธ๋ก๋ ์์ (๊ฑฐ์ ์์) PC Register -> ์ค๋ ๋ ์ข ๋ฃ ์ Native Method Stack -> ๋ค์ดํฐ๋ธ ํธ์ถ ์ข ๋ฃ ์
์ด๊ฒ์ ์ ์ฝ์ด๋ณด๋ฉด ์คํ,๋ฉ์๋ ์์ญ, PC Register, ๋ค์ดํฐ๋ธ ์คํ์ ์ข
๋ฃ์ ์ญ์ ์ธ๊ฑธ ์์ ์๋ ๋ฐ๋ฉด GC๊ฐ์ ๊ฒฝ์ฐ๋ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์ฐธ์กฐํ์ง ์์๋ ์ ๊ฑฐ๋ฅผ ํ๋ค๊ณ ํ๋ค. ๊ทธ๋ ๋ค๋ ์ด์ผ๊ธฐ๋ ๊ฐ์ฒด๊ฐ์ ๊ฒฝ์ฐ๋ ์ข
๋ฃ ์์ ์ ํ์
ํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๋ ์๋ฆฌ๋ผ ์๊ฐ์ด ๋ ๋ค. ์๋ํ๋ฉด ๊ฐ์ฒด๋ new
๋ก ์์ฑ์ด ๋์ด์ง๋ฉด ์ธ์ ๋ ์ง ๊บผ๋ด์ด์ ์ฌ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ๋ค๋ฅธ ํค์๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ข ๋ฃ ์์ ์ ํ์ ํด ์ ๊ฑฐ๊ฐ ์ฝ๋ค๊ณ ๋๊ปด์ง๋ค. ์๋ฅผ๋ค์ด ์คํ ๊ฐ์ ๊ฒฝ์ฐ๋ ์คํ์ผ๋ก ์์ด๊ธฐ๋๋ฌธ์ ์คํ์ด ๋น ์ ธ๋๊ฐ๋ ์ง์ฐ๋ฉด ๋๊ธฐ๋๋ฌธ์ด๋ค.
๐ ์์ฝ (One-liner)
JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๊ด๋ฆฌ
๋ฉ๋ชจ๋ฆฌ ์์ญ๋ณ ํน์ง
- ์คํ: ๋ฉ์๋ ํธ์ถ ์ ์๋ ์์ฑ/์ ๊ฑฐ, ์ง์ญ ๋ณ์์ ์ฐ์ฐ ์คํ ๊ด๋ฆฌ
- ํ: ๋์ ํ ๋น๋ ๊ฐ์ฒด์ ๋ฐฐ์ด ์ ์ฅ, GC์ ์ฃผ์ ๊ด๋ฆฌ ๋์
- ๋ฉ์๋ ์์ญ: ํด๋์ค ๋ฉํ๋ฐ์ดํฐ, static ๋ณ์, ์์ ํ ์ ์ฅ
- PC ๋ ์ง์คํฐ: ํ์ฌ ์คํ ์ค์ธ ๋ช ๋ น์ด ์ฃผ์ ์ถ์
- ๋ค์ดํฐ๋ธ ์คํ: JNI ํธ์ถ ์ ์ฌ์ฉ
๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ ๋ฐฉ์
- ์๋ ์ ๋ฆฌ: ์คํ, PC ๋ ์ง์คํฐ, ๋ค์ดํฐ๋ธ ์คํ์ ์ฌ์ฉ ์ข ๋ฃ ์ ์๋ ์ ๋ฆฌ
- GC ๊ด๋ฆฌ: ํ ์์ญ์ ์ฐธ์กฐ๊ฐ ์์ด์ง ๋ GC๊ฐ ํ์
- ํด๋์ค ์ธ๋ก๋: ๋ฉ์๋ ์์ญ์ ๊ฑฐ์ ์ ๋ฆฌ๋์ง ์์
ํต์ฌ ์ธ์ฌ์ดํธ
- ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ฐ๊ฐ์ ํน์ฑ์ ๋ง๋ ์ต์ ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅ
- ๊ฐ์ฒด๋ ์ฐธ์กฐ ์ถ์ ์ด ๋ณต์กํ์ฌ GC๊ฐ ๊ด๋ฆฌ
- ๋๋จธ์ง ์์ญ์ ๋ช ํํ ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์๋ ์ ๋ฆฌ
1
2
JVM์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ํด ๊ฐ ์์ญ์ ๊ตฌ๋ถํ๊ณ , ๊ฐ๊ฐ์ ํน์ฑ์ ๋ง๋ ๊ด๋ฆฌ ์ ๋ต์ ์ ์ฉํฉ๋๋ค.
์ด๋ ๋ง์น ๋ถ๋ฆฌ์๊ฑฐ๋ฅผ ํตํด ์์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค.
references
- https://steady-coding.tistory.com/305