JVM
JDK, JRE, JVM
JDK, JRE, JVM์ ๋ํ ์ฉ์ด๋ฅผ ์ ๋ฆฌ ํ๊ฒ ์ต๋๋ค.

JDK : Java Development Kit / ์๋ฐ ๊ฐ๋ฐ ๋๊ตฌ
JRE : Java Runtime Environment / ์๋ฐ ์คํ ํ๊ฒฝ
JVM : Java Virtual Machine / ์๋ฐ ๊ฐ์ ๊ธฐ๊ณ
Java์ ํธํ์ฑ

์ Chapter์์ ์์๋ณด๊ธฐ๋ก ํ C์ธ์ด์ Java์ ์ฐจ์ด์ ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Java๋ Write Once Use Anywhere ์ด๋ผ๋ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค! ๋ฒ์ญํ์๋ฉด, "์์คํ์ผ์ ํ๋๋ง ์์ฑํ๋ฉด ์ด๋์์๋ ์ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค!" ์ ๋๋ค.
๋ฐ๋ฉด์ C์ธ์ด๋ One Source Multi Object Use Anywhere ๋ฒ์ญํ์๋ฉด, "ํ๋์ ์์คํ์ผ๋ก ๊ฐ ๊ธฐ๊ณ์ ๋ง๋ ๋ชฉ์ ํ์ผ๋ก ๋ง๋ค์ด ์ด๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค!" ์ ๋๋ค.
์ ๋ฆฌํด ๋ณด์๋ฉด, ํ๋์ ๋ชฉ์ ํ์ผ๋ก ์ด๋๋ ์คํ์ด ๊ฐ๋ฅํ๋, ๋ค์์ ๋ชฉ์ ํ์ผ์ ๋ง๋ค์ด์ ๊ฐ ๊ธฐ๊ณ์ ๋ง๊ฒ ์ฌ์ฉํ๋์ ์ฐจ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก , ์ฐ๋ฆฌ๋ Java๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๊ณ์ ๊ธฐ์ข ๋ณ ์ฆ, ์ด์์ฒด์ ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ๊ฐ๋ฐ์ ํ ์ ์๊ฒ ๋์์ต๋๋ค.
์ฌ๊ธฐ์ Java์ ๋ชฉ์ ํ์ผ์ ๋ฐ๊ธฐ๊ณ์ด์ธ ๋ฐ์ดํธ์ฝ๋(.class)์ธ๋ฐ ์ด๋ ์ด์์ฒด์ ๊ฐ ์๋๋ผ JVM์์ ์ฌ์ฉ๋ฉ๋๋ค.
์์ค์ฝ๋๋ฅผ ๋ฐ์ดํธ ์ฝ๋๋ก ์ปดํ์ผ ํด์ฃผ๋๊ฒ ์๋ฐ ์ปดํ์ผ๋ฌ(javac)์ ๋๋ค.
๊ทธ๋ผ ๋ค์์ผ๋ก Java๊ฐ ์ด๋ค ๊ณผ์ ์ ํตํด ์ปดํ์ผ๋์ด ์คํ๋๋์ง ๋ณด๊ฒ ์ต๋๋ค.
Java์ ์คํ ๊ณผ์

