JVM
Java Virtual Machine
์๋ฐ ๊ฐ์ ๋จธ์
* ๊ฐ์ ๋จธ์ : ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ๋ฌผ๋ฆฌ์ ๋จธ์ ๊ณผ ์ ์ฌํ ๋จธ์ ์ ์ํํธ์จ์ด๋ก ๊ตฌํํ ๊ฒ
- JVM์ JAVA์ OS ์ฌ์ด์์ ์ค๊ฐ์ ์ญํ ์ ์ํํ์ฌ JAVA๊ฐ OS์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ฌ์ฌ์ฉ์ ๊ฐ๋ฅ์ผ ํด์ค๋ค.
- ๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ, Garbage collection์ ์ํํ๋ค.
- JVM์ ์คํ๊ธฐ๋ฐ์ ๊ฐ์๋จธ์ ์ด๋ฏ๋ก ์คํ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
์ ์๋ฐ ๊ฐ์๋จธ์ ์ ์์์ผํ ๊น?
ํ์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ด๊ธฐ ์ํด์์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์์ผ ํ๊ธฐ ๋๋ฌธ.
๋์ผํ ๊ธฐ๋ฅ์ ํ๋ก๊ทธ๋จ์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ข์ฐ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ด๋ฆฌ๊ฐ ๋์ง ์์ ๊ฒฝ์ฐ ์๋ ์ ํ ํ์์ด๋ ํ๊น ํ์๋ฑ์ด ์ผ์ด๋ ์ ์๋ค.
์๋ฐ ํ๋ก๊ทธ๋จ ์คํ๊ณผ์
1. ํ๋ก๊ทธ๋จ ์คํ์ JVM์ OS๋ก๋ถํฐ ์ด ํ๋ก๊ทธ๋จ์ด ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋๋ค.
JVM์ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฉ๋์ ๋ฐ๋ผ ์ฌ๋ฌ ์์ญ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ค.
2. ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฐ ์์ค์ฝ๋๋ฅผ ์ฝ์ด๋ค์ฌ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํ์ํจ๋ค. ( .java -> .class )
3. Class Loader๋ฅผ ํตํด class ํ์ผ๋ค์ JVM์ผ๋ก ๋ก๋ฉํ๋ค.
4. ๋ก๋ฉ๋ class ํ์ผ๋ค์ Execution engine์ ํตํด ํด์๋๋ค.
5. ํด์๋ ๋ฐ์ดํธ ์ฝ๋๋ runtime data areas์ ๋ฐฐ์น๋์ด ์ค์ง์ ์ธ ์ํ์ด ์ด๋ฃจ์ด์ง๋ค.
์ด๋ฌํ ์คํ๊ณผ์ ์์์ JVM์ ํ์์ ๋ฐ๋ผ Thread Synchronization๊ณผ GC ๊ฐ์ ๊ด๋ฆฌ์์ ์ํ
JVM ๊ตฌ์ฑ
Class Loader
JVM๋ด๋ก ํด๋์ค( .class ํ์ผ )๋ฅผ ๋ก๋ํ๊ณ ๋งํฌ๋ฅผ ํตํด ๋ฐฐ์นํ๋ ์์ ์ ์ํํ๋ ๋ชจ๋์ด๋ค. runtime ์์ ๋์ ์ผ๋ก ํด๋์ค๋ฅผ ๋ก๋ํ๋ค. jar ํ์ผ ๋ด ์ ์ฅ๋ ํด๋์ค๋ค์ JVM ์์ ํ์ฌํ๊ณ ์ฌ์ฉํ์ง ์๋ ํด๋์ค๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํ๋ค. (์ปดํ์ผ๋ฌ ์ญํ ) ์๋ฐ๋ ๋์ ์ฝ๋, ์ปดํ์ผ ํ์์ด ์๋๋ผ ๋ฐํ์์ ์ฐธ์กฐํ๋ค. ์ฆ, ํด๋์ค๋ฅผ ์ฒ์์ผ๋ก ์ฐธ์กฐํ ๋, ํด๋น ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ ๋งํฌํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ ์ญํ ์ ์ํํ๋ ๊ฒ์ด ํด๋์ค ๋ก๋๋ค.
Execution Engine
ํด๋์ค๋ฅผ ์คํ์ํค๋ ์ญํ ์ด๋ค. ํด๋์ค๋ก๋๊ฐ JVM ๋ด์ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ฐฐ์น์ํค๊ณ , ์ด๊ฒ์ ์คํ ์์ง์ ์ํด ์คํ๋๋ค. ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ ๊ธฐ๊ณ๊ฐ ๋ฐ๋ก ์ํํ ์ ์๋ ์ธ์ด๋ณด๋ค๋ ๋น๊ต์ ์ธ๊ฐ์ด ๋ณด๊ธฐ ํธํ ํํ๋ก ๊ธฐ์ ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์คํ ์์ง์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ค์ JVM ๋ด๋ถ์์ ๊ธฐ๊ณ๊ฐ ์คํํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝํ๋ค.
์ด๋ ๋๊ฐ์ง ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋๋ค.
Interpreter
์คํ ์์ง์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํํ๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ ๋จ์ ์ ๊ทธ๋๋ก ๊ฐ๊ณ ์๋ค.
ํ ์ค ์ฉ ์ํํ๊ธฐ ๋๋ฌธ์ ๋๋ฆฌ๋ค๋ ๊ฒ์ด๋ค.
JIT ( Just - In - Time )
์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋ JIT ์ปดํ์ผ๋ฌ๋ค.
์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ค๊ฐ ์ ์ ํ ์์ ์ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํ๊ณ , ์ดํ์๋ ๋์ด์ ์ธํฐํ๋ฆฌํ ํ์ง ์๊ณ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ง์ ์คํํ๋ ๋ฐฉ์์ด๋ค.
๋ค์ดํฐ๋ธ ์ฝ๋๋ ์บ์์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ปดํ์ผ๋ ์ฝ๋๋ ๋น ๋ฅด๊ฒ ์ํํ๊ฒ ๋๋ค.
๋ฌผ๋ก JIT์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ํ๋ ๊ณผ์ ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ธํฐํ๋ฆฌํ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ค๋๊ฑธ๋ฆฌ๋ฏ๋ก, ํ๋ฒ๋ง ์คํ๋๋ ์ฝ๋๋ผ๋ฉด ์ปดํ์ผํ์ง ์๊ณ ์ธํฐํ๋ฆฌํ ํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค.
๋ฐ๋ผ์ JIT์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ JVM๋ค์ ๋ด๋ถ์ ์ผ๋ก ํด๋น ๋ฉ์๋๊ฐ ์ผ๋ง๋ ์์ฃผ ์ํ๋๋์ง ์ฒดํฌํ๊ณ ์ผ์ ์ ๋๋ฅผ ๋์ ๋์๋ง ์ปดํ์ผ์ ์ํํ๋ค.
Garbage collector
GC๋ฅผ ์ํํ๋ ๋ชจ๋(thread)์ด ์๋ค.
Runtime Data Area
:ํ๋ก๊ทธ๋จ์ ์ํํ๊ธฐ ์ํด OS์์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
1. PC ๋ ์ง์คํฐ
Thread๊ฐ ์์๋ ๋ ์์ฑ๋๋ค.
์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํ๊ณ thread๊ฐ ์ด๋ค ๋ถ๋ถ์ ์ด๋ค ๋ช ๋ น์ผ๋ก ์คํํด์ผํ ์ง์ ๋ํ ๊ธฐ๋ก์ ํ๋ ๋ถ๋ถ์ผ๋ก ํ์ฌ ์ํ ์ค์ธ JVM ๋ช ๋ น์ ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
2. JVM ์คํ ์์ญ
ํ๋ก๊ทธ๋จ ์คํ๊ณผ์ ์์ ์์๋ก ํ ๋น๋์๋ค๊ฐ ๋ฉ์๋๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉด ๋ฐ๋ก ์๋ฉธ๋๋ ํน์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์ญ์ด๋ค. ๊ฐ์ข ํํ์ ๋ณ์๋ ์์ธ ๋ฐ์ดํฐ, ์ค๋ ๋๋ ๋ฉ์๋์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
๋ฉ์๋ ํธ์ถ ์๋ง๋ค ๊ฐ๊ฐ์ ์คํ ํ๋ ์(๊ทธ ๋ฉ์๋๋ง์ ์ํ ๊ณต๊ฐ)์ด ์์ฑ๋๋ค.
๋ฉ์๋ ์ํ์ด ๋๋๋ฉด ํ๋ ์ ๋ณ๋ก ์ญ์ ๋ฅผ ํ๋ค.
๋ฉ์๋ ์์์ ์ฌ์ฉ๋๋ ๊ฐ๋ค(local variable)์ ์ ์ฅํ๋ค.
๋ ํธ์ถ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฐ ์ฐ์ฐ ์ ์ผ์ด๋๋ ๊ฐ๋ค์ ์์๋ก ์ ์ฅํ๋ค.
3. Native method stack
์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ปดํ์ผ๋์ด ์์ฑ๋๋ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋, ์ค์ ์คํ๊ฐ๋ฅํ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ด๋ค. (JAVA๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ํ ๊ณต๊ฐ)
JAVA Native Interface๋ฅผ ํตํด ๋ฐ์ดํธ ์ฝ๋๋ก ์ ํํ์ฌ ์ ์ฅํ๊ฒ ๋๋ค.
์ผ๋ฐ ํ๋ก๊ทธ๋จ์ฒ๋ผ ์ปค๋์ด ์คํ์ ์ก์ ๋ ์์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ด๋ค.
์ด ๋ถ๋ถ์ ํตํด C code๋ฅผ ์คํ์์ผ ์ปค๋์ ์ ๊ทผํ ์ ์๋ค.
4. Metod Area = class area = static area
ํด๋์ค ์ ๋ณด๋ฅผ ์ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ๋ฆด ๋ ์ด๊ธฐํ ๋๋ ๋์์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค.
์ฌ๋ผ๊ฐ๊ฒ ๋๋ ๋ฉ์๋์ ๋ฐ์ดํธ ์ฝ๋๋ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๊ตฌ์ฑํ๋ ๋ฐ์ดํธ ์ฝ๋์ด๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ main ๋ฉ์๋์ ํธ์ถ์์๋ถํฐ ๊ณ์๋ ๋ฉ์๋์ ํธ์ถ๋ก ํ๋ฆ์ ์ด์ด๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ถ๋ถ ์ธ์คํด์ค์ ์์ฑ๋ ๋ฉ์๋ ๋ด์์ ๋ช ๋ นํ๊ณ ํธ์ถํ๋ค.
์ฌ์ค์ ์ปดํ์ผ ๋ ๋ฐ์ดํธ ์ฝ๋์ ๋๋ถ๋ถ์ด ๋ฉ์๋ ๋ฐ์ดํธ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ๋ชจ๋ ๋ฐ์ดํธ์ฝ๋๊ฐ ์ฌ๋ผ๊ฐ๋ค๊ณ ๋ด๋ ์๊ด ์๋ค.
์ด ๊ณต๊ฐ์๋ Runtime Constant Pool์ด๋ผ๋ ๋ณ๋์ ๊ด๋ฆฌ์์ญ์ด ์กด์ฌํ๋๋ฐ, ์ด๋ ์์ ์๋ฃํ์ ์ ์ฅํ์ฌ ์ฐธ์กฐํ๊ณ ์ค๋ณต์ ๋ง๋ ์ญํ ์ ์ํํ๋ค.
์ฌ๋ผ๊ฐ๋ ์ ๋ณด์ ์ข ๋ฅ
- field information : ๋ฉค๋ฒ ๋ณ์์ ์ด๋ฆ, ๋ฐ์ดํฐ ํ์ , ์ ๊ทผ ์ ์ด์์ ๋ํ ์ ๋ณด
- method information : ๋ฉ์๋์ ์ด๋ฆ, ๋ฆฌํด ํ์ , ๋งค๊ฐ๋ณ์, ์ ๊ทผ ์ ์ด์์ ๋ํ ์ ๋ณด
- type information : class์ธ์ง interface์ธ์ง์ ์ฌ๋ถ ์ ์ฅ, type์ด ์์ฑ, ์ ์ฒด ์ด๋ฆ, super class์ ์ ์ฒด ์ด๋ฆ
* method area = ํด๋์ค ๋ฐ์ดํฐ๋ฅผ ์ํ ๊ณต๊ฐ | heap ์์ญ = ๊ฐ์ฒด๋ฅผ ์ํ ๊ณต๊ฐ
heap๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก GC์ ๊ด๋ฆฌ ๋์์ ํฌํจ๋๋ค.
5. Heap
๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค. new ์ฐ์ฐ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
๋ฌผ๋ก class area ์์ญ์ ์ฌ๋ผ์จ ํด๋์ค๋ค๋ง ๊ฐ์ฒด๋ก ์์ฑํ ์ ์๋ค.
ํ์ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
- New/Young Generation
Eden : ๊ฐ์ฒด๋ค์ด ์ต์ด๋ก ์์ฑ๋๋ ๊ณต๊ฐ
Survivor 0/1 : Eden์์ ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ
- Old ์์ญ
new area์์ ์ผ์ ์๊ฐ ์ฐธ์กฐ๋๊ณ ์๋, ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ธ Eden ์์ญ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋์ฐจ๊ฒ๋๋ฉด ์ฒซ๋ฒ์งธ GC๊ฐ ๋ฐ์ํ๋ค. eden ์์ญ์ ์๋ ๊ฐ๋ค์ survivor 1 ์์ญ์ ๋ณต์ฌํ๊ณ ์ด ์์ญ์ ์ ์ธํ ๋๋จธ์ง ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค.
* ์ธ์คํด์ค๋ ์๋ฉธ ๋ฐฉ๋ฒ๊ณผ ์๋ฉธ ์์ ์ด ์ง์ญ ๋ณ์์๋ ๋ค๋ฅด๊ธฐ์ ํ์ด๋ผ๋ ๋ณ๋์ ์์ญ์ ํ ๋น ๋๋ค. JVM์ ๋งค์ฐ ํฉ๋ฆฌ์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์๋ฉธ์ํจ๋ค. ( ๋์ด์ ์ธ์คํด์ค์ ์กด์ฌ ์ด์ ๊ฐ ์์ ๋ ์๋ฉธ์ํจ๋ค )
- Permanent Generation
์์ฑ๋ ๊ฐ์ฒด๋ค์ ์ ๋ณด์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋ ๊ณต๊ฐ์ด๋ค.
class loader์ ์ํด ๋ก๋๋๋ class, method ๋ฑ์ ๋ํ meta ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๊ณ JVM์ ์ํด ์ฌ์ฉ๋๋ค.
reflection์ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํด๋์ค๊ฐ ๋ก๋ฉ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
๋ด๋ถ์ ์ผ๋ก reflection ๊ธฐ๋ฅ์ ์์ฃผ ์ฌ์ฉํ๋ spring framework๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ์ด ์์ญ์ ๋ํ ๊ณ ๋ ค๊ฐ ํ์ํ๋ค.
'๐ฅ > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] JVM ๋์ ์๋ฆฌ ๋ฐ ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2021.12.11 |
---|---|
[JAVA] ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ด๋? (0) | 2021.08.11 |
[JAVA] HashMap๊ณผ HashTable์ ์ฐจ์ด์ (0) | 2021.08.04 |
[JAVA] Hash๋? (0) | 2021.08.04 |