์๋ฐ๋ OS์ ๋ ๋ฆฝ์ ์ธ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
JVM์ด OS์ ํ๋ก๊ทธ๋จ์ ์ฌ์ด์์ ๊ธฐ๊ณ์ด๋ก ํ์์ป์ฃผ๋ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
JVM JAVA Virtual Machine
์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ๋ณํ
์คํ๊ธฐ๋ฐ์ ๊ฐ์ ๋จธ์
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ GC๋ฅผ ์ํ
์๋ฐ ์ฝ๋์ ์คํ ๊ณผ์
1. ๊ฐ๋ฐ์๊ฐ ์๋ฐ์ฝ๋๋ฅผ ์์ฑํ๋ค.
2. ( .java ) ์ธ ํ์ผ์ ์๋ฐ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ก ์ปดํ์ผํ๋ค.
3. ์ปดํ์ผ ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ JVM์ Class Loader์ ์ ๋ฌํ๋ค.
4. Class Loader๋ ๋์ ๋ก๋ฉ์ ํตํด ํ์ ํด๋์ค๋ค์ ๋ก๋ฉ ๋ฐ ๋งํฌํ์ฌ Runtime Data Area์ ์ฌ๋ฆฐ๋ค. (JVM์ ๋ฉ๋ชจ๋ฆฌ)
5. ์คํ ์์ง์ JVM๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์จ ๋ฐ์ดํธ ์ฝ๋๋ค์ ๋ช ๋ น์ด ๋จ์๋ก ํ๋์ฉ ๊ฐ์ ธ์์ ์คํํ๋ค.
JVM
Class Loader + Runtime Data Areas + Execution Engine
Class Loader ํน์ง
1. ๊ณ์ธต ๊ตฌ์กฐ
ํด๋์ค ๋ก๋๋ ์ฌ๋ฌ ํด๋์ค ๋ก๋๋ผ๋ฆฌ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ด๋ฃจ์ด ๊ณ์ธต์ ์ธ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค.
- ๋ถํธ์คํธ๋ฉ ํด๋์ค ๋ก๋ Bootstrap Class Loader
- ์ต์์ ํด๋์ค๋ก๋, ์ ์ผํ๊ฒ JAVA๊ฐ ์๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๊ตฌํ
- JVM์ด ์คํ๋ ๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ
- Object ํด๋์ค๋ฅผ ๋น๋กฏํ์ฌ JAVA API๋ค์ ๋ก๋ํจ
- ์ต์คํ
์
ํด๋์ค ๋ก๋ Extension Class Loader
- ๊ธฐ๋ณธ JAVA API๋ฅผ ์ ์ธํ ํ์ฅ ํด๋์ค๋ค์ ๋ก๋ํจ - ๋ค์ํ ๋ณด์ ํ์ฅ ๊ธฐ๋ฅ ๋ก๋
- ์์คํ
ํด๋์ค ๋ก๋ System Class Loader
- (๋ถํธ ์คํธ๋ฉ๊ณผ ์ต์คํ ์ ํด๋์ค๋ก๋๊ฐ JVM ์์ฒด์ ๊ตฌ์ฑ ์์๋ค์ ๋ก๋ํ๋ค) ์์คํ ํด๋์ค ๋ก๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ํด๋์ค๋ค์ ๋ก๋ํจ
- ์ฌ์ฉ์๊ฐ ์ง์ ํ $CLASSPATH ๋ด์ ํด๋์ค๋ค์ ๋ก๋ํจ
- ์ฌ์ฉ์ ์ ์ ํด๋์ค ๋ก๋ User-Defined Class Loader
- ์ดํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์๊ฐ ์ง์ ์ฝ๋ ์์์ ์์ฑํ์ฌ ์ฌ์ฉํ๋ ํด๋์ค ๋ก๋
- WAS์ ๊ฐ์ ํ๋ ์์ํฌ๋ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๊ฒ ํ๊ธฐ ์ํด์ ์ด๋ฅผ ์ํด ์ฌ์ฉ์ ์ ์ ํด๋์ค ๋ก๋๋ค์ ์ฌ์ฉํ์ฌ ํด๋์ค ๋ก๋์ ์์ ๋ชจ๋ธ์ ํตํด ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํจ
2. ์์๋ชจ๋ธ
์ฒ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋๊ฒจ๋ฐ์ ํด๋์ค๋ก๋.
ํ์ํ ํด๋์ค๋ฅผ ๋ก๋ํ ๋ ํน์ ์คํ ์์ง์์ ๋ช ๋ น์ด ๋จ์๋ก ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ๋ค๊ฐ ์ฒ์์ผ๋ก ์ฐธ์กฐํ๋ ํด๋์ค์ ๋ํด ํด๋์ค ๋ก๋์๊ฒ ๋ก๋๋ฅผ ์์ฒญํ ๋.
๋ก๋๋ฅผ ์์ฒญ๋ฐ์ ํด๋์ค ๋ก๋๋ ๋ค์ ์์๋๋ก ์์ฒญ๋ฐ์ ํด๋์ค๊ฐ ์๋์ง ํ์ธํจ
- ํด๋์ค ๋ก๋ ์บ์
- ์์ ํด๋์ค ๋ก๋
- ์๊ธฐ ์์
์ด์ ์ ๋ก๋๋ ํด๋์ค์ธ์ง ํด๋์ค ๋ก๋ ์บ์๋ฅผ ํ์ธํ๋ค.
์๋ค๋ฉด ์์ ํด๋์ค ๋ก๋๋ฅผ ํ๋์ฉ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ํ์ธํ๋๋ฐ, ์ด ๋ ์ฌ๋ผ๊ฐ๋ ๋์ค์ ํด๋์ค๋ฅผ ๋ฐ๊ฒฌํ๋๋ผ๋ ๋ถํธ ์คํธ๋ฉ ํด๋์ค ๋ก๋(์ต์๋จ ๋ก๋)๊น์ง ํ์ธ์ ํด์ ๋ถํธ ์คํธ๋ฉ ํด๋์ค ๋ก๋์๋ ํด๋น ํด๋์ค๊ฐ ์กด์ฌํ๋ค๋ฉด ๊ทธ ํด๋์ค๋ฅผ ๋ก๋ํ๊ฒ ๋๋ค.
3. ๊ฐ์์ฑ ์ ํ
ํด๋์ค ๋ก๋๊ฐ ํด๋์ค ๋ก๋๋ฅผ ์์ฒญ๋ฐ์์ ๋ ์์ ๋ชจ๋ธ์ ์ํด์ ํด๋์ค ๋ก๋ ์บ์๋ฅผ ํ์ธํ๊ณ ์์ผ๋ฉด ์์ ํด๋์ค ๋ก๋๋ฅผ ํ์ธํ๋ค. ์ด๋ ํ์ ํด๋์ค๋ ํ์ธ์ด ๋ถ๊ฐ๋ฅํ ํน์ฑ์ด ๋ฐ๋ก ๊ฐ์์ฑ ์ ํ์ด๋ค.
4. ์ธ๋ก๋ ๋ถ๊ฐ
ํด๋์ค๋ฅผ ๋ก๋ํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง ๊ทธ ๋ฐ๋๋ก unloadํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
5. ์ด๋ฆ ๊ณต๊ฐ
๋ค์ ์คํ์ด์ค๋ ๊ฐ ํด๋์ค ๋ก๋๋ค์ด ๊ฐ์ง๊ณ ์๋ ๊ณต๊ฐ์ผ๋ก ๋ก๋๋ ํด๋์ค๋ฅผ ๋ณด๊ดํ๋ ๊ณต๊ฐ
์์ ๋ชจ๋ธ์ ํตํด์ ์์ ํด๋์ค ๋ก๋๋ค์ ํ์ธํด์ผํ ๋ ํ์ธํ๋ ๊ณต๊ฐ์ด ๋ฐ๋ก ์ด๋ฆ ๊ณต๊ฐ
๋ค์ ์คํ์ด์ค์ ๋ณด๊ด๋๋ ๊ธฐ์ค์ FQCN Fully Qualified Class Name ์ผ๋ก ํจํค์ง ๋ช ๊น์ง ํฌํจ๋์ด์๋ ์๋ณ์๋ฅผ ๋ปํ๋ค.
๊ฐ๊ฐ์ ํด๋์ค ๋ก๋๊ฐ ๊ฐ์ ๋ค์ ์คํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ FQCN์ด ๊ฐ์ ํด๋์ค๋ผ๋ ๋ค์์คํ์ด์ค๊ฐ ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ํด๋์ค๋ก ๊ฐ์ฃผํ๋ค. ( ์ด ๊ธฐ๋ฅ์ ํตํด ๋ก๋ํ ํด๋์ค ๋ก๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ธ๋ก๋์ ํจ๊ณผ๋ฅผ ์ค ์ ์๋ค. )
ํด๋์ค ๋ก๋ ๊ณผ์
1. ๋ก๋ - ํด๋์ค ํ์ผ์ ๊ฐ์ ธ์์ JVM์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค.
2. ๊ฒ์ฆ - ํด๋์ค ๋ก๋ ์ ๊ณผ์ ์ค์์ ๊ฐ์ฅ ๋ณต์กํ๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ณผ์ ์ผ๋ก, ์ฝ์ด๋ค์ธ ํด๋์ค๊ฐ ์๋ฐ ์ธ์ด ๋ช ์ธ ๋ฐ JVM ๋ช ์ธ์ ๋ช ์๋ ๋๋ก ๊ตฌ์ฑ๋์ด ์๋์ง ๊ฒ์ฌํ๋ค.
3. ์ค๋น - ํด๋์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
4. ๋ถ์ - ํด๋์ค์ ์์ ํ ๋ด ๋ชจ๋ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ๋ค์ด๋ ํธ ๋ ํผ๋ฐ์ค๋ก ๋ณ๊ฒฝํ๋ค.
5. ์ด๊ธฐํ - ํด๋์ค ๋ณ์๋ค์ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค. (static ํ๋๋ค์ ์ค์ ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ )
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ Runtime Data Area
JVM์ด OS ์์์ ์คํ๋๋ฉด์ ํ ๋น๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ๋ฐ๋ก ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ด๋ค.
์ด ์์ญ์ ํฌ๊ฒ 5๊ฐ์ง, ์ธ๋ถํ์ 6๊ฐ์ง๋ก ๋๋ ๋ณผ ์ ์๋ค.
PC ๋ ์ง์คํฐ, JVM ์คํ, ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์์ฑ๋๊ณ
ํ, ๋ฉ์๋ ์์ญ์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํด์ ์ฌ์ฉ๋๋ค.
- PC ๋ ์ง์คํฐ
- Program Counter ๋ ์ง์คํฐ๋ ํ์ฌ ์ํ ์ค์ธ ๋ช ๋ น์ ์ฃผ์๋ฅผ ๊ฐ์ง๋ฉฐ ์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ฉฐ, ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํจ
- JVM ์คํ
- ์คํ ํ๋ ์์ด๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ฅํ๋ ์คํ
- ์์ธ ๋ฐ์ ์ printStackTrace( ) ๋ฉ์๋๋ก ๋ณด์ฌ์ฃผ๋ Stack Trace์ ๊ฐ ๋ผ์ธ ํ๋๊ฐ ์คํ ํ๋ ์์ ํํํจ
- ์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ฉฐ ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํจ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ
- ์๋ฐ ์ธ์ ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ์คํ
- JAVA Native Interface๋ฅผ ํตํด ํธ์ถํ๋ C/C++ ๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ์คํ์ผ๋ก, ์ธ์ด์ ๋ง๊ฒ ์คํ ์์ฑ
- ํ
- ์ธ์คํด์ค ๋๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- Garbage Collection์ ๋์
- JVM ์ฑ๋ฅ ๋ฑ์ ์ด์์์ ๊ฐ์ฅ ๋ง์ด ์ธ๊ธ๋๋ ๊ณต๊ฐ
- ํ ๊ตฌ์ฑ ๋ฐฉ์์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฐฉ๋ฒ ๋ฑ์ JVM ๋ฒค๋๋ค์ ์ฌ๋
- ๋ฉ์๋ ์์ญ
- ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ
- JVM์ด ์์๋ ๋ ์์ฑ๋๋ค.
- JVM์ด ์ฝ์ด ๋ค์ธ ๊ฐ๊ฐ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ํ ๋ฐํ์ ์์ ํ, ํ๋์ ๋ฉ์๋์ ๋ํ ์ ๋ณด, static ๋ณ์, ๋ฉ์๋์ ๋ฐ์ดํธ ์ฝ๋๋ค์ ๋ณด๊ดํจ
- ๋ฐํ์ ์์ ํ
- JVM ๋์์์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ์ญํ ์ ์ํํ๋ ๊ณณ
- ๊ฐ ํด๋์ค์ ์ธํฐํ์ด์ค์ ์์ ๋ฟ๋ง ์๋๋ผ, ๋ฉ์๋์ ํ๋์ ๋ํ ๋ชจ๋ ๋ ํผ๋ฐ์ค๊น์ง ๋ด๊ณ ์๋ ํ ์ด๋ธ
- ์ด๋ค ๋ฉ์๋๋ ํ๋๋ฅผ ์ฐธ์กฐํ ๋ JVM์ ๋ฐํ์ ์์ ํ์ ํตํด ํด๋น ๋ฉ์๋๋ ํ๋์ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์ฐพ์์ ์ฐธ์กฐํ๋ค.
์คํ ์์ง Execution Engine
์คํ ์์ง์ ํด๋์ค ๋ก๋๋ฅผ ํตํด ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ฐฐ์น๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํ
๋ฐ์ดํธ ์ฝ๋์ ๊ฐ ๋ช ๋ น์ด๋ 1๋ฐ์ดํธ ํฌ๊ธฐ์ OpCode์ ์ถ๊ฐ ํผ์ฐ์ฐ์๋ก ์ด๋ค์ ธ์์
์คํ ์์ง์ ํ๋์ OpCode๋ฅผ ๊ฐ์ ธ์์ ํผ์ฐ์ฐ์์ ์์ ์ ์ํํ ๋ค์ OpCode๋ฅผ ์ํํ๋ ์์ผ๋ก ๋์ํ๋ค.
์ด ์ํ ๊ณผ์ ์์ ์คํ ์์ง์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ๊ฐ ์คํํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝํ๋๋ฐ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- ์ธํฐํ๋ฆฌํฐ
- ๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ฝ์ด์ ํด์ํ๊ณ ์คํํ๋ค. ํ๋ํ๋์ ํด์์ ๋น ๋ฅด์ง๋ง ์ ์ฒด์ ์ธ ์คํ ์๋๋ ๋๋ฆฌ๋ค๋ ๋จ์ ์ ๊ฐ์ง๋ค.
- JVM ์์์ ๋ฐ์ดํธ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
- JIT ์ปดํ์ผ๋ฌ Just-In-Time
- ์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋ ๋ฐฉ์
- ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํ๊ณ , ์ดํ์๋ ํด๋น ๋ฉ์๋๋ฅผ ๋์ด์ ์ธํฐํ๋ฆฌํ ํ์ง ์๊ณ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ง์ ์คํํ๋ ๋ฐฉ์
- ์ ์ฒด์ ์ธ ์คํ ์๋๋ ์ธํฐํ๋ฆฌํ ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค ( ๋ค์ดํฐ๋ธ ์ฝ๋๋ ์บ์์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ปดํ์ผ๋ ์ฝ๋๋ ์บ์์์ ๋ฐ๋ก ๊บผ๋ด์ด ์คํํด ๋น ๋ฅด๊ฒ ์ํ๋๋ค )
- ํ์ง๋ง JIT ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ๋ ๊ณผ์ ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ๋์ฉ ์ธํฐํ๋ฆฌํ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ JVM์ ํด๋น ๋ฉ์๋๊ฐ ์ผ๋ง๋ ์์ฃผ ํธ์ถ๋๊ณ ์คํ๋๋ ์ง๋ฅผ ์ฒดํฌํ๊ณ , ์ผ์ ๊ธฐ์ค์ ๋์์ ๋๋ง JIT ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์ปดํ์ผ ํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ฐธ์กฐ
'๐ฅ > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ด๋? (0) | 2021.08.11 |
---|---|
[JAVA] ์๋ฐ๊ฐ์๋จธ์ , JVM์ด๋? (0) | 2021.08.11 |
[JAVA] HashMap๊ณผ HashTable์ ์ฐจ์ด์ (0) | 2021.08.04 |
[JAVA] Hash๋? (0) | 2021.08.04 |