๊ฐ๋ฐ์๋ ์๋ฐ ์์คํ์ผ(.java)๋ฅผ ์์ฑํฉ๋๋ค.
JDK๊ฐ ์ ๊ณตํ๋ javac๋ฅผ ์ฌ์ฉํ์ฌ ์์คํ์ผ์ ์ปดํ์ผํฉ๋๋ค.
JVM์ Class Loader๋ ์ปดํ์ผ๋ก ์์ฑ๋ ๋ฐ์ดํธ ์ฝ๋(.class)๋ฅผ ์ ๋ฌ ๋ฐ์ ๋์ ๋ก๋ฉ์ ํตํด ์คํ์ ํ์ํ ํด๋์ค๋ค์ ๋ก๋ฉํ์ฌ JVM ๋ด๋ถ Runtime Data Area์ ๋ก๋ํฉ๋๋ค.
JVM์ Execution์ ์ํด ๊ธฐ๊ณ์ด๋ก ํด์๋์ด ์คํ๋ฉ๋๋ค.
Class Loader
ํ๋ก๊ทธ๋จ ์์ ์์ฑํ ๋ชจ๋ ํด๋์ค, ๋ณ์ ๋ฐ ๋ฉ์๋์ ์ ๋ณด๋ฅผ Method Area์ ๋ฐฐ์นํฉ๋๋ค.
JVM ๋ด๋ถ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ก๋ํ๊ณ ๋งํฌ๋ฅผ ํตํด ๋ฐฐ์นํ๋ ์์ ์ ์ํํ๋ ๋ชจ๋์ ๋๋ค.
์คํ๋ ๋ ๋์ ์ผ๋ก ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ jar ํ์ผ ๋ด๋ถ์ ์ ์ฅ๋์ด ์๋ ํด๋์ค๋ค์ JVM์ ๋ก๋ํฉ๋๋ค.
static(์ ์ ) ๋ณ์์ ๋ฉ์๋๋ Heap Area์ ๋ฐฐ์นํฉ๋๋ค.
Execution(์คํ ์์ง)
Interpreter๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ์ค ์ฉ ์ฝ๊ณ ๋ฒ์ญํด ์ฃผ๋๋ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค.
๊ทธ๋์ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋์จ ๊ฒ์ด JIT ์ปดํ์ผ๋ฌ์ ๋๋ค.
JIT ์ปดํ์ผ๋ฌ๋ Interpreter ๋ฐฉ์์ผ๋ก ์คํ์ ํ๋ค๊ฐ ์ ๋นํ ์์ ์ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ์บ์ฑํฉ๋๋ค.
์บ์ฑ ์ฆ, ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์ ์ฅํด ๋๊ธฐ ๋๋ฌธ์ ์ด ์ฝ๋๋ค์ Interpreter๋ฅผ ํตํด ์คํ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋ก ์คํ์ด ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์คํ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ์ง๋๋ค.
Garbage Collector๋ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด ์ ํจํ์ง ์์ ์ฆ, ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ์ ํ์ฌ ๋น์์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ถ๊ฐ๋ก ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ ์ปดํ์ผ ์ธ์ด์ ๋ํด ํ๋ฒ ์ ๋ฆฌํ๊ณ ๊ฐ๊ฒ ์ต๋๋ค.
Compile ์ธ์ด์ Interpreter ์ธ์ด

Compile ์ธ์ด
์์คํ์ผ ์ ์ฒด๋ฅผ ์ปดํ์ผ ํ ํ ๊ธฐ๊ณ์ด๋ฅผ CPU์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ์ฝ์ด์ ๋ฐ๋ก ์คํํ๋ ๋ฐฉ์์ผ๋ก ๋์์ด ๋๋ ์ธ์ด
์ข ๋ฅ : C, C++, Java, C# ...
ํน์ง
์์คํ์ผ์ ํฌ๊ธฐ๊ฐ ํฌ๋ฉด ์ปดํ์ผ ๊ณผ์ ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ปดํ์ผ์ด ๋ ํ์ ๊ธฐ๊ณ์ด๋ก ๋ฐ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์คํ ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
Java๋ javac์ ์ํด ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ ๋์ง๋ง JVM์์๋ ์ธํฐํ๋ฆฌํฐ๋ก ์คํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก Compile ์ธ์ด์ด์ง๋ง, Interpreter ์ธ์ด์ ํน์ง์ ๋์์ ๊ฐ์ง๋๋ค.
Interpreter ์ธ์ด
์์คํ์ผ์ ์ปดํ์ผํ์ง ์๊ณ ์ Interpreter๋ฅผ ์ฌ์ฉํ์ฌ ์์คํ์ผ์ ํ์ค ์ฉ ๋ฒ์ญํ๋ฉด์ ์คํํ๋ ๋ฐฉ์์ผ๋ก ๋์์ด ๋๋ ์ธ์ด
Interpreter : ์์ค ์ฝ๋๋ฅผ ๋ฐ๋ก ๋ฒ์ญํ์ฌ ์คํํ๋ ํ๋ก๊ทธ๋จ ํน์ ํ๊ฒฝ
์ข ๋ฅ : Javascript, Ruby, Python ...
ํน์ง
์ปดํ์ผ ์ธ์ด์ฒ๋ผ ๋ณ๋์ ๋ชฉ์ ํ์ผ์ด ์กด์ฌํ์ง ์์ต๋๋ค.
์ปดํ์ผ ๊ณผ์ ์์ด ๋ฐ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์์ ๋ฐ ๋๋ฒ๊น ์ ํธํฉ๋๋ค.
Interpreter ๋ง ์กด์ฌํ๋ฉด ์ด๋์๋ ์ง ์คํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ ๋กญ๊ณ ๋ ๋ฆฝ์ ์ ๋๋ค.
์ค์๊ฐ์ผ๋ก ๋ฒ์ญ ๋๋ฉด์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์คํ ์๋๊ฐ ๋๋ฆฝ๋๋ค.
JVM
JVM์ Java ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ฐ์ ์ปดํจํฐ๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.

์ ์ด๋ฏธ์ง ์ฒ๋ผ JVM์ ๋ด๋ถ์ ์ผ๋ก ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค!
์ฐ๋ฆฌ๋ ์ด ์ค์์ Runtime Data Areas๋ฅผ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.(Java 8 ์ดํ ๊ธฐ์ค)

