[TOC]
JVM์ด๋ JAVA Virtual Machine, ์๋ฐ ๊ฐ์ ๋จธ์ ์ ์ฝ์๋ฅผ ๋ฐ์ ์ค์ฌ ๋ถ๋ฅด๋ ์ฉ์ด๋ค.
๊ฐ์๋จธ์ : ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ๋ฌผ๋ฆฌ์ ๋จธ์ ๊ณผ ์ ์ฌํ ๋จธ์ ์ ์ํธํ์จ์ด๋ก ๊ตฌํํ ๊ฒ์ด๋ค.
JVM ์ญํ ์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋์ค ๋ก๋๋ฅผ ํตํด ์ฝ์ด ๋ค์ฌ ์๋ฐ API์ ํจ๊ป ์คํํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ JVM์ JAVA์ OS์ฌ์ด์์ ์ค๊ฐ์ ์ญํ ์ ์ํํ์ฌ JAVA๊ฐ OS์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ฌ์ฌ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ, Garbage collection์ ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ JVM์ ์คํ๊ธฐ๋ฐ์ ๊ฐ์๋จธ์ ์ด๋ค. ARM ์ํคํ ์ฒ ๊ฐ์ ํ๋์จ์ด๋ ๋ ์ง์คํฐ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋๋ฐ ๋นํด JVM์ ์คํ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
-
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด JVM์ OS๋ก๋ถํฐ ์ด ํ๋ก๊ทธ๋จ์ด ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋๋ค. JVM์ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฉ๋์ ๋ฐ๋ผ ์ฌ๋ฌ ์์ญ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ค.
-
์๋ฐ ์ปดํ์ผ๋ฌ(javac)๊ฐ ์๋ฐ ์์ค์ฝ๋(.java)๋ฅผ ์ฝ์ด๋ค์ฌ ์๋ฐ ๋ฐ์ดํธ์ฝ๋(.class)๋ก ๋ณํ์ํจ๋ค.
-
Class Loader๋ฅผ ํตํด classํ์ผ๋ค์ JVM์ผ๋ก ๋ก๋ฉํ๋ค.
-
๋ก๋ฉ๋ classํ์ผ๋ค์ Execution engine์ ํตํด ํด์๋๋ค.
-
ํด์๋ ๋ฐ์ดํธ์ฝ๋๋ Runtime Data Areas์ ๋ฐฐ์น๋์ด ์ค์ง์ ์ ์ํ์ด ์ด๋ฃจ์ด์ง๊ฒ ๋๋ค.
์ด๋ฌํ ์คํ๊ณผ์ ์์์ JVM์ ํ์์ ๋ฐ๋ผ Thread Synchronization๊ณผ GC๊ฐ์ ๊ด๋ฆฌ์์ ์ ์ํํ๋ค.
JVM๋ด๋ก ํด๋์ค(.classํ์ผ)๋ฅผ ๋ก๋ํ๊ณ , ๋งํฌ๋ฅผ ํตํด ๋ฐฐ์นํ๋ ์์ ์ ์ํํ๋ ๋ชจ๋์ด๋ค. ๋ฐํ์์์ ๋์ ์ผ๋ก ํด๋์ค๋ฅผ ๋ก๋ํ๋ค. jarํ์ผ ๋ด ์ ์ฅ๋ ํด๋์ค๋ค์ JVM์์ ํ์ฌํ๊ณ ์ฌ์ฉํ์ง ์๋ ํด๋์ค๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํ๋ค. ์๋ฐ๋ ๋์ ์ฝ๋, ์ปดํ์ผ ํ์์ด ์๋๋ผ ๋ฐํ์์ ์ฐธ์กฐํ๋ค. ์ฆ, ํด๋์ค๋ฅผ ์ฒ์์ผ๋ก ์ฐธ์กฐํ ๋, ํด๋น ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ ๋งํฌํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ ์ญํ ์ ํด๋์ค ๋ก๋๊ฐ ์ํํ๋ค.
ํด๋์ค๋ฅผ ์คํ์ํค๋ ์ญํ ์ด๋ค. ํด๋์ค ๋ก๋๊ฐ JVM๋ด์ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ฐฐ์น์ํค๊ณ , ์ด๊ฒ์ ์คํ์์ง์ ์ํด ์คํ๋๋ค. ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ ๊ธฐ๊ณ๊ฐ ๋ฐ๋ก ์ํํ ์ ์๋ ์ธ์ด๋ณด๋ค๋ ๋น๊ต์ ์ธ๊ฐ์ด ๋ณด๊ธฐ ํธํ ํํ๋ก ๊ธฐ์ ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์คํ ์์ง์ ์ด์ ๊ฐ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ค์ ๋ก JVM๋ด๋ถ์์ ๊ธฐ๊ณ๊ฐ ์คํํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝํ๋ค. ์ด ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋๋ค.
์คํ ์์ง์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ ๋จ์๋ก ์ฝ์ด์ ์คํํ๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ ๋จ์ ์ ๊ทธ๋๋ก ๊ฐ๊ณ ์๋ค. ํ ์ค์ฉ ์คํํ๊ธฐ๋๋ฌธ์ ๋๋ฆฌ๋ค๋ ๊ฒ์ด๋ค.
์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋ JIT ์ปดํ์ผ๋ฌ์ด๋ค. ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ค๊ฐ ์ ์ ํ ์์ ์ ๋ฐ์ดํธ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํ๊ณ , ์ดํ์๋ ๋ ์ด์ ์ธํฐํ๋ฆฌํ ํ์ง ์๊ณ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ง์ ์คํํ๋ ๋ฐฉ์์ด๋ค. ๋ค์ดํฐ๋ธ ์ฝ๋๋ ์บ์์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ปดํ์ผ๋ ์ฝ๋๋ ๋น ๋ฅด๊ฒ ์ํํ๊ฒ ๋๋ค. ๋ฌผ๋ก JIT์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ๋ ๊ณผ์ ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ธํฐํ๋ฆฌํ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ค๋๊ฑธ๋ฆฌ๋ฏ๋ก ํ ๋ฒ๋ง ์คํ๋๋ ์ฝ๋๋ผ๋ฉด ์ปดํ์ผํ์ง ์๊ณ ์ธํฐํ๋ฆฌํ ํ๋๊ฒ์ด ์ ๋ฆฌํ๋ค. ๋ฐ๋ผ์ JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ JVM๋ค์ ๋ด๋ถ์ ์ผ๋ก ํด๋น ๋ฉ์๋๊ฐ ์ผ๋ง๋ ์์ฃผ ์ํ๋๋์ง ์ฒดํฌํ๊ณ , ์ผ์ ์ ๋๋ฅผ ๋์ ๋์๋ง ์ปดํ์ผ์ ์ํํ๋ค.
GC๋ฅผ ์ํํ๋ ๋ชจ๋(์ฐ๋ ๋)์ด ์๋ค.
ํ๋ก๊ทธ๋จ์ ์ํํ๊ธฐ ์ํด OS์์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค.
์ฐ๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ฉฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋๋ ๊ณต๊ฐ์ผ๋ก ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํ๋ค.
์ฐ๋ ๋๊ฐ ์ด๋ค ๋ถ๋ถ์ ์ด๋ค ๋ช ๋ น์ผ๋ก ์คํํด์ผํ ์ง์ ๋ํ ๊ธฐ๋ก์ ํ๋ ๋ถ๋ถ์ผ๋ก ํ์ฌ ์ํ์ค์ธ JVM ๋ช ๋ น์ ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
ํ๋ก๊ทธ๋จ ์คํ๊ณผ์ ์์ ์์๋ก ํ ๋น๋์๋ค๊ฐ ๋ฉ์๋๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉด ๋ฐ๋ก ์๋ฉธ๋๋ ํน์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์ญ์ด๋ค. ๊ฐ์ข ํํ์ ๋ณ์๋ ์์ ๋ฐ์ดํฐ, ์ค๋ ๋๋ ๋ฉ์๋์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ๋ฉ์๋ ํธ์ถ ์๋ง๋ค ๊ฐ๊ฐ์ ์คํ ํ๋ ์์ด ์์ฑ๋๋ค. ์คํ ํ๋ ์์ ๊ทธ ๋ฉ์๋๋ง์ ์ํ ๊ณต๊ฐ์ด๋ค.
๋ฉ์๋ ์ํ์ด ๋๋๋ฉด ํ๋ ์๋ณ๋ก ์ญ์ ๋ฅผ ํ๋ค. ๋ฉ์๋ ์์์ ์ฌ์ฉ๋๋ ๊ฐ๋ค(local variable, ์ง์ญ๋ณ์)์ ์ ์ฅํ๋ค. ๋ ํธ์ถ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฐ ์ฐ์ฐ ์ ์ผ์ด๋๋ ๊ฐ๋ค์ ์์๋ก ์ ์ฅํ๋ค.
-
Local Variable Section
Local Variable Section์ Method์ Parameter Value์ Local Variable์ ์ ์ฅํ๋ค.
-
Operand Stack
Operand Stack์ JVM์ ์์ ๊ณค๊ฐ์ด๋ค. JVM์ด ์ฐ์ฐ์ ํ์ํ ๋ฐ์ดํฐ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ Operand Stack์ ๋ฃ๊ณ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
-
Frame Data
Stack Frame์ ๊ตฌ์ฑํ๊ณ ์๋ ์์ญ, Constant Pool Resolution ์ ๋ณด์ method๊ฐ ์ ์ ์ข ๋ฃํ์ ๋์ ์ ๋ณด ๋๋ ๋น์ ์ ์ข ๋ฃ๋ฅผ ํ์ ๋ ๋ฐ์ํ๋ Exception ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ปดํ์ผ๋์ด ์์ฑ๋๋ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋ ์ค์ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ด๋ค. JAVA๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ํ ๊ณต๊ฐ์ด๋ค. JAVA Native Interface๋ฅผ ํตํด ๋ฐ์ดํธ ์ฝ๋๋ก ์ ํํ์ฌ ์ ์ฅํ๊ฒ ๋๋ค. ์ผ๋ฐ ํ๋ก๊ทธ๋จ์ฒ๋ผ ์ปค๋์ด ์คํ์ ์ก์ ๋ ์์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ด๋ค.
ํด๋์ค ์ ๋ณด๋ฅผ ์ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ๋ฆด ๋ ์ด๊ธฐํ๋๋ ๋์์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ. ์ฌ๋ผ๊ฐ๊ฒ ๋๋ ๋ฉ์๋์ ๋ฐ์ดํธ ์ฝ๋๋ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๊ตฌ์ฑํ๋ ๋ฐ์ดํธ ์ฝ๋์ด๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ main ๋ฉ์๋์ ํธ์ถ์์๋ถํฐ ๊ณ์๋ ๋ฉ์๋์ ํธ์ถ๋ก ํ๋ฆ์ ์ด์ด๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ถ๋ถ ์ธ์คํด์ค์ ์์ฑ๋ ๋ฉ์๋ ๋ด์์ ๋ช ๋ นํ๊ณ ํธ์ถํ๋ค. ์ฌ์ค์ ์ปดํ์ผ ๋ ๋ฐ์ดํธ์ฝ๋์ ๋๋ถ๋ถ์ด ๋ฉ์๋ ๋ฐ์ดํธ์ฝ๋์ด๊ธฐ๋๋ฌธ์ ๊ฑฐ์ ๋ชจ๋ ๋ฐ์ดํธ์ฝ๋๊ฐ ์ฌ๋ผ๊ฐ๋ค๊ณ ๋ด๋ ์๊ด์๋ค. ์ด ๊ณต๊ฐ์๋ ๋ฐํ์ ์์ ํ(Runtime Constant Pool)์ด๋ผ๋ ๋ณ๋์ ๊ด๋ฆฌ ์์ญ๋ ํจ๊ป ์กด์ฌํ๋ค. ์ด๋ ์์ ์๋ฃํ์ ์ ์ฅํ์ฌ ์ฐธ์กฐํ๊ณ ์ค๋ณต์ ๋ง๋ ์ญํ ์ ์ํํ๋ค.
Constant Pool์ JVM์์ ๊ฐ์ฅ ์ค์ํ ์ญํ ์ ์ํํ๋ ๊ณณ์ด๊ณ , ๋ง์ด ์ฌ์ฉ๋๋ ๊ณณ์ด๊ธฐ๋ ํ๋ค. Constant Pool์๋ Literal Constant๋ ๋ฌผ๋ก ์ด๊ณ Field(Member Variable, Class Variable), Method๋ก์ ๋ชจ๋ Symbolic Reference๊น์ง ๊ฐ์ง๋ค. Symbolic Reference์ ์ญํ ์ ํ๋ ๊ณณ์ด Constant Pool์ด๋ค.
๋ฆฌํฐ๋ด ์์(Literal Constant) : ๋ฐ์ดํฐ ๊ทธ ์์ฒด๋ฅผ ๋ปํ๋ค. ๋ฉ๋ชจ๋ฆฌ ์์น ์์ ๊ฐ
์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค(Symbolic Reference) : ์ฐธ๊ณ ํ๋ ํด๋์ค์ ํน์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐ ๊ด๊ณ๋ก ๊ตฌ์ฑํ ๊ฒ์ด ์๋ ์ฐธ์กฐํ๋ ๋์์ ์ด๋ฆ๋ง์ ์ง์ ํ ๊ฒ
-
ํ๋ ์ ๋ณด(Field Information)
๋ฉค๋ฒ๋ณ์์ ์ด๋ฆ, ํ ์ดํฐ ํ์ , ์ ๊ทผ ์ ์ด์์ ๋ํ ์ ๋ณด
-
๋ฉ์๋ ์ ๋ณด(Method Information)
๋ฉ์๋์ ์ด๋ฆ, ๋ฆฌํดํ์ , ๋งค๊ฐ๋ณ์, ์ ๊ทผ์ ์ด์์ ๋ํ ์ ๋ณด
-
ํ์ ์ ๋ณด(Type Information)
class์ธ์ง interface์ธ์ง์ ์ฌ๋ถ ์ ์ฅ / Type์ ์์ฑ, ์ ์ฒด ์ด๋ฆ, super class์ ์ ์ฒด ์ด๋ฆ(interface ๋๋ object์ธ ๊ฒฝ์ฐ ์ ์ธ)
๋ฉ์๋ ์์ญ์ ํด๋์ค ๋ฐ์ดํฐ๋ฅผ ์ํ ๊ณต๊ฐ.
GC์ ๊ด๋ฆฌ ๋์์ ํฌํจ๋๋ค.
๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค. new์ฐ์ฐ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค. ๋ฌผ๋ก ํด๋์ค ์์ญ์ ์ฌ๋ผ์จ ํด๋์ค๋ค๋ง ๊ฐ์ฒด๋ก ์์ฑํ ์ ์๋ค.
ํ์ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๋ค.
์์ฑ๋ ๊ฐ์ฒด๋ค์ ์ ๋ณด์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋ ๊ณต๊ฐ์ด๋ค. Class loader์ ์ํด load๋๋ Class, Method ๋ฑ์ ๋ํ Meta ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๊ณ , JVM์ ์ํด ์ฌ์ฉ๋๋ค. Reflection์ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํด๋์ค๊ฐ ๋ก๋ฉ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค. ๋ด๋ถ์ ์ผ๋ก Reflection ๊ธฐ๋ฅ์ ์์ฃผ ์ฌ์ฉํ๋ Spring Framework๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ์ด ์์ญ์ ๋ํ ๊ณ ๋ ค๊ฐ ํ์ํ๋ค.
JDK 8์์ ์ด ์์ญ์ ์ญ์ ๋์๋ค.
- Eden : ๊ฐ์ฒด๋ค์ด ์ต์ด๋ก ์์ฑ๋๋ ๊ณต๊ฐ
- Survivor 0 / 1 : Eden์์ ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ
New ์์ญ์์ ์ผ์ ์๊ฐ ์ฐธ์กฐ๋๊ณ ์๋, ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ.
Eden์์ญ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋ํ๊ฒ๋๋ฉด ์ฒซ๋ฒ์งธ GC(minor GC)๊ฐ ๋ฐ์ํ๋ค. Eden์์ญ์ ์๋ ๊ฐ๋ค์ Survivor 1 ์์ญ์ ๋ณต์ฌํ๊ณ ์ด ์์ญ์ ์ ์ธํ ๋๋จธ์ง ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค.
ํ ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ํ ๊ณต๊ฐ.
GC์ ๊ด๋ฆฌ ๋์์ ํฌํจ๋๋ค.
์ธ์คํด์ค๋ ์๋ฉธ ๋ฐฉ๋ฒ๊ณผ ์๋ฉธ ์์ ์ด ์ง์ญ ๋ณ์์๋ ๋ค๋ฅด๊ธฐ์ ํ์ด๋ผ๋ ๋ณ๋์ ์์ญ์ ํ ๋ค์ค๋๋ค. ์๋ฐ ๊ฐ์ ๋จธ์ (JVM)์ ๋งค์ฐ ํฉ๋ฆฌ์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์๋ฉธ์ํจ๋ค. ๋์ด์ ์ธ์คํด์ค์ ์กด์ฌ ์ด์ ๊ฐ ์์ ๋ ์๋ฉธ์ํจ๋ค.