-
JVM ๋์๋ฐฉ์
JVM(์๋ฐ ๊ฐ์ ๋จธ์ )์ ์๋ฐ ์ธ์ด์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ค. ์ฝํ๋ฆฐ, ์ค์นผ๋ผ ์ธ์ด์์๋ JVM ๋์ ๋ฐฉ์์ ๊ทธ๋๋ก ๋ฐ๋ฅธ๋ค.
๋ฐ๋ผ์ JVM์ ์ ํํ ์ดํดํ๋ฉด ์ถํ์ ์๋ฐ์์ ํ์๋ ์ธ์ด๋ฅผ ์ดํดํ๋ ๋ฐ์๋ ๋์์ด ๋๋ค.(1) ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ-> JVM์ OS๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋๋ค.
(2) ์๋ฐ ์ปดํ์ผ๋ฌ(javac)๊ฐ ์๋ฐ ์์ค์ฝ๋(.java)๋ฅผ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋(.class)๋ก ์ปดํ์ผ ํ๋ค.
(3) Class Loader๋ ๋์ ๋ก๋ฉ์ ํตํด ํ์ํ ํด๋์ค๋ค์ ๋ก๋ฉ ๋ฐ ๋งํฌ ํ์ฌ Runtime Data Area(์ค์ง์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์ ๊ด๋ฆฌํ๋ ์์ญ)์ ์ฌ๋ฆฐ๋ค.
(4) Runtime Data Area์ ๋ก๋ฉ ๋ ๋ฐ์ดํธ ์ฝ๋๋ Execution Engine์ ํตํด ํด์๋๋ค.
(5) ์ด ๊ณผ์ ์์ Execution Engine์ ์ํด Garbage Collector์ ์๋๊ณผ Thread ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ค
JVM ๊ตฌ์ฑ์์์ ์ญํ
- ํด๋์ค ๋ก๋(Class Loader)
- ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area)
- ์คํ ์์ง(Execution Engine)
- JNI - ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์ธํฐํ์ด์ค (Native Method Interface)
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Native Method Library)
ํด๋์ค ๋ก๋
ํด๋์ค ๋ก๋๋ JVM ๋ด๋ก ํด๋์ค ํ์ผ(.class)์ ๋์ ์ผ๋ก ๋ก๋ํ๊ณ , ๋งํฌ๋ฅผ ํตํด ๋ฐฐ์นํ๋ ์์ ์ ์ํํ๋ ๋ชจ๋
์ฆ, ๋ก๋๋ ๋ฐ์ดํธ ์ฝ๋(.class)๋ค์ ์ฎ์ด์ JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ธ Runtime Data Areas์ ๋ฐฐ์นํ๋ค.ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ๋ก๋ฉ ๊ธฐ๋ฅ์ ํ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์๊ณ , ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ๊ฒฝ์ฐ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๊ฒ ๋๋ค. (๋์ ๋ก๋ฉ)
ํด๋์ค ํ์ผ์ ๋ก๋ฉ ์์๋ ๋ค์๊ณผ ๊ฐ์ด 3๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ค. (Loading → Linking → Initialization)
๋ก๋ฉ
ํด๋์ค ํ์ผ์ JVM์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋, ๋ค์๊ณผ ๊ฐ์ ์์๋ค์ด ์๋ค.
- BootStrap ClassLoader: ์ต์์ ํด๋์ค๋ก๋, jre/lib/rt.jar์ ๋ด๊ธด JDK ํด๋์ค ํ์ผ์ ๋ก๋ฉํ๋ฉฐ Native C๋ก ๊ตฌํ๋์ด์๋ค.
- Extension ClassLoader: jre/lib/ext ๋๋ java.ext.dirs ํ๊ฒฝ ๋ณ์๋ก ์ง์ ๋ ํด๋์ ์๋ ํด๋์ค ํ์ผ์ ๋ก๋ฉํ๋ค.
Java9 ์ดํ Platform ClassLoader๋ก ๋ช ์นญ์ด ๋ณ๊ฒฝ๋จ. - Application ClassLoader: classpath๋ JAR ํ์ผ ์์ ์๋ Manifest ํ์ผ์ Class-Path ์์ฑ๊ฐ์ผ๋ก ์ง์ ๋ ํด๋์ ์๋ ํด๋์ค๋ฅผ ๋ก๋ฉํ๋ค. ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ๋์ ์ํด ์ง์ ์์ฑํ ๋๋ถ๋ถ์ ํด๋์ค๊ฐ ์ด ํด๋์ค๋ก๋์ ์ํด ๋ก๋ฉ๋๋ค.
Java9 ์ดํ System ClassLoader๋ก ๋ช ์นญ์ด ๋ณ๊ฒฝ๋จ., classpath, modulepath์ ์๋ ํด๋์ค๋ฅผ ๋ก๋ฉํ๋ค.
๋งํน
ํด๋์ค ํ์ผ์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฒ์ฆํ๋ ๊ณผ์
- Verifying(๊ฒ์ฆ) : ์ฝ์ด๋ค์ธ ํด๋์ค๊ฐ ์ ์ ํ์ง ๊ฒ์ฌํ๋ค. ๊ฒ์ฆ์ ์คํจํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- preparing(์ค๋น) : ํด๋์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
- Resolving(๋ถ์) : ํด๋์ค์ ์์ ํ ๋ด ๋ชจ๋ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ๋ค์ด๋ ํธ ๋ ํผ๋ฐ์ค๋ก ๋ณ๊ฒฝํ๋ค.
์ด๊ธฐํ
ํด๋์ค ๋ณ์๋ค์ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค. ๋ชจ๋ static ๋ณ์๋ค์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํ ๋นํ๊ณ , static block์ ์คํํ๋ค.
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ์ฝ๊ฒ ๋งํ๋ฉด JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฌํ๋ ์์ญ์ด๋ค.
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ์ ํฌ๊ฒ Method Area, Heap Area, Stack Area, PC Register, Native Method Stack๋ก ๋๋ ์ ์๋ค.
- ๋ฉ์๋ ์์ญ(=class area=static area): JVM์ด ์์๋ ๋ ์์ฑ๋๋ฉฐ, ๋ฐ์ดํธ ์ฝ๋(.class)๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ๋ฆด ๋ ์ด๊ธฐํ๋๋ ๋์์ ์ ์ฅํ๊ธฐ ์ํ ๊ณต๊ฐ์ด๋ค. ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ๋๋ค.
Field Info : ๋ฉค๋ฒ ๋ณ์์ ์ด๋ฆ, ๋ฐ์ดํฐ ํ์ , ์ ๊ทผ ์ ์ด์์ ์ ๋ณด
Method Info : ๋ฉ์๋ ์ด๋ฆ, return ํ์ , ํจ์ ๋งค๊ฐ๋ณ์, ์ ๊ทผ ์ ์ด์์ ์ ๋ณด
Type Info : Class ์ธ์ง Interface ์ธ์ง ์ฌ๋ถ ์ ์ฅ, Type์ ์์ฑ, ์ด๋ฆ Super Class์ ์ด๋ฆ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค.
- ํ ์์ญ: ํ๋ก๊ทธ๋จ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋์ ์ผ๋ก ํ ๋น๋๋ ์์ญ. new ์ฐ์ฐ์๋ก ์์ฑ๋๋ ํด๋์ค์ ์ธ์คํด์ค ๋ณ์, ๋ฐฐ์ด ๋ฑ์ด ์ ์ฅ๋จ. ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ , GC์ ๋์
- ์คํ ์์ญ: ์ค๋ ๋๋ง๋ค ์์ฑ๋๋ ์์ญ, int, log, boolean๋ฑ ๊ธฐ๋ณธ ์๋ฃํ๊ณผ ๊ฐ์ด ์์์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ณ์๋ ์ ๋ณด๋ค์ด ์คํ ํ๋ ์์ ํํ๋ก ์ ์ฅ๋๋ค. (์คํ ํ๋ ์์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๋ง๋ค์ด์ง๊ณ , ๋ฉ์๋ ํธ์ถ์ด ์ข ๋ฃ๋๋ฉด ์คํ์์ ์ ๊ฑฐ๋๋ค. ์คํ ํ๋ ์์๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด๊ฐ, ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฑ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ)
- PC Register: ํ์ฌ ์ํ์ค์ธ JVM ๋ช ๋ น์ด ์ฃผ์๋ฅผ ์ ์ฅํ๋ค. ์ค๋ ๋ ๋ง๋ค PC Register๋ฅผ ๊ฐ์ง. ์ด๋ Java ๋ฉ์๋์ ๋ํ ์์น๋ง ๊ธฐ๋ก
- Native Method Stack: native๋ก ์์ฑ๋ ๋ฉ์๋์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ณณ์ผ๋ก ์ค๋ ๋ ๋ง๋ค ์์ฑ. ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋, ์ค์ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํจ๋ค. ์๋ฐ ์ด์ธ์ ์ธ์ด๋ก ์์ฑ๋ native์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ๊ณต๊ฐ์ด๊ธฐ๋ ํ๋ค. JNI์๋ ์ฐ๊ฒฐ๋์ด ์๋ค.
์คํ ์์ง
์คํ ์์ง์ ํด๋์ค ๋ก๋๋ฅผ ํตํด ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ฐฐ์น๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํํ๋ ์์ญ์ด๋ค.
์ค๊ฐ ๋ ๋ฒจ๋ก ์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋(.class)๋ฅผ ์ค์ ๋ก JVM ๋ด๋ถ์์ ๊ธฐ๊ณ๊ฐ ์คํํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝํด์ค๋ค.- ์ธํฐํ๋ฆฌํฐ
- JIT ์ปดํ์ผ๋ฌ
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ
์ธ๊ฐ์ง์ ๊ตฌ์ฑ์์๋ฅผ ๊ฐ์ง๋ค. (์คํ ์์ง์ ์ธํฐํ๋ฆฌํฐ์ JIT ์ปดํ์ผ๋ฌ ๋ ๊ฐ์ง ๋ฐฉ์์ ํผํฉํ์ฌ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํ)
๊ฐ๋น์ง ์ปฌ๋ ํฐ (Garbage Collector, GC)
Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๋๋ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ์ํด ์ค๋ค.
C์ธ์ด ๊ฐ์ด ์ง์ ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํด์ผ ํ๋ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, JAVA๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ด์ฉํด ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์๊ฐ ์ต์ ํ ์์ผ์ค๋ค.
JNI(Java Native Interface)
์๋ฐ๊ฐ ๋ค๋ฅธ ์ธ์ด๋ก ๋ง๋ค์ด์ง ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํ๋ก๊ทธ๋จ
JNI๊ฐ ์ฌ์ฉ๋๋ฉด native mathod stack์ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์ ์ฌ๋๋ค.
Native Method Library
C, C++๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์นญํ๋ค.
๋ง์ผ ํค๋๊ฐ ํ์ํ๋ฉด JNI๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ฉํด ์คํํ๋ค.์ฐธ์กฐ
'๐ญ Study > : Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ch5 ์๋ฐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ OOP (ํด๋์ค, ๋ฉ์๋, ์๋ฐ ๋ณ์) (0) 2023.09.05 [Java] ch4 ์ ์ด๋ฌธ (0) 2023.08.31 [Java] ch3 ์๋ฐ์ ์๋ฃํ (Data type) ์ ๋ฆฌ (1) 2023.08.13 [Java] ch2 ์๋ฐ ์์ค์ฝ๋ ๊ตฌ์กฐ & ์๋ฃํ ์ข ๋ฅ (0) 2023.08.09 [Java] ch1 ์๋ฐ์ ํน์ง, JVM๊ณผ JIT ์ปดํ์ผ๋ฌ (0) 2023.08.09 ๋๊ธ