์ ์ฒ๋ฆฌ ๊ณผ์ ์ดํดํ๊ธฐ
Runtime Data Areas๋ฅผ ํ์ตํ๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ํด ํ์ตํ๊ฒ ์ต๋๋ค.
์์์ JRE๋ Java์ ์คํ ํ๊ฒฝ์ด๋ผ๊ณ ๋ฐฐ์ ์ต๋๋ค.
JRE๋ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ ์ ๋จผ์ ํ๋ก๊ทธ๋จ์ ๋ฉ์ธ ๋ฉ์๋๋ฅผ ํฌํจํ๊ณ ์๋์ง ํ์ธํ๊ณ ์กด์ฌํ๋ค๋ฉด JVM์ ๋ถํ ์ํต๋๋ค.
๋ถํ ์ด๋ JVM์ ์ ๋ฌ๋ฐ์ ์ฝ๋๋ฅผ ์คํ ์ํค๋๋ฐ ์ด๋ ๊ฐ์ฅ ๋จผ์ ํ๋ ์ผ์ด ์ ์ฒ๋ฆฌ๋ผ๊ณ ํ๋ ๊ณผ์ ์ ๋๋ค.
์ ์ฒ๋ฆฌ ๊ณผ์
๋ชจ๋ Java ํ๋ก๊ทธ๋จ์ ๋ฐ๋์ java.lang ํจํค์ง๋ฅผ ํฌํจํฉ๋๋ค. ๋ฐ๋ผ์ JRE๋ ํด๋น ํจํค์ง๋ฅผ Method Area์ ๋ฐฐ์นํฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๊ธฐ์ํด importํ ํจํค์ง๋ค๋ ์กด์ฌํ ๊ฒ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Method Area์ ๋ฐฐ์นํฉ๋๋ค.
ํ๋ก๊ทธ๋จ ์์ ์์ฑํ ๋ชจ๋ ํด๋์ค, ๋ณ์ ๋ฐ ๋ฉ์๋์ ์ ๋ณด๋ฅผ Method Area์ ๋ฐฐ์นํฉ๋๋ค.
static(์ ์ ) ๋ณ์์ ๋ฉ์๋๋ Heap Area์ ๋ฐฐ์นํฉ๋๋ค.
Runtime Data Areas
์ปดํจํฐ์์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ญํ ์ ์ํํ๋ ์์ญ์ ๋๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ์ฌ ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ญํ ์ ํ๋๋ฐ, ๋ฐ์ดํฐ์ ์์ฑ์ ๋ฐ๋ผ ์์ญ์ด ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค.
PC Register
์ค๋ ๋๊ฐ ์์๋ ๋๋ง๋ค ์์ฑ๋๋ ๊ณต๊ฐ์ผ๋ก, ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํฉ๋๋ค.
์ค๋ ๋๊ฐ ์ด๋ค ๋ช ๋ น์ ์ํด ์คํ๋์ด์ผ ํ ์ง์ ๋ํ ๊ธฐ๋ก์ ํ๋ ๋ถ๋ถ์ผ๋ก ํ์ฌ ์ํ์ ํ๊ณ ์๋ JVM์ ๋ช ๋ น ์ฃผ์๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
Native Method Stack
์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ปดํ์ผ ๋์ด ์์ฑ๋๋ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋ ์ค์ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ ๋๋ค.
์๋ฐ ์ด์ธ์ ์ธ์ด(C, C++, ์ด์ ๋ธ๋ฆฌ ๋ฑ)๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์คํํ ๋, Native Method Stack์ด ํ ๋น ๋๋ฉฐ, ์ผ๋ฐ์ ์ธ C ์คํ์ ์ฌ์ฉํฉ๋๋ค.
Java Native Interface๋ฅผ ํตํด ๋ฐ์ดํธ ์ฝ๋๋ก ์ ํํ์ฌ ์ ์ฅ๋ฉ๋๋ค.
์ผ๋ฐ ํ๋ก๊ทธ๋จ์ฒ๋ผ ์ปค๋์ด ์คํ์ ์ก์ ๋ ์์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ ๋๋ค.
Method Area(Metaspace, Static Area, Class Area)
ํด๋์ค ์ ๋ณด๋ฅผ ์ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ๋ฆด ๋ ์ด๊ธฐํ ๋๋ ๋์์ ์ ์ฅํ๊ธฐ ์ํ ๊ณต๊ฐ์ ๋๋ค.
ํด๋์ค์ ํ์ , ๋ณ์ ๋ฐ ๋ฉ์๋๋ฑ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ชจ๋ Thread๊ฐ ๊ณต์ ํฉ๋๋ค.
Runtime Constant Pool
์์ ์๋ฃํ์ ์ ์ฅํ์ฌ ์ฐธ์กฐํ๊ณ ์ค๋ณต์ ๋ง๋ ์ญํ ์ ์ํํฉ๋๋ค.
Heap Area

