-
JVM์ด์ผ๊ธฐ - ์ ์(+JRE, JDK), ๊ตฌ์กฐ๊ฐ๋ฐ/Java 2022. 7. 5. 12:00
JVM (Java Virtual Machine ) ์๋ฐ ๊ฐ์ ๋จธ์
์ปดํจํฐ๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ด๋๋ฆฌ(2์ง์)๋ก ์์ฑ๋ ๊ธฐ๊ณ์ด๋ก๋ง ์ดํด๋ฅผ ํ ์ ์๋ค. ํ์ง๋ง ์ฌ๋์ ๊ทธ ๊ธฐ๊ณ์ด๋ฅผ ๋ณด๊ณ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ต๋ค. (๋ชจ๋ํฐ์ 0110101010110 ์ด๋ ๊ฒ๋ง ์จ์์ผ๋ฉด, ๋๊ฐํ๋ค^^;)
์ด์จ๋ ์ฐ๋ฆฌ๊ฐ ์ดํดํ๊ณ ์์ฑํ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ปดํจํฐ๊ฐ ์์๋ค์ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊ฟ์ฃผ๋ ์์ ์ ๋คํํ๋ c๋ ์๋ฐ ๊ฐ์ ์ปดํ์ผ ์ธ์ด์์๋ ์ปดํ์ผ๋ฌ๋ผ๋ ๋ฒ์ญ๊ฐ๊ฐ ๋ฒ์ญ์ ํด์ค๋ค. ๊ทธ๋ฐ๋ฐ c๊ฐ์ ๊ฒฝ์ฐ๋, ๋๊ฐ์ด c๋ก ์ง ํ๋ก๊ทธ๋๋ฐ์ด๋๋ผ๋ ์๋์ฐ์์ ๋๊ฒ ์ปดํ์ผํ ๊ฒ์ ๋งฅ์ด๋ ๋ฆฌ๋ ์ค์์ ์๋๋ค. ์ฆ, ํ๋ก๊ทธ๋จ์ด ๋๋ ํ๊ฒฝ, ์ปดํจํฐ๋ง๋ค ๊ฑฐ๊ธฐ์ ๋ง๋ ๊ธฐ๊ณ์ด๋ก ์ผ์ผ์ด ๋ฒ์ญ์ ํด์ค์ผํ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฒ ์๋ฐ์ JVM์ด๋ค. ์ฝ๊ฒ ๋งํด์ ๊ฐ ์ข ๋ฅ์ ์ปดํจํฐ๋ง๋ค JVM์ด๋ผ๋ ์ ๋ด ํต์ญ์ผํฐ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๋ฐ์์ ๋ค์ ์์ธํ ์ค๋ช ํ๊ฒ ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์๋ฐ ์์ค์ฝ๋๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋๊ธฐ ์ ์ ๋ฐ์ดํธ์ฝ๋๋ก ์ด๋ฃจ์ด์ง ํด๋์คํ์ผ๋ก ์ปดํ์ผ ๋๋๋ฐ, ์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ฐ ์ปดํจํฐ์ ๊น๋ ค์๋ JVM์๊ฒ ๊ฐ๋ค์ฃผ๋ฉด, ๊ทธ ์ปดํจํฐ๊ฐ ์ด ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ์ด JVM์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ทธ๋๊ทธ๋ ๊ธฐ๊ณ์ด๋ก ํต์ญ์ ํด์ค๋ค. ๊ทธ๋์ Write Once Run Anywhere ์ด๋ผ๋ ๋ง์ด ๋์๋๋ฐ, ํ๋ฒ ์์ฑํ๋ฉด ์ด๋์๋ ์๋๋๋๋ก ํด์ค๋ค๋ ๋ป์ด ๋ฐ๋ก ์ด๋ฐ ์๋ฏธ์ด๋ค.
JRE (Java Runtime Environment) ์๋ฐ ์คํ ํ๊ฒฝ
๋ฐํ์์ด๋ผ๋ ๋ง์ ์ปดํ์ผํ์๊ณผ ๋์กฐ๋๋ ๋ง์ด๋ค. ์ปดํ์ผ์ ์ฝ๋ฉ ์ดํ์ ์ด๊ฒ์ ์คํํ๊ฑฐ๋ ๋ฐฐํฌํ๊ธฐ ์ ์ '๋ฏธ๋ฆฌ' ํด๋๋ ๋ฒ์ญ์์ ์ ๋งํ๋๋ฐ, ๊ฒฐ๊ตญ ์ปดํ์ผ ํ์์ ์ด ์์ ์ ํ๋ ์์ ์ ๋งํ๋ค. ๋ฐํ์์ ๋ฐ๋๋ก ์ด๊ฒ์ run, ์คํํ๋ ์์ ์ ๋งํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋ฐ ๋ฐํ์ ํ๊ฒฝ์ด๋ผ๋ ๋ง์ด ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค. ์๋ฐ๋ก ์ง ์ํํธ์จ์ด๊ฐ ์ปดํ์ผ ๋ฐ ๋น๋๊น์ง ๋ค ๋ ๋ค์ ์ด๋ฅผ ์ฌ์ฉํ ๊ณณ์ ์ฃผ์ด์ ธ์ ์คํ์ด ๋ ๋ ๊ทธ ํ๊ฒฝ ์์๋ค๋ก์ ํ์ํ ๊ฒ๋ค์ ๋งํ๋ค. (์์คํ ์ ์ฝ๋ ๋ง๊ณ ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ํ์ํ๋ค. ์๋ฅผ ๋ค์ด ์๋ฐ์ List, Map ๋ฑ ์ด๋ฐ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ธ ์ ์๋๊ฒ, ์ฐ๋ฆฌ๊ฐ ์ง์ ์ด ๊ธฐ๋ฅ๋ค์ ๊ตฌํํด์๊ฐ ์๋๋ผ ์ด๊ฒ๋ค์ด ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ๋ ํด๋์ค๋ก ์ ๊ณต์ด ๋๊ธฐ ๋๋ฌธ์ ์ธ ์ ์๋ ๊ฒ์ด๋ค.) JVM์์ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ JVM์ด๋ ์ธํธ๋ก ๋ฌถ์ด๋ค๊ฐ ๋ค์ด๋ฐ์ ์ค์นํ ์ ์๋๋ก ํ ๊ฒ์ด JRE ์ด๋ค. ์ด JRE๋ง ๊น๋ฉด ์ด๋ค ์ปดํจํฐ๋ ์๋ฐ๋ก ์์ฑํ ํ๋ก๊ทธ๋จ์ ๋๋ฆด ์ ์๊ฒ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์์ฆ์ JRE๊ฐ ์ ์๋ณด์ธ๋ค. ์ด์ ๋? ๋ฐ๋ก JDK์ ์๋ค.
JDK(Java Development Kit) ์๋ฐ๊ฐ๋ฐ๋๊ตฌ
JDK๋ JRE๋ฅผ ํฌํจํ๊ณ ์๋ค. JRE ์๋ค๊ฐ ์๋ฐ ์ฝ๋๋ฅผ ์ปดํ์ผํ ๋ ์ฐ๋ javac, ์๋ฐ๋ฅผ ๋๋ฒ๊น ํ ๋ ์ฐ๋ jdb, ์๋ก ์ฐ๊ด ์๋ ํด๋์ค๋ค์ ํ๋์ jar ํ์ผ๋ก ๋ฌถ์ด์ฃผ๋ jar ๋ฑ๋ฑ์ ์ฌ์ฉ์๊ฐ ์๋ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํ ๊ธฐ๋ฅ๋ค๋ ๊ฐ์ด ํ์ฌ๋ฅผ ํ๊ณ ์๋ค.
์์ ์๋ ์ฌ์ฉ์๋ค์ด ์๋ฐ ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๋ ค๋ฉด JRE๋ฅผ ๋ฐ๋ก ์ค์นํด์ผํ์ง๋ง, ์์ฆ์ ๊ฐ๋ฐ์๊ฐ ๋ฐฐํฌํ๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ JRE๋ JVM ์์๋ค๊น์ง ๋ค ๊ฐ์ด ๋ผ์๋ฃ์ด์ ํ๋ก๊ทธ๋จ๋ง ๋ฐ์์ ์คํ์ํค๋ฉด ๋๋๋ก ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฐ ๋๋ฆฌ๋ ์๋ฒ๊ฐ์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ ์์ JDK๋ฅผ ์ค์นํด์ ์ฌ์ฉํ๋ค.
JVM ๊ตฌ์กฐ
์๋ฐ ์์ค ์ฝ๋๋ .java ํ์ผ๋ก ์ ์ฅ๋๊ฒ ๋๋ค. ์ด ์์ค ํ์ผ์ ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ byte code๋ก ์ด๋ฃจ์ด์ง .class ํ์ผ๋ก ์ปดํ์ผํด์ค๋ค.
์ด๋ ๊ฒ byte code๋ก ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ฉด, ์ด๋ ์์ฑํ ์ฝ๋๋ฅผ 1์ฐจ์ ์ผ๋ก ์จ๊ธฐ๋ ์ญํ ์ ํ ๋ฟ๋ง ์๋๋ผ, ์ด์ byte code๋ก ๋ฐ๊ฟ๋ฒ๋ ธ์ผ๋ ๋ฌธ๋ฒ ๊ฒ์ฌ๋ฑ์ ํ์ง ์๋ ์๊ฐ์ ๋จ์ถ์ํค๋ ์ญํ ์ ํ๋ค. ํ์ง๋ง ๊ฒฐ๊ตญ์ ์์ค ์ฝ๋ ๋ณ๊ฒฝ์๋ง๋ค ์ปดํ์ผ์ ํ๊ณ ์คํ์ํค๊ธฐ๋๋ฌธ์, ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
์ด๋ ๊ฒ ๋ณ๊ฒฝ๋ ํ์ผ์ Class Loader์ ์ํด JVM ๋ฉ๋ชจ๋ฆฌ ์์ญ, ์ฆ Runtime Data Area๋ก ๋ก๋ฉ์ํจ๋ค. Runtime Data Area๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 5๊ฐ์ง ์์ญ์ผ๋ก ๋๋ ์ ธ์๋ค.
๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ธ Method Area, Heap์ด ์๊ณ , ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์์ฑ๋๋ Stack, PC Register, Native Method Stack ์์ญ์ด ์๋ค.
MethodArea ์์ญ์ JVM์ด ์์๋ ๋ ์์ฑ๋๋ ๊ณต๊ฐ์ผ๋ก ๋ฐ์ดํธ์ฝ๋๊ฐ ์ด ์์ญ์ ์ ์ฅ๋๋ค. ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ด๋ผ๊ณ ํ๋๋ฐ, ์ฌ๊ธฐ์๋ ํด๋์ค ์ ๋ณด, ๋ณ์ ์ ๋ณด, static์ผ๋ก ์ ์ธํ ๊ณต์ ๋ณ์๊ฐ ์ ์ฅ๋๋ค.
Heap ์์ญ์ new ์ฐ์ฐ์ ํตํด ๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ์์ญ์ผ๋ก GC์ ๋์์ด ๋๋ ๊ณต๊ฐ์ด๋ค. ํด๋น ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๊ธฐ ์ ์ด๋ GC์ ๋์์ด ๋์ด ์ ๋ฆฌ๋๊ธฐ ์ ๊น์ง๋ ๋จ์์๋ค. (Heap์์ญ์ ๊ตฌ์กฐ์ GC์ ๋ํ ๊ธ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐ)
https://mong-dev.tistory.com/16
Stack ์์ญ์ ์ง์ญ๋ณ์, ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์์์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ณ์, ๋ฉ์๋์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๋ค. ์ง์ญ๋ณ์์ ๋งค๊ฐ๋ณ์์ ํน์ฑ์ ํด๋น ๋ฉ์๋์ ํธ์ถ์ด ์ข ๋ฃ๋๋ฉด, ์ด ์์ ์ ์ธ๋ ๋ณ์๋ค์ ์ฌ๋ผ์ง๋ค. ์ฃผ๋ก ๊ธ๋ฐฉ ์ฌ์ฉ๋๊ณ ์ฌ์ฉ์ด ๋๋๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๋ค.
์ฐธ๊ณ ๋ก, ์ฐ๋ฆฌ๊ฐ Person p = new Person("daramii", 30); ์ ์ ๋ ฅํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด๋ ๊ฒ ๋์ ์ผ๋ก ์์ฑํ Person ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์ p๋ stack์์ญ์ ์ ์ฅ์ด ๋๊ณ , new ์ฐ์ฐ์๋ฅผ ํตํด ๋์ ์ผ๋ก ์ ์ธํ Person๊ฐ์ฒด ์์ฒด๋ Heap์์ญ์ ์ ์ฅ๋๋ ๊ฒ์ด๋ค.
PC Register๋ ์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ฉฐ, ํ์ฌ ์ํ์ค์ธ JVM์ ๋ช ๋ น์ด ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ด๋ค. ์ฆ, ์ค๋ ๋๊ฐ ์ด๋ค ๋ถ๋ถ์ ์ด๋ค ๋ช ๋ น์ด๋ก ์ํํ ์ง ์ ์ฅํ๋ ๊ณต๊ฐ์ด๋ค.
Native Method Stack์ JAVA๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ํ ๊ณต๊ฐ์ด๋ค. ์ฆ, JNI(Java Native Interface)๋ฅผ ํตํด ํธ์ถํ๋ C/C++ ๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ๊ณต๊ฐ์ด๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ปดํ์ผ๋์ด ์์ฑ๋๋ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋ ์ค์ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์์ญ์ด๋ค.
์ด์ Runtime Data Area์ ๋ก๋ฉ๋ ํด๋์คํ์ผ์ด Execution Engine์ ํตํด ํด์์ด ๋๋ค.
Execution Engine์ ๋ง๊ทธ๋๋ก ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ ์์ง์ด๋ค. ์ฐ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์์๋ ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํด์ฃผ๋ ์์ ์ด ํ์ํ ๊ฒ์ด๋ค. ๊ทธ๋ฆผ์์ ๋ณด์ด๋ interpreter๋ ๋ช ๋ น์ด๋ฅผ ํ์ค ํ์ค ํด์ํ๋ฉฐ ์คํํ๋ค. JIT(Just In Time) Compiler๋ interpreter์ ๋จ์ ์ ๋ณด์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก, runtime ์์ ์ ํ๊บผ๋ฒ์ ํด์ํ์ฌ ์คํํ๋ค.
์ด์ ์ด๋ ๊ฒ ๊ธฐ๊ณ์ด๋ก ํด์๋ ๊ฒ๋ค์ด Runtime Data Area์ ๋ฐฐ์น๋์ด ์ค๋ ๋ ๋๊ธฐํ๋ GC์ ์ํํ๊ฒ ๋๋ค.
๋ง์ง๋ง์ผ๋ก, Native Method Interface(JNI)๋ JVM์ ์ํด ์คํ๋๋ ์ฝ๋ ์ค ๋ค์ดํฐ๋ธ๋ก ์คํํ๋ ๊ฒ์ด ์๋ค๋ฉด, ํด๋น ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ํธ์ถ ๋ ์ ์๋๋ก ๋ง๋ ์ผ์ข ์ ํ๋ ์์ํฌ์ด๋ค.
Native Method Library๋ Native Method ์คํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
'๊ฐ๋ฐ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ๊ฐ ํ์ฅํ ๊ฐ์ฒด ์งํฅ (0) 2022.05.24 Java8 - stream(์คํธ๋ฆผ), forEach(), map(), filter(), Method Reference(๋ฉ์๋ ์ฐธ์กฐ) (0) 2022.04.30 Java8 - Lamda ํํ์(expression) (0) 2022.04.29 [Thread] Runnable and Callable in Java (0) 2022.04.25 [Thread] Volatile์ด๋, Volatile๊ณผ DCL(Double Checking Locking) ๊ณต๋ถ ๊ธฐ๋ก (0) 2022.04.24