์ปดํ์ผ (Compile)
์์ค์ฝ๋๊ฐ ๊ธฐ๊ณ์ด๋ก ๋ณํ๋๋ ๊ณผ์ (์ปดํ์ผ๋ฌ javac๊ฐ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํ)
`.java` -> `.class`
๋ฐํ์ (Runtime)
ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ก ์คํ๋๋ ์๊ฐ
์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋๊ฐ JVM ์ ์ํด ์คํ๋๋ ์์
์ปดํ์ผ๊ณผ ๋ฐํ์์ ์ฐจ์ด์
์์ | ํ๋ก๊ทธ๋จ ์คํ ์ ์, ์ฝ๋ ์์ฑ ํ ์ปดํ์ผ ์์ ์ ๋ฐ์ | ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ฐ์ |
๋ชฉ์ | ์์ค ์ฝ๋์ ์ค๋ฅ๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ๊ณ , ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํ | ์ค์ ๋ก ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ๋์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌ |
์ค๋ฅ ์ฒ๋ฆฌ | ๋ฌธ๋ฒ ์ค๋ฅ, ํ์ ์ค๋ฅ, ์ฒดํฌ ์์ธ ๋ฏธ์ฒ๋ฆฌ ๋ฑ (์ปดํ์ผ ์ ๋ฐ์) | ๋ฐํ์ ์์ธ(๋ฐฐ์ด ์ธ๋ฑ์ค ์ด๊ณผ, null ์ฐธ์กฐ ๋ฑ) (์คํ ์ ๋ฐ์) |
์์ ์ค๋ฅ | ๊ตฌ๋ฌธ ์ค๋ฅ, ํ์ ์ค๋ฅ, ์ฒดํฌ ์์ธ ๋ฏธ์ฒ๋ฆฌ | NullPointerException, ArrayIndexOutOfBoundsException ๋ฑ |
์์ธ ์ฒ๋ฆฌ ๊ฐ์ ์ฌ๋ถ | ์ฒดํฌ ์์ธ๋ ๋ฐ๋์ ์ฒ๋ฆฌํด์ผ ํจ (try-catch ๋๋ throws) | ์์ธ ์ฒ๋ฆฌ ์ฌ๋ถ๊ฐ ๊ฐ์ ๋์ง ์์ (์ธ์ฒดํฌ ์์ธ) |
JVM(Java Virtual Machine) ๊ตฌ์กฐ
ํด๋์ค ๋ก๋(Class Loader)๊ฐ ์ปดํ์ผ๋ ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Areas)์ ๋ก๋ํ๊ณ
์คํ ์์ง(Execution Engine)์ด ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ค.
JVM ์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๊ตฌ์ฑ
(1) Class Loader (ํด๋์ค ๋ก๋)
์ปดํ์ผํ์์ด ์๋ ๋ฐํ์์ ํด๋์ค๋ฅผ ์ฒ์์ผ๋ก ์ฐธ์กฐํ ๋ ํด๋น ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ ๋งํฌํ๋ค. (= ๋์ ๋ก๋)
๋์ ๋ก๋๋ฅผ ๋ด๋นํ๋ ๋ถ๋ถ์ด๋ค.
* ๋์ ๋ก๋
ํ๋ก๊ทธ๋จ์ด ์คํ ์ค (๋ฐํ์)์ ํด๋์ค, ๋ฉ์๋, ๋ฆฌ์์ค ๋ฑ์ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ฑฐ๋ ํธ์ถํ๋ ๊ฒ
(์ ์ ๋ก๋๋ ์ปดํ์ผ ํ ๋ ๋ก๋๋จ)
(2) Runtime Data Area (๋ฐํ์ ๋ฐ์ดํฐ ์์ญ)
JVM ํ๋ก๊ทธ๋จ์ด ์ด์์ฒด์ ์ํด์ ์คํ๋๋ฉด์ ํ ๋น ๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ
6๊ฐ์ ์์ญ์ผ๋ก ๋๋ ์ ์์
(3) Execution Engine (์คํ ์์ง)
ํด๋์ค ๋ก๋๋ฅผ ํตํด JVM ๋ด ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ฐฐ์น๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํจ
๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํํ๋ค ( CPU ๋์๊ณผ ์ ์ฌ )
* ์ธํฐํ๋ฆฌํฐ
๋ฐ์ดํธ ์ฝ๋ ์ธ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ๋์ํ๋ฉฐ, ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ฝ์ด์ ํด์ํ๊ณ ์คํํ๊ธฐ ๋๋ฌธ์ ํ๋ํ๋์ ํด์์ ๋น ๋ฅด์ง๋ง ๊ฒฐ๊ณผ๊น์ง์ ์คํ์ ๋๋ฆฌ๋ค.
* JIT (Just-In-Time) ์ปดํ์ผ๋ฌ
๋ฐํ์ ์์ / ์ธํฐํ๋ฆฌํฐ ๋จ์ ์ ๋ณด์, ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํ ํ ์ ์ ํ ์์ ์ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผ ํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝ ํ ๋์ด์ ์ธํฐํ๋ฆฌ์ง ์์ด ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ง์ ์คํํ๋ ๋ฐฉ์
(๋ค์ดํฐ๋ธ ์ฝ๋๋ ์บ์์ ๋ณด๊ด๋์ด์, ํ ๋ฒ ์ปดํ์ผ ๋ ์ฝ๋๋ ๊ณ์ ๋น ๋ฅด๊ฒ ์ํ๋ ์ ์๊ฒ๋จ
JIT ์ปดํ์ผ ๋ฐฉ์์ ์ธํฐํ๋ฆฌํ ๋ณด๋ค ์ค๋๊ฑธ๋ฆฐ๋ค. ํ๋ฒ ์คํ์ ์ํ ์ฝ๋์ด๋ฉด ์ธํฐํ๋ฆฌํฐ๊ฐ ํจ์จ์ ์ด๋ค.
JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ JVM ์ ๋ฉ์๋์ ์ํ ์ ๋๋ฅผ ์ฒดํฌํ๊ณ ์ผ์ ์ ๋๊ฐ ๋์ ๋์๋ง ์ปดํ์ผ์ ์ํํ๋ค. )
(JAVA , .NET Framework, JavaScript ์์ ์ฌ์ฉ๋จ)
(+) ๋ค์ดํฐ๋ธ ์ปดํ์ผ๋ฌ
์ปดํ์ผ(๋น๋) ์์ / ์์ค ์ฝ๋๋ฅผ ์ง์ ๊ธฐ๊ณ์ด๋ก ๋ณํํ์ฌ ์คํํจ, ๋ฐ์ดํธ ์ฝ๋ ์์ด ๋ค์ด๋ ํธ๋ก ๊ธฐ๊ณ์ด๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ ์คํ ์๋๋ฅผ ๊ทน๋ํ ํ๋ค. ํ์ง๋ง ํ๋ซํผ์ ์ข ์์ ์ด๋ค. ํน์ ์ด์์ฒด์ ์์๋ง ์คํ ๊ฐ๋ฅํจ
( C, C++, Rust , Go ์์ ์ฌ์ฉ๋จ)
๋ค์ดํฐ๋ธ ์ปดํ์ด๋ฌ / ๋ฐ์ดํธ์ฝ๋ ์ปดํ์ผ๋ฌ
์ถ๋ ฅ ์ฝ๋ | ๊ธฐ๊ณ์ด ์ฝ๋(Binary) | ๋ฐ์ดํธ์ฝ๋(Bytecode) |
์คํ ๋ฐฉ์ | ์ง์ ์คํ ๊ฐ๋ฅ | ๊ฐ์ ๋จธ์ (JVM ๋ฑ)์์ ์คํ |
์๋ | ๋น ๋ฆ | ์ค๊ฐ ๋จ๊ณ ์ฒ๋ฆฌ๋ก ์๋์ ์ผ๋ก ๋๋ฆผ |
์ด์ ์ฒด์ ์์กด์ฑ | OS ๋ฐ CPU ์ํคํ ์ฒ์ ์ข ์ | ํ๋ซํผ ๋ ๋ฆฝ์ (๊ฐ์ ๋จธ์ ์ฌ์ฉ) |
(4) Garbage Collector
- Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด๋ค ์ค ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ ์ญํ ์ ํจ.
- GC์ ๋ฐ์์ ์ ํด์ ธ์์ง ์์์ ์ธ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฆฌํ๋์ง ์ ์ ์๋ค.
- ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ๋งค๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ ์ ์์
1. ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง : ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ์ ํ, ๋น์ ์ ์ข ๋ฃ ๋ฑ ๋ฐฉ์ง
2. ์์ ์ฑ ์ฆ๊ฐ : ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฐฉ์ง.
3. ์์ฐ์ฑ ํฅ์ : ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฝ๋ ์์ฑ ๋ถํ์.
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ข ๋ฅ๋ ์ด๋ ๋ค.
๋ ์ง์คํฐ(CPU ์), ์บ์๋ฉ๋ชจ๋ฆฌ(CPU ์ RAM ์ฌ์ด ์์น), ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ(RAM) , ๋ณด์กฐ๊ธฐ์ต์ฅ์น(HDD, SSD)
์ฌ๊ธฐ์ ์ฃผ๋ก ๋ณผ๊ฒ์ ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด RAM ์ ํ ๋น๋๋ค.
Stack : LIFO ๋ฐฉ์, ๋ฉ์๋์ ์ง์ญ ๋ณ์, ์ฐธ์กฐ ๋ณ์ , ํจ์ํธ์ถ์ ํจ์์ ์ ๋ณด๋ค์ด ์คํ์ ์์ด๊ณ ์ข ๋ฃ๋๋ฉด ์ ๊ฑฐ
Heap : ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ญ, ํ ๋ฉ๋ชจ๋ฆฌ๋ ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ์ (์ฌ์ฉ์ด ๋๋๋ฉด ํด์ ํด์ค์ผํจ)
Code : ์ฝ๊ธฐ ์ ์ฉ(Read-only) ๊ฐ๋ฐ์๊ฐ ์์ฑํ ํ๋ก๊ทธ๋จ ํจ์ (main ํจ์ ์ฝ๋ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ ๋ฑ๋ฑ..)
Data : ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ๊ณต๊ฐ ( ์ ์ญ๋ณ์, static ๋ณ์ , ์ ์ ๋ณ์ )
๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์๋์ผ๋ก ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ ํ๋ก์ธ์ค์
๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋์ ์ฌ์ฉํ๋ JAVA, JavaScript ๋ฑ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํจ (์์ ๋ญ๋น ๋ฐฉ์ง)
Mark-Sweep | ์ด์์๋ ๊ฐ์ฒด๋ฅผ ํ์ ํ ์ ๊ฑฐ | ๋น ๋ฅธ GC ์ํ ๊ฐ๋ฅ | ๋ฉ๋ชจ๋ฆฌ ๋จํธํ ๋ฐ์ |
Mark-Sweep-Compact | ๊ฐ์ฒด ์ ๋ฆฌ ํ ๋ฉ๋ชจ๋ฆฌ ์์ถ | ๋ฉ๋ชจ๋ฆฌ ๋จํธํ ๋ฐฉ์ง | Compact ๊ณผ์ ์ผ๋ก ์ถ๊ฐ ๋น์ฉ ๋ฐ์ |
Generational Garbage Collection : ์๋ก์์ฑ๋๊ฒ์ young generation , ์๊ฐ์ด ์ง๋๋ฉด old ๋ก ์ด๋ ( ๊ฐ์ฒด๋ฅผ ๋ ์ข ๋ฅ๋ก ๊ตฌ๋ถํ์ฌ์ ๊ด๋ฆฌํจ)
๊ฐ๋น์ง์ปฌ๋ ์ ์ ๋ฐ๋ก System.jc() ๋ก ํธ์ถํ ์๋ ์์ง๋ง ์ด์ฐจํผ ์๋์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ๋๋ฌธ์ ๊ถ์ฅํ์ง ์๋๋ค.
๐๊ธฐ๋ณธ ๋ฐ์ดํฐํ์ , ๋ณ์๋ค์ stack ์ ํ ๋นํ๋ค.
์ปดํ์ผ ์์ ์ ํ ๋น
๋ฉ์๋๊ฐ ์คํ๋์๋ง ์กด์ฌ / ํธ์ถ์ด ๋๋๋ฉด ํด์ ๋จ
public void method() {
int a = 10; // ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ Stack์ ํ ๋น
SomeClass obj = new SomeClass(); // ์ฐธ์กฐ ๋ณ์๋ Stack์ ํ ๋น
}
๐ ๊ฐ์ฒด, ๋ฐฐ์ด์ Heap ์ ํ ๋นํ๋ค.
๋ฐํ์ ์์ ์ ํ ๋น
๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋๋ ๋์์ ์กด์ฌ / ์ฐธ์กฐ๊ฐ ๋์ด์ง๋ฉด ์๋์ผ๋ก ํด์ ๋จ
public void method() {
SomeClass obj = new SomeClass(); // ๊ฐ์ฒด๋ Heap์ ํ ๋น
}
int[] numbers = new int[10]; // ๋ฐฐ์ด์ Heap์ ํ ๋น
https://d2.naver.com/helloworld/1230
https://blog.naver.com/rokey_89/221658053244
https://f-lab.kr/insight/java-compilation-process-jvm-20240806