JVM
Java Virtual Machine์ด๋?
Java๋ "ํ ๋ฒ ์์ฑํ๋ฉด ์ด๋์๋ ์คํ"์ด๋ผ๋ ๊ฐ๋
์ผ๋ก ๋ค์ํ ํ๋ซํผ์์ ์ค๊ณ๋์ด ์๋ค. ์๋ฅผ ๋ค์ด ํน์ ํ๋ซํผ ์ฉ์ผ๋ก ์ปดํ์ผ๋๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋๋ C++์ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌ๋ฆฌ Java ์์ค๋ ๋จผ์ .class ํ์ผ์ธ ๋ฐ์ดํธ ์ฝ๋๋ก ์ปดํ์ผ ๋๋ค. ์ปดํ์ผ ๋ ํด๋์ค ํ์ผ์ VM(๊ฐ์ ๋จธ์ )์์ ํด์์ด๋๋ค.
์ฆ, ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ ํ๋ก์ธ์ค๋ผ๊ณ ํ ์ ์๋ค.
Class Loader
- java ํด๋์ค๋ฅผ ์ปดํ์ผํ๋ฉด ํ๋ซํผ๊ณผ ๊ธฐ๊ณ์ ๋
๋ฆฝ์ ์ธ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํ์ด ๋ฉ๋๋ค.
- ์ปดํ์ผ๋ ํด๋์ค๋ .class ํ์ผ๋ก ์ ์ฅ์ด ๋ฉ๋๋ค.
- .class ํ์ผ์ ์คํ์ํค๋ฉด Java ClassLoader๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑ๋์๋์ง ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ฒ์ฌํ๊ณ ํด๋น ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํฉ๋๋ค.
Class Loader ๋ด๋ถ์ ์์ธํ ์ค๋ช
: (https://javatutorial.net/java-class-loaders-explained)
Runtime Data Area์ 5๊ฐ์ง ์์ญ
- Method Area
์ ์ ๋ณ์๋ฅผ ํฌํจํ์ฌ(Constant Pool ํฌํจ) ๋ชจ๋ ํด๋์ค ์์ค ๋ฐ์ดํฐ๊ฐ ์ฌ๊ธฐ์ ์ ์ฅ๋๋ค. JVM ๋น ํ๋์ ๋ฉ์๋ ์์ญ๋ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ค๋ ๋์์ ๊ณต์ ํ๋ ์์์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ค๋ ๋๋ก ๋ถํฐ ์์ ํ์ง ๋ชปํ๋ค.
- Heap Area
๋ชจ๋ ๊ฐ์ฒด์ ํด๋น ์ธ์คํด์ค ๋ณ์ ๋ฐ ๋ฐฐ์ด์ด ์ฌ๊ธฐ์ ์ ์ฅ๋๋ค. JVM ๋น ํ๋์ ํ์์ญ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ค๋ ๋์์ ๊ณต์ ํ๋ ์์์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ๋ชปํ๋ค.
- Stack Area
๋ชจ๋ ์ค๋ ๋์ ๋ํด ๋ณ๋์ ๋ฐํ์ ์คํ์ด ์์ฑ๋๋ค. ๋ชจ๋ ๋ฉ์๋ ํธ์ถ์ ๋ํด ์คํ ํ๋ ์์ด๋ผ๊ณ ํ๋ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ํ๋์ ํญ๋ชฉ์ด ๋ง๋ค์ด์ง๋ค. ๋ชจ๋ ์ง์ญ ๋ณ์๋ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๋ค. ์คํ ์์ญ์ ๊ณต์ ์์์ด ์๋๋ฏ๋ก ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๋ค.
- PC Register
Program Count์ ์ฝ์๋ก ๊ฐ ์ค๋ ๋๋ ๋ณ๋์ PC ๋ ์ง์คํฐ๋ฅผ ๊ฐ์ง๋ค. ํด๋น ์์ญ์ ํ์ฌ ์คํํ๊ณ ์๋ ๋ถ๋ถ์ ์ฃผ์(address)๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก PC์ ๊ฐ์ ํ์ฌ ๋ช
๋ น์ด ๋๋ ๋ค ๊ฐ์ ์ฆ๊ฐ์ํจ๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋นํ๋ ๊ฐ์ ๋ช
๋ น์ ์คํํ๊ฒ ๋๋ค. ์ฆ, ์คํ๋ ๋ช
๋ น์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- Native Method Stack
์ผ๋ฐ์ ์ผ๋ก JVM์ ๋ค์ดํฐ๋ธ ๋ฐฉ์(c์ธ์ด๋ก ์์ฑ๋) ์ ์ง์ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ Stack Area์ ์์ด๋ค๊ฐ ํด๋น ๋ฉ์๋ ๋ด๋ถ์ ๋ค์ดํฐ๋ธ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ํด๋น ๋ฉ์๋๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ ์์ด๊ฒ ๋๋ค. ๋ชจ๋ ์ค๋ ๋์ ๋ํด์ ๋ณ๋์ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ด ์์ฑ๋๊ฒ ๋๋ค.
Execution Engine
Runtime Data Area์ ํ ๋น ๋ ๋ฐ์ดํธ์ฝ๋๊ฐ Execution Engine์ ์ํด์ ์คํ๋๋ค. ์ฆ, ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ค. ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํ ๋์ 2์ข
๋ฅ์ ๋ฐฉ์์ ์ฌ์ฉ (Interpreter
, JIT Compiler
)
Interpreter
Interpreter๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ ๋นจ๋ฆฌ ํด์ํ์ง๋ง ๋๋ฆฌ๊ฒ ์คํ๋๋ค. Interpreter์ ๋จ์ ์ ํ๋์ ๋ฉ์๋๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋์ด๋ ๋งค๋ฒ ์๋ก์ด ํด์์ด ํ์ํ๋ค๋ ๊ฒ์ด๋ค.
JIT Compiler
Just-In-Time์ ์ฝ์๋ก ์ฝ๊ฒ ๋งํ๋ฉด "๋์ ๋ณํ"์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ์ญ์ฌ์ ์ผ๋ก 2๊ฐ์ง์ ํ๋ก๊ทธ๋จ ์คํ ๋ฐฉ์์ด ์์๋ค.
- ์ธํฐํ๋ฆฌํฐ(interpreter) ๋ฐฉ์: ํ๋ก๊ทธ๋จ์ด ์คํํ ๋๋ง๋ค ์ปดํจํฐ๊ฐ ์์ ๋ค์ ์ ์๋ ์ธ์ด๋ก ๋ณํํ๋ ์์
์ ์ํ => ๊ฐํธํ์ง๋ง ์ฑ๋ฅ์ด ๋งค์ฐ ๋๋ฆฌ๋ค
- ์ ์ (static) ์ปดํ์ผ ๋ฐฉ์: ์คํํ๊ธฐ์ ์ ์ปดํจํฐ๊ฐ ์์ ๋ค์ ์ ์๋ ์ธ์ด๋ก ๋ณํํ๋ ์์
์ ๋ฏธ๋ฆฌ ์คํํ๋ค => ๋ณํ์์
์ ํ๋ฒ๋ง ์ํํ๋ค
JIT Compiler๋ Interpreter์ ๋จ์ ์ ๋ฌด๋ ฅํํ๋ค. Execution Engine์ ์ฒ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ณํํ๋๋ฐ Interpreter๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ฐพ์ผ๋ฉด JIT Compiler๊ฐ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค ๋์๋ค๊ฐ ์ฌ์ฌ์ฉ์ ํ๊ฒ๋๋ค.
JNI (Java Native Interface)
JNI๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํธ ์์ฉํ๊ณ Execution Engine์ ํ์ํ Native Library๋ฅผ ์ ๊ณต
Native Method Library
Execution Engine์ ํ์ํ Native Libraries์ ๋ชจ์
GC(Garbage Collector)
GC๋ ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์์งํ๊ณ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด์ค๋ค. ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋์ง ์๊ณ ์ธ๋ชจ ์๋ ๊ฒ์ผ๋ก ํ๋ช
๋ ์ ์๋ ๋ฐฉ๋ฒ 3๊ฐ์ง
- null
- ๋ค๋ฅธ ๊ฐ์ฒด์ ์ฐธ์กฐ ํ ๋น
- ์ต๋ช
๊ฐ์ฒด
JVM์ ๋ค์๊ณผ ๊ฐ์ด ์์ญ์ ๋๋์ด Heap Area์ ๊ฐ์ฒด๋ค์ ๊ด๋ฆฌํ๋ค.
)
๊ฐ์ฅ ์ผ์ชฝ์ Young์์ญ์๋ ๋ง ๊ทธ๋๋ก ์ ์ ๊ฐ์ฒด๋ค์ด ์กด์ฌ Old ์์ญ์๋ ๋์ ๊ฐ์ฒด๋ค์ด ์๋ฆฌ์ก๊ฒ ๋๋ค. Permanent ์์ญ์๋ ํด๋์ค๋ ๋ฉ์๋์ ๋ํ ์ ๋ณด๊ฐ ์์ธ๋ค.
- Eden ์์ญ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
- Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋๊ณ ๋ค์ Eden ์์ญ์ ์ฑ์ฐ๊ฒ ๋๋ค.
- Survivor ์์ญ์ด ๊ฝ์ฐจ๋ฉด ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋๋ค. ์ด ๋, Eden์์ญ์ ์๋ ๊ฐ์ฒด๋ค ์ค ์ด์์๋ ๊ฐ์ฒด๋ค๋ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ๊ฐ๋ค. ์ฆ, Survivor ์์ญ์ ๋์ค ํ๋๋ ๋ฐ๋์ ๋น์ด ์์ด์ผ ํ๋ค.
Young Generation์์ ์ผ์ด๋๋ ๊ฒ์ Young GC, Old Generation ์์ ์ผ์ด๋๋ GC๋ฅผ Full GC ๋ผ๊ณ ํ๋ค.
-
์ฅ์
์ฌ์ฉ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ GC์์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ์๋์ ์ด์ง ์๋ค.
์๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ด๋ฆฌ
-
๋จ์
๊ฐ์ฒด ์ฐธ์กฐ ์์ฑ / ์ญ์ ๋ฅผ ์ถ์ ํ๋ ค๋ฉด ๋ ๋ง์ CPU ์ฑ๋ฅ์ด ํ์ํ๋ฉฐ ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ์์ฒญ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
์ผ๋ถ GC ๊ตฌํ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ด ์๊ธฐ์น ์๊ฒ ์ค์ง ๋ ์ ์๋ค.
์ด๋ค ๊ฒฝ์ฐ์๋ ํจ์จ์ ์ด์ง ์์ ์ ์๋ค.