Execution Engine
Execution Engine์ Java Virtual Machine(JVM) ๋ด์์ ํด๋์ค๊ฐ ๋ก๋๋ ํ ์ด๋ฅผ ์คํํ๊ธฐ ์ํด ํ์ํ ํต์ฌ ๋ชจ๋์ ๋๋ค. ClassLoader๋ฅผ ํตํด JVM ๋ด๋ก ๋ฐฐ์น๋ ํด๋์ค๋ Execution Engine์ ํตํด Bytecode๋ฅผ ์คํํ๊ฒ ๋๋ฉฐ, ์ด ๊ณผ์ ์์ JVM์ ์ง์ ๋ ๋ช ๋ น์ด ์งํฉ(Instruction Set)์ ๋ฐ๋ผ ๋์ํฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ด๋ค์ Bytecode์ ์ ์๋์ด ์์ผ๋ฉฐ, ์ค์ ๋ก ํด๋์ค์ Bytecode๋ฅผ ์คํํ๋ ๊ฒ์ด ๋ฐ๋ก Execution Engine์ ์ญํ ์ ๋๋ค.
Java ํ๋ก๊ทธ๋จ์ ์คํ ๊ณผ์
Java ํ๋ก๊ทธ๋จ์ด JVM์์ ์คํ๋๋ ๊ณผ์ ์ ๊ฐ๋ตํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์์ค ์ฝ๋ ์์ฑ ๋ฐ ์ปดํ์ผ: ๊ฐ๋ฐ์๊ฐ ์์ฑํ Java ์์ค ์ฝ๋๋
.java
ํ์ฅ์๋ก ์ ์ฅ๋ฉ๋๋ค. ์ด ํ์ผ์ JDK์ ํฌํจ๋javac
์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์ปดํ์ผ๋์ด.class
ํ์ผ๋ก ๋ณํ๋ฉ๋๋ค. ์ด.class
ํ์ผ์ JVM์ด ์ดํดํ ์ ์๋ Bytecode๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, Bytecode๋ JVM์ ๋ช ๋ น์ด ์งํฉ์ผ๋ก ๋ณํ๋ ์์ค ์ฝ๋์ ๋๋ค.ํด๋์ค ๋ก๋ฉ: ์ปดํ์ผ๋
.class
ํ์ผ์ JVM์ ClassLoader์ ์ํด JVM ๋ด๋ก ๋ก๋๋๊ณ , ์ด์ด์ ๋งํฌ(Link) ์์ ์ด ์ํ๋ฉ๋๋ค. ์ด ๊ณผ์ ์ด ์๋ฃ๋๋ฉด ํด๋์ค๋ Runtime Data Areas์ Method Area์ ๋ฐฐ์น๋ฉ๋๋ค. Method Area๋ JVM ๋ด์์ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ, ๋ฉ์๋ ๋ฐ์ดํฐ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํธ์ฝ๋๊ฐ ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋ค.Execution Engine์ ์ํ ์คํ: ๋ก๋๋ ํด๋์ค์ Bytecode๋ Execution Engine์ ์ํด ์คํ๋ฉ๋๋ค. Execution Engine์ Bytecode๋ฅผ ์ฝ๊ณ , ์ด๋ฅผ JVM ๋ช ๋ น์ด๋ก ํด์ํ์ฌ ์คํํฉ๋๋ค. ์ด๋ JVM ๋ช ๋ น์ด๋ Instruction Set์ผ๋ก ์ ์๋๋ฉฐ, ๊ฐ๊ฐ์ Instruction์ Opcode์ Operand๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Opcode๋ ์ํํ ์์ ์ ์๋ฏธํ๊ณ , Operand๋ ์์ ์ ๋์์ด ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
Bytecode์ Instruction์ ๊ตฌ์กฐ
Bytecode๋ Java ์์ค ์ฝ๋์ ์คํ ํ๋ฆ์ ๋ํ๋ด๋ ๋ช ๋ น์ด๋ค์ ์งํฉ์ ๋๋ค. Bytecode๋ ์ผ๋ฐ์ ์ผ๋ก ์ธ ๊ฐ์ง ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
๋ฉ์๋ ์์ ์ง์ ์ผ๋ก๋ถํฐ์ Offset: Bytecode์์ ํน์ ๋ช ๋ น์ด๊ฐ ๋ฉ์๋ ๋ด์์ ์์นํ๋ ์ง์ ์ ๋ํ๋ ๋๋ค. ์ด ์ ๋ณด๋ ๋ช ๋ น์ด ๊ฐ์ ์ ์ด ํ๋ฆ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Opcode์ Operand: Opcode๋ ์ํํ ์์ ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ฉฐ, Operand๋ ์์ ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด,
iconst_0
์ ์์ 0์ ์คํ์ ํธ์ํ๋ ๋ช ๋ น์ด์ด๊ณ ,istore_1
์ ์คํ์ ๊ฐ์ ๋ก์ปฌ ๋ณ์์ ์ ์ฅํ๋ ๋ช ๋ น์ด์ ๋๋ค.์ฃผ์: Bytecode๋ ์ฃผ์์ ํฌํจํ ์ ์์ผ๋ฉฐ, ์ด๋ Bytecode๋ฅผ ํด์ํ๊ณ ์ดํดํ๋ ๋ฐ ๋์์ ์ฃผ์ง๋ง ์ค์ ์คํ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
Execution Engine์ ๋์ ๋ฐฉ์
Execution Engine์ JVM ๋ด์์ Bytecode๋ฅผ ํด์ํ๊ณ ์คํํ๋ ๋ชจ๋์ ๋๋ค. ์ด๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค:
์ธํฐํ๋ฆฌํฐ ๋ฐฉ์: Execution Engine์ด Bytecode๋ฅผ ํ ์ค์ฉ ์ฝ๊ณ , ์ด๋ฅผ ํด์ํ์ฌ ์ฆ์ ์คํํ๋ ๋ฐฉ์์ ๋๋ค. ์ด ๋ฐฉ์์ ์ฅ์ ์ Bytecode๋ฅผ ํด์ํ๋ ์๊ฐ์ด ์งง๋ค๋ ์ ์ด์ง๋ง, ์คํ ์๋๋ ๋๋ฆด ์ ์์ต๋๋ค. ํนํ, ๋ฃจํ์ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ์์ ์์ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
JIT(Just-In-Time) ์ปดํ์ผ๋ฌ ๋ฐฉ์: JIT ์ปดํ์ผ๋ฌ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ๋จ์ ์ ๋ณด์ํฉ๋๋ค. JVM์ ์ฒ์์ Bytecode๋ฅผ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ค๊ฐ, ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๋ ์ฝ๋ ๋ธ๋ก์ด ๊ฐ์ง๋๋ฉด JIT ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผ๋ ํ, JVM์ ํด๋น ์ฝ๋๋ฅผ ์ง์ ์คํํ์ฌ ์๋๋ฅผ ๊ทน๋ํํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ์ด์์ ์ต์ ํ ๊ธฐ๋ฒ
Java์ Execution Engine์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ค์ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ์ ๋๋ค:
On-Stack Replacement (OSR): OSR์ JVM์ด ๋ฃจํ ๋ด์์ ๋ฐ๋ณต์ ์ธ ์์ ์ ๊ฐ์งํ๋ฉด, ์ธํฐํ๋ฆฌํฐ๋ก ์คํ ์ค์ด๋ ์ฝ๋๋ฅผ ์ค๋จํ๊ณ JIT ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋์ฒดํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ ๋ฃจํ์ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ์ฝ๋ ๋ธ๋ก์์ ํฐ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
Loop Unrolling: ์ด ๊ธฐ๋ฒ์ ๋ฃจํ์ ๋ฐ๋ณต ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฃจํ ๋ณธ๋ฌธ์ ์ฌ๋ฌ ๋ฒ ๋ณต์ฌํ์ฌ ์คํํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฃจํ์ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ๋ช ๋ น์ด ์คํ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
Dead Code Elimination: ์คํ๋์ง ์๋ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์คํ ์๋๋ฅผ ๋์ด๋ ์ต์ ํ ๊ธฐ๋ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ณ์ฐ๋ ๊ฐ์ด ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ํด๋น ๊ณ์ฐ ์ฝ๋๋ ์ ๊ฑฐ๋ฉ๋๋ค.
Code Hoisting: ์ด ๊ธฐ๋ฒ์ ๋ฃจํ ๋ด์์ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ๋๋ ๊ฐ์ ๋ฃจํ ์ธ๋ถ๋ก ์ด๋์์ผ, ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ด๋ ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฃจํ ๋ด์์ ์ค๋ณต ๊ณ์ฐ์ ํผํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
Execution Engine์ ์ฑ๋ฅ ์ด์
Execution Engine์ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํนํ, ๋ฃจํ์ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ์์ ์์๋ Bytecode๊ฐ ๊ณ์ํด์ ๋ฐ๋ณต ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Java๋ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ง์ ์ง์ํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด ๋ด์ ๋ฐฐ์ด์ ํฌํจํ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋นํจ์จ์ ์ผ ์ ์์ผ๋ฉฐ, ๋ฐฐ์ด ์ ๊ทผ ์๋์์ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด JVM ๋ฒค๋๋ค์ ๋ค์ํ ์ต์ ํ ๊ธฐ์ ์ ์ ์ฉํ์ฌ ์ฑ๋ฅ ์ ํ๋ฅผ ์ต์ํํ๊ณ ์์ต๋๋ค.
JVM์ ๊ธฐ๋ ์๊ฐ๊ณผ AOT ์ปดํ์ผ๋ฌ
JVM์ ๊ธฐ๋ ์ JIT ์ปดํ์ผ๋ฌ๊ฐ ๋ง์ Bytecode๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Java 6์์ Ahead-Of-Time(AOT) ์ปดํ์ผ๋ฌ๊ฐ ๋์ ๋์์ต๋๋ค. AOT ์ปดํ์ผ๋ฌ๋ JVM์ด ์์๋๊ธฐ ์ ์ Bytecode๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผํ์ฌ Shared Cache์ ์ ์ฅํฉ๋๋ค. ์ด Shared Cache๋ ์ฌ๋ฌ JVM ์ธ์คํด์ค๊ฐ ๊ณต์ ํ ์ ์์ผ๋ฉฐ, JVM ๊ธฐ๋ ์ ์ด ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ ์๊ฐ์ ๋จ์ถํ๊ณ ์ด๊ธฐ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
Hotspot ์ปดํ์ผ๋ฌ์ ๋์ ๋ฐฉ์
Hotspot JVM์ ๋ ๊ฐ์ง ์์ดํ VM์ธ Client VM๊ณผ Server VM์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. Client VM์ ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด ์ต์ ํ๋ฅผ ์ ๊ณตํ๋ C1 ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, Server VM์ ๋ณด๋ค ๊ฐ๋ ฅํ ์ต์ ํ๋ฅผ ์ ๊ณตํ๋ C2 ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. C1 ์ปดํ์ผ๋ฌ๋ ์ฃผ๋ก ์ ์ ์ธ ์ปดํ์ผ์ ์ํํ๋ฉฐ, C2 ์ปดํ์ผ๋ฌ๋ ํ๋ก๊ทธ๋จ์ ์ ๋ฐ์ ์ธ ์ต์ ํ๋ฅผ ํตํด ์ฑ๋ฅ์ ๊ทน๋ํํฉ๋๋ค.
Hotspot JVM์ ์ด ๋ ๊ฐ์ง ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ฑ์ ๋ง๋ ์ต์ ํ ์ ๋ต์ ์ ์ฉํ์ฌ, ๋ค์ํ ํ๊ฒฝ์์ ์ต์ ์ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Execution Engine์ Java์ ํต์ฌ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ก, ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ ํตํด Java ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ฉฐ, Java์ "Write Once, Run Anywhere" ์ฒ ํ์ ์ ์งํ๋ฉด์๋ ๋์ ์คํ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
Last updated