[Become a Java-Masta๐จโ๐ซ 1์ฃผ์ฐจ] JVM๊ณผ ์๋ฐ ์ฝ๋
๐ฏ ๋ชฉํ
์๋ฐ ์์ค ํ์ผ(.java)์ JVM์ผ๋ก ์คํํ๋ ๊ณผ์ ์ดํดํ๊ธฐ.
๐ ํ์ตํ ๊ฒ
- JVM์ด๋ ๋ฌด์์ธ๊ฐ
- ์ปดํ์ผ ํ๋ ๊ณผ์
- ์ปดํ์ผ ๋ฐ ์คํํ๋ ๋ฐฉ๋ฒ
- ๋ฐ์ดํธ์ฝ๋๋ ๋ฌด์์ธ๊ฐ
- JIT ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ๋์ํ๋์ง
- JVM ๊ตฌ์ฑ ์์
- JDK์ JRE์ ์ฐจ์ด
๐ก JVM์ด๋ ๋ฌด์์ธ๊ฐ
์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ Windows ๋๋ Linux์ ๊ฐ์ ์ด์์ฒด์ ์์์ ์คํ์ด ๋๋ค. ์ฆ, ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์คํ์ด ๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด์ด๋ฏ์ด ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ํ๋์จ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด์์ฒด์ ๊ฐ ๋์์ ํ๊ณ , ๊ทธ ์์์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ตฌ์กฐ์ด๋ค.
๊ทธ๋ฌ๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์๋์ ๊ฐ์ด ์ผ๋ฐ ํ๋ก๊ทธ๋จ๊ณผ๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ก ์คํ์ด ๋๋ค.
๊ทธ๋ฆผ์ ๋ณด์๋ฏ์ด ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ผ๋ฐ ํ๋ก๊ทธ๋จ๊ณผ ๋น๊ตํด์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ด์์ฒด์ ์ ์๋ฐ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ์๋ฐ ๊ฐ์๋จธ์ (JVM)์ด ์กด์ฌํ๋ ์ ์ด๋ค.
์ฆ ์ด์์ฒด์ ๊ฐ ๋ฐ๋ก ํ๋ก๊ทธ๋จ์ผ ์คํ์ํค๋ ๊ฒ์ด ์๋๋ผ, ์ด์์ฒด์ ๋ JVM์ ์คํํ๊ณ JVM์ด ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ๊ตฌ์กฐ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด JVM์ ๋ฌด์์ด๋ฉฐ, ์๋ฐ ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ ํ๋ก๊ทธ๋จ๊ณผ ๊ฐ์ด ์ด์์ฒด์ ๊ฐ ์ง์ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด์ง ์๊ณ ์ JVM ์์์ ๋์ํ๋ ๊ฒ์ธ๊ฐ?
์ผ๋จ JVM๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด์์ฒด์ ์์์ ๋์ํ๋ ์ํํธ์จ์ด์ด๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์ํํธ์จ์ด์ธ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ์๋ฐ ํ๋ก๊ทธ๋จ์ด JVM ์์์ ๋์ํ๋ ๊ตฌ์กฐ์ ์ด์ ๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์ด์์ฒด์ ์ ์๊ด์์ด ๋์์ํค๊ธฐ ์ํจ ์ด๋ค.
ํ๋ก๊ทธ๋จ์ ์ด์์ฒด์ ์ ๋ฐ๋ผ์ ๋ฌ๋ฆฌ ๊ตฌํ๋์ด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๊ฐ ๋
ธ์
์ด๋ผ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ด๋ฐ์ ๋, ์ด์์ฒด์ ๊ฐ Windows์ธ์ง Mac์ธ์ง ๊ตฌ๋ถํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ค์ด๋ฐ๋๋ค.
Windows์์ ๋์ํ๋๋ก ๊ตฌํ๋ ๋
ธ์
์ ๋ค์ด๋ฐ์ผ๋ฉด ์ ๋ Mac์์ ์ค์นํ ์ ์๋ค.
๋ฐ๋ผ์ ๋์ผํ ๊ธฐ๋ฅ์ ๋ ธ์ ์ด๋ผ ํ ์ง๋ผ๋ Mac์์ ๋์์ ์ํค๋ ค๋ฉด Mac์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ๊ตฌํํด์ฃผ์ด์ผ ํ๋ค.
์ ์ด์์ฒด์ ์ ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ์ ๋ฌ๋ฆฌ ๊ตฌํํด์ผ ํ ๊น?
๊ฐ๋ฐ ์ธ์ด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด ์๋๋ผ, ์ธ์ด๊ฐ ๋์ผํ ์ง๋ผ๋ ์ด์์ฒด์ ์ ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐฉ์ ์์ฒด๊ฐ ๋ค๋ฅธ ์ผ๋ถ ๊ธฐ๋ฅ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด์ ๊ทธ๋ํฝ, ํค๋ณด๋, ๋ง์ฐ์ค ๊ฐ์ ํ๋์จ์ด IO ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ์ด์์ฒด์ ์ ์ํด ์ ๊ณต๋๊ธฐ ๋๋ฌธ์, ์ด์์ฒด์ ๊ฐ ๋ฌ๋ผ์ง๋ฉด ๊ฐ๋ฐ ์ธ์ด์ ์๊ด์์ด ๊ธฐ๋ฅ์ ์์ฑ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค.
์ฆ ํ๋์ ํ๋ก๊ทธ๋จ์ด ์๋ก ๋ค๋ฅธ ์ด์์ฒด์ ์์ ๋์ํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ ์ผ์ด๋ค.
๋ค์ ๋์์์ ์๋ฐ๋ก ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ฉด ์ด์์ฒด์ ์ ์๊ด์์ด ํ๋ก๊ทธ๋จ์ ๋์์ํฌ ์ ์๋ ์ฅ์ ์ด ์๋ค. ์ด์์ฒด์ ์ ๋ฐ๋ฅธ ์ฐจ์ด์ ์ ๋ฐ๋ก JVM์ด ๋์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ด์์ฒด์ ๋ณ๋ก ์กด์ฌํ๋ ์ฐจ์ด์ ์ JVM์์ ๋ค ์ฒ๋ฆฌํ์๊ธฐ ๋๋ฌธ์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์ด์์ฒด์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ์ด ๋๋ค.
ํ์ง๋ง ์๊น ๋งํ๋ฏ์ด JVM์ ์ด์์ฒด์ ์์์ ๋์ํ๋ ์ํํธ์จ์ด๊ธฐ ๋๋ฌธ์ ์ด์์ฒด์ ์ ์์กด์ ์ด์ฌ์ Windows์๋ Windows์ JVM์ด ํ์ํ๊ณ , Mac์๋ Mac์์์ JVM์ด ํ์ํ๊ฒ ๋๋ค.
๐ก ์ปดํ์ผ ํ๋ ๊ณผ์
์์์ ์ดํด ๋ณด์๋ฏ์ด ์๋ฐ๋ OS์ ๋ ๋ฆฝ์ ์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ ์๋ฐ ํ๋ก๊ทธ๋จ๊ณผ OS์ฌ์ด์ ์กด์ฌํ๊ณ ์๋ JVM ๋๋ถ์ด๋ผ๋ ๊ฒ๋ ์๊ฒ๋์๋ค.
๊ทธ๋ ๋ค๋ฉด JVM์ ์ด๋ ํ ๊ธฐ๋ฅ ๋๋ฌธ์, OS์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ์ํฌ ์ ์๋์ง ์๋ฐ ์ปดํ์ผ ๊ณผ์ ์ ํตํด ์์๋ณด๋๋ก ํ์.
-
๊ฐ๋ฐ์๊ฐ ์๋ฐ ์์คํ์ผ(.java)๋ฅผ ์์ฑํ๋ค.
-
์๋ฐ ์ปดํ์ผ๋ฌ(Java Compiler)๊ฐ ์๋ฐ ์์คํ์ผ์ ์ปดํ์ผํ๋ค.
์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ์ ์๋ฃํ๋ฉด ์๋ฐ ๋ฐ์ดํธ ์ฝ๋(.class)ํ์ผ์ด ์์ฑ๋๋ค. ์ด ํ์ผ์ JVM๋ง ์ฝ์ ์ ์์ผ๋ฉฐ ์์ง OS๊น์ง๋ ์ฝ์ ์ ์๋ ์ด๋ค. -
๋ฐ์ดํธ ์ฝ๋๊ฐ JVM์ ํด๋์ค ๋ก๋(Class Loader)์๊ฒ ์ ๋ฌ๋๋ค. ํด๋์ค ๋ก๋์ ์ ๋ฌ๋๋ ์๊ฐ๋ถํฐ ๋ฐํ์ ํ๊ฒฝ์ ์ ์ด๋ ๋ค.
-
ํด๋์ค ๋ก๋์์๋ ๋์ ๋ก๋ฉ์ ํตํด ํ์ํ ํด๋์ค๋ค์ ๋ก๋ฉํ์ฌ JVM ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฐ๋ค. JVM ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area)์ด๋ผ๊ณ ํ๋ค.
-
์คํ์์ง(Execution Engine)์์ JVM ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์จ ๋ฐ์ดํธ ์ฝ๋๋ค์ ๋ช ๋ น์ด ๋จ์๋ก ํ๋์ฉ ๊ฐ์ ธ์์ ์คํํ๋ค.
์ด๋, ์คํ ์์ง์ ๋๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
-
์๋ฐ ์ธํฐํ๋ฆฌํฐ : ๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ฝ์ด์ ํด์ํ๊ณ ์คํํ๋ค. ํ๋ํ๋์ ์คํ์ ๋น ๋ฅด๋, ์ ์ฒด์ ์ธ ์คํ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์๋ค.
-
JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler) : ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ณ๊ฒฝํ๊ณ ์ดํ์๋ ํด๋น ๋ฉ์๋๋ฅผ ๋ ์ด์ ์ธํฐํ๋ฆฌํ ํ์ง ์๊ณ , ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ์ง์ ์คํํ๋ ์ปดํ์ผ๋ฌ์ด๋ค.
์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋ ๋ฐฉ์์ผ๋ก, ํ๋์ฉ ์ธํฐํ๋ฆฌํ ํ์ฌ ์คํํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๊ฐ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์คํ์๋๋ ์ธํฐํ๋ฆฌํ ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค.
ํด๋์ค ๋ก๋๋ด์์์ ์ธ๋ถ ๋์
a. ๋ก๋ : ์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋์ ํ์ํ ์๋ฐ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๊ฐ์ ธ์์ JVM์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค.
b. ๊ฒ์ฆ : ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ํ์ผ์ด ์๋ฐ ์ธ์ด ๋ช ์ธ(Java Language Specification) ๋ฐ JVM ๋ช ์ธ์ ๋ช ์๋ ๋๋ก ๊ตฌ์ฑ๋์ด ์๋์ง ๊ฒ์ฌํ๋ค.
c. ์ค๋น : ํด๋์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค. (ํ๋, ๋ฉ์๋, ์ธํฐํ์ด์ค ๋ฑ๋ฑ)
d. ๋ถ์ : ํด๋์ค์ ์์ ํ ๋ด ๋ชจ๋ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ๋ค์ด๋ ํธ ๋ ํผ๋ฐ์ค๋ก ๋ณ๊ฒฝํ๋ค.
๊ธฐ๋ณธ ์๋ฃํ(primitive data type)์ ์ ์ธํ ๋ชจ๋ ํ์ (ํด๋์ค์ ์ธํฐํ์ด์ค)์ ๋ช ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ธฐ๋ฐ์ ๋ ํผ๋ฐ์ค๊ฐ ์๋๋ผ, ์คํ ์ Link๋ฅผ ํ ์ ์๋ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ํตํด ์ฐธ์กฐํ๋ค.
์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ง์ ์ฐธ์กฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ฆ์ ์ํ ์ฐธ์กฐ๋ฅผ ์๋ฏธํ๋ค.
์ด ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๊ฐ ์์ ๋ก๋ - ๊ฒ์ฆ - ์ค๋น ๊ณผ์ ์ ๊ฑฐ์น๊ณ ์ค์ ๋ฌผ๋ฆฌ์ ์ธ ์ฃผ์์ธ ๋ค์ด๋ ํธ ๋ ํผ๋ฐ์ค๋ก ๋์ฒด๋๋ ์์ ์ธ ๋ค์ด๋๋ฏน Linking์ด ์ด ๋จ๊ณ์์ ์ผ์ด๋๋ค.
b.~ d.๊น์ง๋ฅผ ๋ฌถ์ด์ ์ฐ๊ฒฐ์ด๋ผ๊ณ ๋ ํ๋ค.
e. ์ด๊ธฐํ : ํด๋์ค ๋ณ์๋ค์ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค.(static ํ๋)
๐ก ์ปดํ์ผ ๋ฐ ์คํํ๋ ๋ฐฉ๋ฒ
Test.java
class Hello{
public static void main(String[] args){
System.out.println("Hello Java!");
}
}
์์ ๊ฐ์ ์๋ฐ ์์คํ์ผ์ด ์์ ๋, ์๋ฐ ์์คํ์ผ์ ์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
$ javac Test.java
javac(java compile or java compiler) ๋ช ๋ น์ด๋ก ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฐ ํ์ผ์ ์ปดํ์ผํ๋ค.
์ฑ๊ณต์ ์ผ๋ก ์ปดํ์ผ์ ๋ง์น๋ค๋ฉด, ํด๋น ๊ฒฝ๋ก์ Hello.class ํ์ผ์ด ์์ฑ๋๋ค.
์ปดํ์ผ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ Hello.class ํ์ผ์ด ๋ฐ๋ก ์๋ฐ ๋ฐ์ดํธ ์ฝ๋์ด๋ค.
์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํ์์ผ์ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ถ๋ ฅ์ ํ์ธํ ์ ์๋ค.
$ java Hello
> Hello Java!
์ java ๋ช ๋ น์ด๋ก ์๋ฐ ๋ฐ์ดํธ ์ฝ๋ํ์ผ์ ์๋ฐ ์ธํฐํ๋ฆฌํฐ๊ฐ ํด์ํ๊ณ ์คํํ๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ Test.java ํ์ผ์ ์ปดํ์ผํ ๊ฒฐ๊ณผ๋ Test.class๊ฐ ์๋๋ค.
Test๋ ํฌ์ฅ์ง ์ด๋ฆ์ด๊ณ ํฌ์ฅ ์ ์๋ฉฉ์ด๋ Hello ํด๋์ค์ด๋ค.
์ปดํ์ผ ๊ฒฐ๊ณผ ์์ฑ๋ ํ์ผ์ Class ์ด๋ฆ์ Hello.class ํ์ผ์ด ์์ฑ๋๋ค.
๐ก ๋ฐ์ดํธ์ฝ๋๋ ๋ฌด์์ธ๊ฐ
์๋ฐ ๋ฐ์ดํธ ์ฝ๋(Java bytecode)๋ ๋ฐ์ดํธ์ฝ๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฐ ์์ค์ฝ๋๋ฅผ ์ค๊ฐ ์ธ์ด์ธ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํํ ๊ฒ์ด๋ค.
๋ฐ์ดํธ ์ฝ๋๊ฐ ๊ธฐ๊ณ์ด๋ ์๋์ง๋ง JVM์ ์ํด ์์ฝ๊ฒ ๊ธฐ๊ณ์ด๋ก ๋ณํ๋ ์ ์๋ ์ฝ๋์ด๋ค.
๋ฐ์ดํธ ์ฝ๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ด์ ๋, ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ๋ณํ๋๋ ์ฝ๋์ ๋ช ๋ น์ด ํฌ๊ธฐ๊ฐ 1๋ฐ์ดํธ๋ผ์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ผ๊ณ ๋ถ๋ฆฌ๊ณ ์๋ค.
์๋ฐ ๋ฐ์ดํธ ์ฝ๋์ ํ์ฅ์๋ .class์ด๊ณ , ์๋ฐ๊ฐ OS์ ๋ ๋ฆฝ์ ์ด๋ฏ๋ก ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ JVM๋ง ์ค์น๋์ด ์์ผ๋ฉด ์ด๋ค OS์์๋ผ๋ ์คํ๋ ์ ์๋ค.
outer:
for (int i = 2; i < 1000; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0)
continue outer;
}
System.out.println (i);
}
์ ์๋ฐ ์ฝ๋๋ฅผ ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ์ ํ๋ฉด ์๋์ ๊ฐ์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์์ฑ์ด ๋๋ค๊ณ ํ๋ค.
0: iconst_2
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 44
9: iconst_2
10: istore_2
11: iload_2
12: iload_1
13: if_icmpge 31
16: iload_1
17: iload_2
18: irem
19: ifne 25
22: goto 38
25: iinc 2, 1
28: goto 11
31: getstatic #84; // Field java/lang/System.out:Ljava/io/PrintStream;
34: iload_1
35: invokevirtual #85; // Method java/io/PrintStream.println:(I)V
38: iinc 1, 1
41: goto 2
44: return
์๋ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ฐ๋์ ์ดํดํด์ผ ํ๋ค๊ณ ๋ง ํ ์ ์๋ค๊ณ ๋ ํ์ง๋ง, ํ์ด์ฌ ํ๋ก๊ทธ๋๋จธ๊ฐ C์ ๋ํ ์ดํด๊ฐ ํ์ํ๊ณ
C๋ C++ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ์ดํดํ๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ๋๋ก๋ ํด๋น ๋ ๋ฒจ๋ณด๋ค ์ข ๋ ๋ก์ฐ ๋ ๋ฒจ์ ๋ํ ์ดํด๊ฐ ํ์ํ ๋๊ฐ ์๋ค.
์๋ฐ ํ๋ก๊ทธ๋๋จธ ๋ํ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ๋ฐ์ดํธ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์์ฑ๋ ๊ฒ์ธ์ง๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํ์ํ๋จ ์๊ฐ์ด ๋ ๋ค.
๐ก JIT ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ๋์ํ๋์ง
์์์๋ ์ด์ง ๋ณด์๋ฏ์ด JIT ์ปดํ์ผ๋ฌ๋ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ณ๊ฒฝํ๊ณ ์ดํ์๋ ํด๋น ๋ฉ์๋๋ฅผ ๋ ์ด์ ์ธํฐํ๋ฆฌํ ํ์ง ์๊ณ , ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ์ง์ ์คํํ์ฌ ๋น ๋ฅธ ์๋๋ก ๊ธฐ๊ณ์ด๋ฅผ ์์ฑํ ์ ์๋ ์ปดํ์ผ ๊ธฐ๋ฒ์ด๋ค.
JIT์ โ์ค์๊ฐโ ๋น์ค๋ฌด์คํ ๋ป์ ๋ดํฌํ Just โ In โ Time์ ์ฝ์ด์ธ๋ฐ, ์ ์ด๋ฌํ ์ด๋ฆ์ด ๋ถํ์ก๋๋ฉด ์๋๊ฐ ๋๋ฆฐ ์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋ ๋ฐฉ์์ผ๋ก JIT ์ปดํ์ผ๋ฌ๋ ํ๋ก๊ทธ๋จ์ ์ค์ ์คํํ๋ ์์ ์(์ค์๊ฐ์) ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ์ฌ ์ ์ฒด์ ์ธ ์คํ์๋๋ ์ธํฐํ๋ฆฌํ ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ ๊ธฐ๊ณ์ด๋ก ๋ณํ๋ ์ฝ๋๋ ์บ์์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ ์ปดํ์ผ์ ๋ค์ ํ ํ์๊ฐ ์๋ค.
JIT ์ฝ๋๋ ์ผ๋ฐ์ ์ธ ์ธํฐํ๋ฌํฐ ์ธ์ด์ ๋นํด ํจ์ฌ ์ข์ ์ฑ๋ฅ์ ๋ธ๋ค. ์ฌ์ง์ด ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ์ ์ปดํ์ผ๋ฌ ์ธ์ด๋ณด๋ค ์ข์ ์ฑ๋ฅ์ ๋ด๊ณค ํ๋๋ฐ, ์ด๋ ์คํ ๊ณผ์ ์ ์ปดํ์ผ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ง๋ ์ฅ์ ์ด๋ผ๊ณ ํ ์ ์๋ค.
๐ก JVM ๊ตฌ์ฑ ์์
JVM ์ ํฌ๊ฒ 4๊ฐ์ง(Class Loader, Execution Engine, Garbage Collector, Runtime Data Area)๋ก ๋๋์ด ์ง๋ค.
1. Class Loader
์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํ๋ ํด๋์ค๋ฅผ ์ฝ์ด๋ค์ฌ Runtime Data Area ์ ์ ์ฌํ๋ ์ญํ ์ ํ๋ค.
2. Execution Engine
Class Loader ์ ์ํด Runtime Data Area ์ ์ ์ฌ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ํ๋์ฉ ๊ฐ์ ธ์ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๊ณ ์คํํ๋ ์ญํ ์ ํ๋ค.
์์ ๋ณด์๋ฏ์ด, ์คํ ์์ง์๋ Interpreter ๋ฐฉ์๊ณผ, JIT ์ปดํ์ผ๋ฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
JIT์ผ๋ก ์ค๋ณต๋๋ ๋ถ๋ถ์ ๋ฏธ๋ฆฌ ์ฒดํฌํด๋๊ณ ๋ผ์ธ๋ณ๋ก ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒดํฌํ ๋ถ๋ถ์ ๋๋ฌํ๋ฉด ๋ฏธ๋ฆฌ ์บ์ ์ ์ฅ๋ ๊ฐ์ ์คํํ๋ ๋ฐฉ์์ ์ฑํํ๊ณ ์๋ค.
3. Runtime Data Area
JVM ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฌํ๋ ์์ญ์ด๋ค.
์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ค์ 5๊ฐ์ง ์์ญ์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
a. Class Area or Method Area
ํด๋์ค ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์์ ์ด๋ฆ๊ณผ ํ์ , ๋ฉ์๋์ ์ด๋ฆ๊ณผ ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๊ณ ๋ฆฌํด๊ฐ๊ณผ ๊ฐ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๊ณ , ๊ฐ์ข ์์, static ๋ฉ์๋, final ํด๋์ค ๋ณ์ ๋ฑ์ด ์ ์ฅ๋๋ค.
b. Heap Area
Heap Area์๋ new ํค์๋์ ์ํด ์์ฑ๋๋ ํด๋์ค์ ๋ฐฐ์ด ๋ฑ์ด ์ ์ฅ๋๋ค.
Method Area ์์ญ์ ์ ์ฅ๋ ํด๋์ค๋ง์ด ์์ฑ ๊ฐ๋ฅํ๊ณ , Garbage Collector ์ ์ํด ์ฌ์ฉ๋์ง ์๋ ํด๋์ค/๋ฐฐ์ด์ด ์ ๊ฑฐ๋๋ค.
Garbage Collector๋ ์๋์์ ์ข ๋ ์์ธํ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
c. Stack Area
Stack Area๋ ์ง์ญ ๋ณ์, ํ๋ผ๋ฏธํฐ, ๋ฆฌํด ๊ฐ, ์ฐ์ฐ์ ์ฌ์ฉ๋๋ ์์ ๊ฐ๋ฑ์ด ์์ฑ๋๋ ์์ญ์ด๋ค.
์๋ฅผ ๋ค์ด, Person p = new Person(); ์ ๊ฐ์ด ํด๋์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ, new ์ ์ํด ์์ฑ๋ ํด๋์ค๋ Heap Area ์ ์ ์ฅ๋๊ณ , Stack Area ์๋ ์์ฑ๋ ํด๋์ค์ ์ฐธ์กฐ์ธ p ๋ง ์ ์ฅ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์คํํ ๋๋ง๋ค ์คํ์ด ์์ฑ๋๋ฉฐ, Method Area, Heap Area ๋ฅผ ์ ์ธํ ์์ญ๋ค์ ์ค๋ ๋๊ฐ์ ๊ณต์ ๋์ง ์๋๋ค.
d. PC Register
PC Register๋ ์ค๋ ๋๊ฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋๋ฉฐ, ํ์ฌ ์คํ์ค์ธ ์ฃผ์์ ๋ช ๋ น์ ์ ์ฅํ๋ค.
๋ฉํฐ ์ค๋ ๋๊ฐ ๋์ํ ๋, ์ด๊ณณ์ ์ ๋ณด๋ฅผ ์ด์ฉํด ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋์์ ์คํํ ์ ์๋ค.
e. Native Method Stack
Native Method Stack์๋ ์๋ฐ ์ด์ธ์ ์ฝ๋๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
4. Garbage Collector (GC)
์์์ Heap Area์์ Garbage Collector ๊ฐ ๋ฑ์ฅํ์๋๋ฐ, GC๋ Heap ์์ญ์ ์์ฑ๋์ด ์๋ ๊ฐ์ฒด๋ค ์ค ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ๊ฑฐํ๋ ์ญํ ์ ํ๋ค.
GC๋ฅผ ์ดํดํ๋ฉด ์ ์๋ฐ ๊ฐ์ฒด๊ฐ ์ฃผ์๊ฐ์ ์ฌ์ฉํ์ง ์๊ณ , ์ฐธ์กฐ๊ฐ์ ์ฌ์ฉํ๋์ง ์ ์ ์๋ค.
GC ๊ณผ์ ์ ์ข ๋ฌํํ๊ฒ ์ค๋ช ํ์๋ฉด,
1 Eden์ด ๊ฝ์ฐจ๋ฉด ์ฐธ์กฐ๋๋ ์ ๋ค์ Survivor1์ ์ฎ๊ธด๋ค.
2. Eden์ ์น ๋ฏผ๋ค.
3. ๋์ค์ Survivor1๊ฐ ๊ฝ์ฐจ๋ฉด ์ฐธ์กฐ๋๋ ์ ๋ค์ Survivor2์ ์ฎ๊ธด๋ค.
4. Survivor1์ ์น ๋ฏผ๋ค. (1 ๋๋ 2 ์ค ํ๊ตฐ๋ฐ๋ ๋น์ด์์ด์ผ ํจ.)
5. ์ ๊ณผ์ ์ด ๋ฐ๋ณต๋จ์๋ ๊ณ์ ์ด์๋จ์ ์ ๋ค์ Old ์ฆ, Major GC๋ก ์ฎ๊ธด๋ค.
ref | address |
---|---|
ox1000 | oxaaaa |
์ ๊ณผ์ ์ฒ๋ผ GC์ ์ํด ์ฐธ์กฐ๋๋ ์ ๋ค์ด ์ด๋ํ๊ฒ๋๋ฉด JVM Obj(Address Mapping) Table ์์ ์ค์ address๋ oxaaaa์์ oxbbbb๋ก ๋ณ๊ฒฝ๋๋ค.
ref | address |
---|---|
ox1000 | oxbbbb |
ํ์ง๋ง ref๋ ๊ทธ๋๋ก์ด๊ธฐ ๋๋ฌธ์ ์๋ฐ ๊ฐ์ฒด๊ฐ address๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ref๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ฌํ ์ฐ์ ๋ก GC๋ฅผ ์ดํดํ๋ฉด ์ ์๋ฐ ๊ฐ์ฒด๊ฐ ์ฃผ์๊ฐ์ ์ฌ์ฉํ์ง ์๊ณ , ์ฐธ์กฐ๊ฐ์ ์ฌ์ฉํ๋์ง ์ ์ ์๋ค๊ณ ํ๋ ๊ฒ์ด๋ค.
๐ก JDK์ JRE์ ์ฐจ์ด
์ ์ด๋ฏธ์ง๋ก JRE(Java Runtime Environment)์ JDK(Java Development Kit)๋ ๊ฐ๋จํ๊ฒ ์ค๋ช ์ด ๊ฐ๋ฅํ๋ค.
JRE(Java Runtime Environment) ๋ ์๋ฐ ์คํ ํ๊ฒฝ์ ์ค์๋ง๋ก JVM + ์๋ฐ API ๋ฑ ์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ ์ด๋ค.
์ค์ ์๋ฐ๋ฅผ ์ค์นํ๋ ค๋ฉด JVM๋ง์ ์ค์นํ ์๋ ์๊ณ JRE๋ฅผ ์ค์นํ๊ฒ ๋๋ค.
๋ง์ธํฌ๋ํํธ ๊ฐ์ ์๋ฐ๋ก ๋ง๋ค์ด์ง ํ๋ก๊ทธ๋จ์ ์คํ์ ์ํด ์ค์น๋ฅผ ์๊ตฌํ๋ ๊ฒฝ์ฐ JRE๋ฅผ ๊น๊ฒ๋๋ค.
๋ณดํต ์ผ๋ฐ ์ฌ์ฉ์์ฉ JAVA๋ผ๊ณ ํ๋ฉด ์ด JRE๋ฅผ ๋งํ๋ค.
JDK(Java Development Kit) ๋ ์๋ฐ ๊ฐ๋ฐ ํคํธ์ ์ค์๋ง๋ก JRE + ์ปดํ์ผ๋ฌ, ๋๋ฒ๊ฑฐ ๋ฑ ๊ฐ๋ฐ๋๊ตฌ๋ฅผ์ ํฌํจํ๋ ํ๋ก๊ทธ๋จ ์ด๋ค.
JDK๋ ํ์์ ์์ ์ฝ๋ ๊ธฐ๋ฐ์ ์ค๋ผํดJDK์ ์คํ์์ค์ธ OpenJDK๊ฐ ์๋ค.
OpenJDK๋ ์ค๋ผํด, Azul ๋ฑ์์ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ,
์ด OpenJDK๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๋ค์ด์ง ์์ฒด๊ฐ๋ฐJDK๋ฅผ ํฌํจํ ์ ํ๋ค๋ ๋ง์ด ์๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([Become a Java-Masta๐จโ๐ซ 1์ฃผ์ฐจ] JVM๊ณผ ์๋ฐ ์ฝ๋), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@bae_mung/16์ฃผ-Java-Masta-๊ณผ์ -JVM๊ณผ-์๋ฐ-์ฝ๋์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค