๐ป ์๋ฐ๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋ ๋ฐฐ๊ฒฝ
์๋ฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก C/C++๊ณผ ๋น์ทํ์ง๋ง C/C++์ ์ฌ์ฉํ๋ฉด์ ๋ํ๋๋ ๋ณต์กํ๊ณ ์์ ํ์ง ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ๋ค.
์ด๊ธฐ์ ์๋ฐ๊ฐ ์งํฅํ ๋ฐ๋ก๋ multiple host architecture ์ secure์ผ๋ก ํ ๋ฒ ์ฐ๊ณ ์ด๋ ๊ณณ์์๋ ์คํํ ์ ์๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค. (Write Once Run Anywhere)
์๋ฐ๋ก ๊ฐ๋ฐ๋ ํ๋ก๊ทธ๋จ์ CPU๋ ์ด์ ์ฒด์ ์ ์ข ๋ฅ์ ๊ด๊ณ์์ด JVM์ ์ค์นํ ์ ์๋ ์์คํ ์์ ์ด๋์๋ ์คํํ ์ ์์ผ๋ฉฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ฑ๊ณผ ๋ง์๋จ์ด์ ธ ํญ๋ฐ์ ์ธ ์ธ๊ธฐ๋ฅผ ๋๊ฒ ๋์๋ค.
๐ JVM์ด๋ ๋ฌด์์ธ๊ฐ?
- ์ ์ : ์๋ฐ ๊ฐ์ ๊ธฐ๊ณ(JVM : Java Virtual Machine)๋ก์ ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์ฃผ์ฒด
- ์ค๊ณ์ : ์ ์์ค ๊ณ ์ฌ๋ง(James Gosling)
- ๊ตฌ์ฑ : Class Loader, Excution Engine, Garbage Collector, Runtime Data Area
- ์ฅ์ : CPU๋ ์ด์์ฒด์ ์ข ๋ฅ์ ๋ฌด๊ดํ๊ฒ ์คํ์ด ๊ฐ๋ฅํ๋ค.(=ํ๋ซํผ ๋ ๋ฆฝ์ )
- ๋จ์ : ๋ค๋ฅธ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ธ์ด๋ณด๋ค๋ ์๋นํ ๋น ๋ฅธ ์ํ๋ฅ๋ ฅ์ ๋ณด์ด์ง๋ง, ์ผ๊ด ์ปดํ์ผ ๋ฐฉ์ ์ธ์ด๋ณด๋ค๋ ์ํ ์๋๊ฐ ๋๋ฆฌ๋ค.
++ ์ถ๊ฐ ๋ด์ฉ
JVM์ JAVA์ธ์ด์ ์ด๋ค ๊ฒ๋ ์์ง๋ชปํ๊ณ ๋ฐ์ดํธ์ฝ๋์ธ .class ํ์๋ง ์๊ณ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ Javaํ์ผ์ ๋ง๋ค๋ฉด, ์๋ฐ ์ปดํ์ผ๋ฌ๋ ์๋ฐ ์ธ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ฐ์ดํธ ์ฝ๋๋ผ๋ ํน์ํ ๋ฐ์ด๋๋ฆฌ ํํ(.class)๋ก ๋ณํํ๋ค. (.class ํ์ผ์๋ JVM ๋ช ๋ น์ด ๋๋ ๋ฐ์ดํธ ์ฝ๋์ ๊ธฐํธ ํ ๋ฐ ๊ธฐํ ๋ณด์กฐ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋ค.)
๐ JVM์ ํน์ง
- ์คํ ๊ธฐ๋ฐ์ ๊ฐ์ ๋จธ์
- ๋๋ค์์ ๋ช ๋ น์ด๊ฐ ์คํ ์ ๋์์ ํผ์ฐ์ฐ์๋ฅผ ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์คํ์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
- ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค
- ๊ธฐ๋ณธ ์๋ฃํ(primitive data type)์ ์ ์ธํ ๋ชจ๋ ํ์ (ํด๋์ค, ์ธํฐํ์ด์ค ๋ฑ)์ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ํตํด ์ฐธ์กฐํ๋ค.
- ๊ธฐ๋ณธ์๋ฃํ : boolean, char, byte, short, int, long, float, double
- ๊ฐ๋น์ง ์ปฌ๋ ์
- ์ฌ์ฉ์ ์ฝ๋๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑํ๊ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํด ์๋์ผ๋ก ํ๊ดด ๋๋ค.
- ๋ชจ๋ ๊ธฐ๋ณธ ์๋ฃํ์ ๋ช
ํํ๊ฒ ์ ์ํ์ฌ ํ๋ซํผ ๋
๋ฆฝ์ฑ ๋ณด์ฅ
- C/C++๋ฑ์ ์ธ์ด๋ ํ๋ซํผ์ ๋ฐ๋ผ intํ์ ํฌ๊ธฐ๊ฐ ๋ณํ๋ค.
- JVM์ ๊ธฐ๋ณธ ์๋ฃํ์ ๋ช ํํ๊ฒ ์ ์ํ์ฌ ํธํ์์ ์ ์งํ๊ณ ํ๋ซํผ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํ๋ค.
- ๋คํธ์ํฌ ๋ฐ์ดํธ ์ค๋
- ์๋ฐ ํด๋์ค ํ์ผ์ ๋คํธ์ํฌ ์ ์ก ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํธ ์ค๋์ธ ๋คํธ์ํฌ ๋ฐ์ดํธ ์ค๋๋ฅผ ์ฌ์ฉํ๋ค.
๐ JVM(Java Virtural Machine)์ ๊ตฌ์ฑ์์
- ํด๋์ค ๋ก๋ (Class Loader)
- ์ปดํ์ผ๋ฌ์ ์ํด ๋ง๋ค์ด์ง .class ํ์ผ์ Runtime Data Area๋ก ์ ์ฌํ๋ ์ญํ (=๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ์ญํ )์ ํ๋ค.
- loading, linking, initialization ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- loading : .classํ์ผ์ ์ฝ์ด์ Method Area์ ์ ์ฅํ๋ค. (ํด๋์ค/์ธํฐํ์ด์ค/Enum๊ณผ ๊ด๋ จ์ด ์๋์ง ํ์ธํ๊ณ , ๋ณ์/๋ฉ์๋/ํด๋์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.)
- linking : classํ์ผ์ ์ ํ์ฑ์ ๊ฒ์ฆ(์คํจํ๋ฉด ๋ฐํ์์๋ฌ)ํ๊ณ , ํด๋์ค ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ์ด๊ธฐํํ๋ค.
- initialization : static๋ณ์ ํ ๋น
- Runtime Data Area
- ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋์ ์ฌ์ฉ๋๋ ๋ค์ํ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ์ ์ํ๋ค.
- ๋ฐ์ดํฐ ์์ญ์ผ๋ก๋ Method, Heap, Stack, PC register, Native Method Stack์ด ์กด์ฌํ๋ค.
- Method Area : ๊ณต์ ๋ฆฌ์์ค๋ก ์ ์ ๋ณ์, ํด๋์ค ์ด๋ฆ, ๋ฉ์๋ ๋ฐ ๋ณ์ ์ ๋ณด ์ ์ฅ
- Heap Area : ๊ณต์ ๋ฆฌ์์ค๋ก ๋ชจ๋ ๊ฐ์ฒด์ ์ ๋ณด๊ฐ ์ ์ฅ
- Stack Area : ์ค๋ ๋๋ณ๋ก ์คํ์ด ์กด์ฌํ๋ฉฐ, ๋ก์ปฌ ๋ณ์ ์ ์ฅ
- PC register : ์ค๋ ๋์ ์คํ ๋ช ๋ น ์ฃผ์
- Execution Engine
- .class๋ฅผ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ์ค์ฉ ์ฝ์ผ๋ฉฐ ๋ช
๋ น์ด ๋จ์๋ก ์คํํ๋ค.
- Interprter ๋ฐฉ์ : ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ฝ๊ณ ํด์ํ๋ค.
- JIT ๋ฐฉ์ :
- .class๋ฅผ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ์ค์ฉ ์ฝ์ผ๋ฉฐ ๋ช
๋ น์ด ๋จ์๋ก ์คํํ๋ค.
- ๊ฐ๋น์ง ์ฝ๋ ํฐ (Garbage Collector)
- Heap๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ๊ฐ์ฒด๋ค ์ค ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค.
๐ ์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ
javac "ํด๋์ค ์ด๋ฆ.java"
์์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์์ฑํ๋ฉด ํด๋์ค ์ด๋ฆ.class(๋ฐ์ดํธํํ)๊ฐ ๋ง๋ค์ด์ง๋ค.
์๋ฐ์ ์ปดํ์ผ๋ฌ์ ์ญํ
- ์๋ฐ ์ธ์ด๋ฅผ JVM์ด ์ดํดํ๋ ์๋ฐ ๋ฐ์ดํธ์ฝ๋๋ก ๋ฒ์ญํ๋ค.
์๋ฐ์ ์ปดํ์ผ ๊ณผ์
- ๊ฐ๋ฐ์๋ค์ด ide๋ terminal ํ๊ฒฝ์์ .java ํ์ผ์ ์์ฑํ๋ค.
- build๋ผ๋ ์์ ์ ํตํด .class ํ์ผ์ ์์ฑํ๊ฒ ๋๋ค.
javac ์ต์
๐ ์คํํ๋ ๋ฐฉ๋ฒ
java ํด๋์ค์ด๋ฆ.class
classLoader๊ฐ class๋ฅผ Method Area๋ก ์ฌ๋ฆฌ๊ณ byte์ฝ๋๊ฐ ์ ํํ์ง ํ์ธํ ํ Execution Engine์์ ์คํ๋๋ค.
๐ ๋ฐ์ดํธ์ฝ๋๋ ๋ฌด์์ธ๊ฐ
์์ ๋งํ๋ฏ์ด JVM์ ํ๋ซํผ์ ์ข
์์ ์ด์ง ์๊ณ , ์ด๋ ๊ณณ์์๋ ๋์ํ ์ ์๋ค.
JVM์ด ํ๋ซํผ ์ข
์์ ์ด์ง ์๋ ๊ฐ์ฅ ํฐ ์ด์ ๊ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ด๋ค.
JVM์ด ์ดํดํ ์ ์๋ ์ธ์ด๋ก ๋ณํ๋ ๋ฐ์ดํธ ์ฝ๋๋ ์ฌ์ฉ์ ์ธ์ด์ธ ์๋ฐ์ ๊ธฐ๊ณ์ด ์ฌ์ด์ ์ค๊ฐ ์ธ์ด์ด๋ฉฐ, ์๋ฐ ์ฝ๋๋ฅผ ๋ฐฐํฌํ๋ ๊ฐ์ฅ ์์ ๋จ์์ด๋ค.
๐ JIT ์ปดํ์ผ๋ฌ? ์ด๋ป๊ฒ ๋์ํ ๊น?
JIT(Just In Time) ๊ฐ ๋์ค๊ฒ ๋ ๋ฐฐ๊ฒฝ
ํด๋์คํ์ผ์ ์คํํ๋ ๋ฐฉ๋ฒ์ผ๋ก Interpreter๋ฐฉ์์ด ์๋ค. ๊ทธ๋ฌ๋, ํ๋์ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๋ฒ ํธ์ถํ ๊ฒฝ์ฐ ๋งค๋ฒ ํด์์ด ํ์ํ์ฌ ์คํ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์๋ค.
์ด๋ฌํ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด/์ปดํ์ผ๋ฌ์ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด JIT์ปดํ์ผ๋ฌ๊ฐ ๋์๋ค.
JIT(Just In Time) ๋?
๋ฐ์ดํธ์ฝ๋ ์ ์ฒด(.class ํ์ผ)๋ฅผ ์ปดํ์ผํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํ๋ค.
์ธํฐํ๋ฆฌํฐ๊ฐ ๋ฐ๋ณต๋๋ ๋ฉ์๋ ํธ์ถ์ ๋ณผ ๋๋ง๋ค JIT ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ๋ถ๋ถ์ ๋ํด ์ง์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ ๊ณตํ์ฌ ์ฌํด์์ด ํ์ํ์ง ์์ผ๋ฏ๋ก ํจ์จ์ฑ์ด ํฅ์๋๋ค.
cf) ๋ค์ดํฐ๋ธ ์ธ์ด๋?
๐ JDK์ JRE์ ์ฐจ์ด
JDK(Java Developement kit)
์๋ฐ ํ๊ฒฝ์์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๋ฐ ํ์ํ ํด(JRE, ์ปดํ์ผ๋ฌ, ๋๋ฒ๊ฑฐ)๋ค์ ๋ชจ์๋ ์ํํธ์จ์ด ํจํค์ง
JRE(Java Runtime Environment)
JRE๋ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ํํ๊ธฐ ์ํ SW๋ผ๊ณ ๋ณผ ์ ์๋ค.
- ์๋ฐ ํ์ผ์ JVM์ผ๋ก ๋ก๋ฉ์ํค๋ ์ญํ
- JVM์ ์๋ฐํ์ผ์ ํด์ํด์ ์คํํ ์ ์๋ ์ํ๋ก ๋ง๋ค์ด์ค๋ค.
- jre๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ธฐ ์ํ ์ต์ํ๊ฒฝ = javaํ์ผ์ ์คํ๋ง ์ํฌ ๊ฒ์ด๋ผ๋ฉด jre๋ง ์์ด๋ ๊ฐ๋ฅํ๋ค.
- runtine environment์ ๋ค๋ฅธ ์ํํธ์จ์ด๋ฅผ ์คํํ๊ธฐ ์ํด ๊ณ ์๋๋ ์ผ์ข ์ ์ํํธ์จ์ด์
์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํด์
JDK๋ฅผ ํ์๋ก ์ค์นํด์ผํ๋ค.
์ถ์ฒ
- oracle JVM : docs.oracle.com/javase/specs/jvms/se7/html/jvms-1.html#jvms-1.1
- How JVM work : https://www.geeksforgeeks.org/jvm-works-jvm-architecture/
- JDK ์ JRE์ ์ฐจ์ด : https://www.geeksforgeeks.org/differences-jdk-jre-jvm/
- ์ํค๋ฐฑ๊ณผ ์๋ฐ : https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)
- ์ํค๋ฐฑ๊ณผ JVM : ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0
'LANGUAGE > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ์ ๊ทํํ์ (1) | 2021.09.11 |
---|---|
IntelliJ Console ํ๊ธ ๊นจ์ง - feat.error_Log (0) | 2020.05.12 |
Error ๋ก๊ทธ(์๋ฐ ์ปดํ์ผ error: unmappable character (0x90) for encoding x-windows-949) (0) | 2020.05.11 |
[JAVA] Queue(ํ)& Deque(๋ฑ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฆฌ (0) | 2020.05.11 |
[JAVA] ๊ธฐ๋ณธ ์ ์ถ๋ ฅ(Scanner vs BufferedReader ์ฐจ์ด) (0) | 2020.01.31 |