๊ฐ์ฒด(์ธ์คํด์ค)๊ฐ ์์ฑ๋๋ ์์ญ์ ๋๋ค. ํ๋ก๊ทธ๋จ์ ์คํํ๋ ์ค ์์ฑ๋๋ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์ด๊ณณ์ ์์ฑ๋ฉ๋๋ค.
Permanent Generation
์์ฑ๋ ๊ฐ์ฒด๋ค์ ์ ๋ณด์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋ ๊ณต๊ฐ์ ๋๋ค.
ํด๋์ค ๋ก๋์ ์ํด ๋ก๋๋๋ Class, Method ๋ฑ์ ๋ํ Meta ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๋ฉฐ JVM์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
Reflection์ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํด๋์ค๊ฐ ๋ก๋ฉ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
Java 8 ์ด์ ์๋ Permanent Generation ์ด Heap ๋ด๋ถ์ ์กด์ฌ ํ์ง๋ง 8 ์ดํ ์ ๊ฑฐ๋๊ณ Method Area ์ฆ, Metaspace ๋ผ ๋ถ๋ฆฌ์ฐ๋ฉฐ Heap์ด ์๋ Native ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค. ์ด์ ์ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ํ๊ณ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ณ๊ฒฝ๋์์ต๋๋ค.
New/Young Generation
Eden : ๊ฐ์ฒด๋ค์ด ์ต์ด๋ก ์์ฑ๋๋ ๊ณต๊ฐ์ ๋๋ค.
Survivor 0,1 : Eden์์ ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
์๋ช ์ฃผ๊ธฐ๊ฐ ์งง์ ๊ฐ์ฒด๋ฅผ Garbage Collector ์ ๋์์ผ๋ก ํ๋ ์์ญ์ ๋๋ค.
Eden ์์ญ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด Garbage Collector์ ์ํด Eden ์์ญ์ ์๋ ๊ฐ๋ค์ Survivor 1 ์์ญ์ ๋ณต์ฌํ๊ณ ์ด ์์ญ์ ์ ์ธํ ๋๋จธ์ง ๊ฐ์ฒด๋ค์ ์ญ์ ํฉ๋๋ค.
Tenured Generation
Old : ์ด๊ณณ์ ๊ฐ์ฒด๋ค์ Garbage Collector ์ ์ํด ์ญ์ ๋ฉ๋๋ค.
New/Young Generation ์์ ์ผ์ ์๊ฐ ์ฐธ์กฐ๋๊ณ ์๊ณ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธด ๊ฐ์ฒด๋ฅผ Garbage Collector ์ ๋์์ผ๋ก ํ๋ ์์ญ์ ๋๋ค.
Stack Area

ํ๋ก๊ทธ๋จ ์คํ ๊ณผ์ ์์ ์์๋ก ํ ๋น์ด ๋์๋ค๊ฐ ๋ฉ์๋๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉด ๋ฐ๋ก ์๋ฉธ์ด ๋๋ ํน์ฑ์ ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๊ธฐ ์ํ ์์ญ์ ๋๋ค.
์คํ๋๋ ๋ฉ์๋ ๋ฐ ์ค๊ดํธ ๋ธ๋ก(if๋ฌธ๋ฑ)์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์์ญ์ ๋๋ค.
๊ฐ์ฅ ์ฒ์ ์คํ๋๋ ๋ฉ์๋(main())๊ฐ ์ฒซ ๋ฒ์งธ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ณ ๊ทธ ๋ค์์ ์คํ๋๋ ๋ฉ์๋๋ค์ด ์์ ์์ด๋ ๊ตฌ์กฐ์ ๋๋ค.
์์ด๋ ๋ฉ์๋์ ๋จ์๋ฅผ ์คํ ํ๋ ์์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๊ธฐ ์ํ ๋ณ์ ๋ฐ ๋ธ๋ก์ด ์กด์ฌํ๋ฉด ์คํ ํ๋ ์ ๋ด๋ถ์ ์คํ ํ๋ ์์ด ์๊ธธ ์ ์์ต๋๋ค.
๊ฐ์ฅ ํฐ ํน์ง์ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๊ฐ ์ค๋ ๋๊ฐ ๊ณ ์ ์ ์คํ ์์ญ์ ๊ฐ์ง๋ค๋ ์ ์ ๋๋ค.
๋๋์ด ๋ค์ Chapter ๋ถํฐ ๋ณธ๊ฒฉ์ ์ผ๋ก Java์ ๋ํด ํ์ตํด ๋ณด๊ฒ ์ต๋๋ค!
Last updated