jvm
JVM
Java Virtual Machine์ ์ฝ์๋ก Java์ OS์ฌ์ด์์ ์ค๊ฐ์ ์ญํ ์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, GC(garbage collection)์ ์ํํ๋ ์คํ๊ธฐ๋ฐ์ ๊ฐ์๋จธ์ ์ผ๋ก C++,C์ ๊ฐ์ ์ธ์ด๋ค๊ณผ ๋ค๋ฅด๊ฒ OS์ ์๊ด์์ด ๋์์ด ๊ฐ๋ฅํ๋ค.
Java๋ C๋ C++๊ณผ ๊ฐ์ด ๋ฐ๋ก ์ปดํ์ผ๋๋ ์ปดํ์ผ ์ธ์ด๊ฐ ์๋๋ค. ์ปดํ์ผ์ธ์ด๋ ์ปดํ์ผ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ปดํ์ผ์ด ๋๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ Java์ ๊ฐ์ฅ ํฐ ํน์ง์ธ os์ ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๋ ๋ค๋ ์ ์ ์๋ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. (ํ์ด์ฌ์ด๋, JS๋ ์ธํฐํ๋ฆฌํฐ ์ธ์ด)
์ปดํ์ผ๋ฌ๋ ์ ์ฒด ์์ค์ฝ๋๋ฅผ ํตํด ๋ถ์ํ์ฌ ์ค๋ฅ๊ฐ์๋์ง ํ์ธํ๋ฉฐ ์ฌ๊ตฌ์ฑํ์ฌ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ๋ ๋ฐ๋ฉด, ์ธํฐํ๋ฆฌํฐ๋ ํ ํ์ฉ ์คํํ๋ฉฐ ๋ถ์์ํ๊ณ (์ค๊ฐ ์ฝ๋๋ก ๋ณํ) ์ค๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์์ ๊ทธ ์ดํ์ ์ฝ๋๋ ํ์ธํ์ง ์๋๋ค.
Java๋ ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ค๋ ํน์ง๋๋ฌธ์ ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฐ์ฝ๋๋ฅผ ๋ฐ์ดํธ ์ฝ๋(.classํ์ผ)๋ก ๋ณํํ๊ณ ์ด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํด์ฃผ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ ์ธํฐํ๋ฆฌํฐ์ ์ปดํ์ผ๋ฌ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ์ธ์ด์ด๋ค.
์ปดํ์ผ๋ฌ๋ ๊ธฐ๊ณ์ด๋ก ๋ณํํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ธ๋ฐ ๊ธฐ๊ณ์ด๊ฐ ์๋ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์๋ฐ ์ปดํ์ผ๋ฌ๋ผ๊ณ ๋ถ๋ฅด๋ ์ด์ ๋ ๋ฐ์ดํธ์ฝ๋๋ ๊ธฐ๊ณ์ด๋ก ๋ณํํด์ฃผ๋ JVM์ ์ํ ์ธ์ด์ด๊ณ JVM๋ ๊ธฐ๊ณ์ด๊ธฐ ๋๋ฌธ์ ์๋ฐ ์ปดํ์ผ๋ฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฐ ์ธํฐํ๋ฆฌํฐ๋ ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ๋ณํ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ค๋ฅธ ํ๊ฒฝ์ JVM์์ ์คํํ ์ ์๋๋ก ๊ธฐ๊ณ์ด๋ก ๋ณํํด์ฃผ๋ ์ญํ ์ ํ๋ค.
ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ค๋ ์ธํฐํ๋ฆฌํฐ์ ์ฅ์ ์ ์ด์ฉํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๋ก ์ค๊ฐ์ธ์ด๋ก ๋ณํ ํ ์ด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๋ฐฉ์์ ์ด์ฉํ๋ค.
์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ
์ปดํ์ผ ์ด๋ฆ ๊ทธ๋๋ก ์๋ฐ ์ปดํ์ผ๋ฌ๋ฅผ ์ด์ฉํด ์๋ฐ์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋(.classํ์ผ)๋ก ๋ณํํ๋ ๊ฒ์ผ๋ก ์ค์นํ jdk์ binํด๋์์ javac
์ด๋ผ๋ ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
์ปดํ์ผ ๊ณผ์
์ดํ ๋ถ์ : public, class, operator(์ฐ์ฐ์,๊ดํธ๋ฑ), ๋ฆฌํฐ๋ด(์์), ๋ฑ์ผ๋ก ๋ถ์ํ์ฌ ๋๋๊ฒ์
์ดํ์
๋ผ๊ณ ํ๋ฉฐ ์ด ์ดํ์๋ค์ ํ๋์ ์คํธ๋ฆผ(ํ ํฐ ์คํธ๋ฆผ)์ผ๋ก ๋ง๋๋ ๊ณผ์ ๊ตฌ๋ฌธ ๋ถ์ : ํ ํฐ์คํธ๋ฆผ์ ํตํด ๋ฌธ๋ฒ์ ๋ง๋์ง ํ์ธํ๊ณ ํ๋ ธ๋ค๋ฉด
Syntax error
๋ฅผ ๋์ด๋ค.์๋ฏธ ๋ถ์ : ํ์ ๊ฒ์ฌ๋ ์๋ ํ์ ๋ณํ์ ์ํํ์ฌ ๊ฒ์ฌํ๊ณ ์๋ฌ๋ฅผ ๋์ด๋ค.
์ค๊ฐ ์ฝ๋(๋ฐ์ดํธ ์ฝ๋) ์์ฑ
์คํ๋ฐฉ๋ฒ
๋๋ถ๋ถ์ IDE๋ฅผ ํตํด ์คํํ๋ CLI์ java
๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์คํ์ด๊ฐ๋ฅํ๋ค.
default ํจํค์ง๋ผ๋ฉด ๋ฐ๋ก ํ์ผ๋ช ์ ํตํด ์คํ์ด ๊ฐ๋ฅํ๋ฉฐ package๋ฅผ ๋ช ์ํ์ฌ ์คํ๋ ๊ฐ๋ฅํ๋ค.
๋ฐ์ดํธ์ฝ๋๋
์์์ ์ค๋ช ๊ฒ ์ฒ๋ผ JVM์ด๋ผ๋ ๊ธฐ๊ณ๊ฐ ์ดํดํ ์ ์๋ ์ธ์ด์ด๋ค.
๋๋ฌธ์ ์๋ฐ์ฝ๋๋ฅผ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฐ ์ปดํ์ผ๋ฌ
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
JVM ๊ตฌ์ฑ์์
Class Loader : ๋ฐ์ดํธ ์ฝ๋(.class ํ์ผ)๋ฅผ JVM๋ด๋ก ๋ก๋ฉํ๊ณ ๋งํฌ๋ฅผ ํตํด ๋ฐฐ์นํ๋ ์์ ์ ์ํ
๋ฐํ์ ์์ ๋์ ์ผ๋ก ํด๋์ค๋ค์ ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ํด๋์ค๋ฅผ ์ฒ์ ์ฐธ์กฐํ๋ค.
๋ก๋ฉ์์ ํด๋์ค๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ํด๋์ค๋ฅผ ์ฐพ์ ์์๋ค๊ณ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Execution Engine : ํด๋์ค๋ฅผ ์คํ ์ํค๋ ์ญํ ๋ก JVM์ ์ํ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํ๋ ์์ ์ ์ํ
Interpreter : ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํํ๊ณ ํ ์ค์ฉ ์ํํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋ง์ด ๋์จ๋ค.
JIT (Just In Time) : ์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ๋ก ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ค๊ฐ ์ ์ ํ ์์ ์ ๋ฐ์ดํธ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ์ด ์คํํ๋ ๋ฐฉ์
๊ธฐ๊ณ์ด๋ ์บ์์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ปดํ์ผ๋ ์ฝ๋๋ ๋น ๋ฅด๊ฒ ์ํ์ด ๊ฐ๋ฅํ๋ ํ ๋ฒ๋ง ์คํ๋๋ ์ฝ๋๋ผ๋ฉด ์ปดํ์ผํ์ง ์๊ณ ์ธํฐํ๋ฆฌํ ํ๋ ๊ฒ์ด ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ JIT์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ JVM๋ค์ ๋ด๋ถ์ ์ผ๋ก ๋ฉ์๋์ ๋น๋๋ฅผ ์ฒดํฌํ๊ณ ์ ๋๋ฅผ ๋์์ ๊ฒฝ์ฐ ์ํํ๋ ์์ผ๋ก ์ค์ผ์ค๋งํ๋ค.
Garbage Collector : ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฒดํฌํ๊ณ ์ ๊ฑฐํ๋ garbage Collection์ ์ํํ๋ ์ค๋ ๋๊ฐ ์กด์ฌํ๋ค.
Runtime Data Area
JVM๋ด์ ๋ฉ๋ชจ๋ฆฌ
PC Register : ์ค๋ ๋๊ฐ ์ด๋ค ๋ถ๋ถ์ ์ด๋ค ๋ช ๋ น์ผ๋ก ์คํํ ์ง๋ฅผ ๊ธฐ๋กํ๋ ๋ถ๋ถ์ผ๋ก ํ์ฌ ์คํ์ค์ธ ๋ฉ์๋๊ฐ ๋ค์ดํฐ๋ธ๊ฐ ์๋๋ฉด JVM๋ช ๋ น์ด ์์น์ ์ ์ฅ๋๊ณ ๋ค์ดํฐ๋ธ์ด๋ฉด ์ ์ฅ๋๋ ๊ฐ์ ์ ์ ๋์ง ์๊ณ CPU์ Register์ ๋ค๋ฅด๊ฒ ์ฐ์ฐ์ ์ํด ํ์ํ ํผ์ฐ์ฐ์๋ฅผ ์์๋ก ์ ์ฅํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
ํ์ฌ ์ํ์ค์ธ JVM ๋ช ๋ น์ ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
JVM Stack : ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด ๊ฐ๋ฑ ์ค๋ ๋๋ ๋ฉ์๋์ ๋ฐ์ดํฐ๋ค์ ์์๋ก ์ ์ฅํ๋ ๊ณต๊ฐ์ผ๋ก ์ค๋ ๋๋ง๋ค ๋ณ๋์ ๊ณต๊ฐ์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค
ํ๋ ์
์ด ์์ฑ๋์ด ์ด๊ณณ์ ์์ ๋ฐ์ดํฐ๊ณต๊ฐ์ผ๋ก ์ฌ์ฉํ๊ณ ๋ฉ์๋๊ฐ ๋๋๋ฉด ํ๋ ์์ ์ญ์ ๋๋ฉฐ ์ค๋ ๋๊ฐ ์ข ๋ฃ์ ์คํ๊ณต๊ฐ๋ ์ ๊ฑฐ๋๋ค.Native Method Stack : ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ๊ณต๊ฐ์ผ๋ก ์๋ฐ๊ฐ ์๋ ๋ค๋ฅธ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์คํ์ด๋ค.
Heap : ์ธ์คํด์คํ ๋ ๋ชจ๋ ํด๋์ค์ ๋ฐฐ์ด, ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ๋ชจ๋ JVM์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์์ด๊ณ
GC
์ ์ํด์๋ง ์์์ด ํ์๊ฐ๋ฅํ๋ค.Permanent Generation : ์์ฑ๋ ๊ฐ์ฒด๋ค์ ์ ๋ณด ์ฃผ์๊ฐ์ด ์ ์ฅ๋ ๊ณต๊ฐ์ผ๋ก
ํด๋์ค ๋ก๋
์ ์ํด ๋ก๋๋๋class
,Method
๋ฑ์ ๋ฉํ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญReflection(๊ฐ์ฒด๋ฅผ ํตํด ํด๋์ค์ ์ ๋ณด๋ฅผ ๋ถ์ํด๋ด๋ ํ๋ก๊ทธ๋จ ๊ธฐ๋ฒ)์ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํด๋์ค๊ฐ ๋ก๋ฉ๋๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ๋๋ค.
Young Generation
Eden : ๊ฐ์ฒด๋ค์ด ์ต์ด๋ก ์์ฑ๋๋ ๊ณต๊ฐ
Survivor 0/1 : Eden์์ ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ
๋๋ถ๋ถ์ ๊ฐ์ฒด๋ค์ด ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฐ์ฒด๊ฐ ์ด ์์ญ์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๊ณ ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋
Minor GC
๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ค.Old Generation : ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๋ก ๋ฐ๋์ง ์๊ณ Young ์์ญ์ ๋จ์ ์๋ ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ๋ก ๋ณต์ฌ๋๋ฉฐ, Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๊ณ GC๋ ์ ๊ฒ ๋ฐ์ํ๋ค.
์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋
Major GC
๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ค.
Method Area : ํด๋์ค ์ ๋ณด๋ฅผ ์ฒ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ๋ฆด๋ ์ด๊ธฐํ ๋์์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก
๋ฐํ์ ์์ ํ
,ํ๋์ ๋ฉ์๋ ๋ฐ์ดํฐ
,์์ฑ์
,๋ฉ์๋์ ์ฝ๋ ๋ด์ฉ
์ ์ ์ฅํ๋ค. (์ฌ์ค์ ์ปดํ์ผ ๋ ๋ฐ์ดํธ์ฝ๋์ ๋๋ถ๋ถ์ด ๋ฉ์๋ ๋ฐ์ดํธ ์ฝ๋์ด๊ณ ๋ฐ์ดํธ์ฝ๋์๋ ๋ฐํ์ ์์ํ์ด ์๋๋ผ ๊ทธ๋ฅ ์์ํ์ด ํฌํจ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ๋ชจ๋ ๋ฐ์ดํธ์ฝ๋๊ฐ ์ฌ๋ผ๊ฐ๋ค๊ณ ๋ด๋ ๋ฌด๋ฐฉํ๋ค.)๋ฐํ์ ์์ํ์ ์ด ์์ํ์ ๋ฐํ์ผ๋ก ๋ฐํ์(๋ฉ์๋ ์์ญ์ ์ ์ฅ๋ ๋)์ ๋ง๋ค์ด์ง๋ค.
JDK์ JRE ์ฐจ์ด
JDK : Java Development kit์ ์ฝ์๋ก
์ปดํ์ผ๋ฌ
,์ญ ์ด์ ๋ธ๋ฌ
,๋๋ฒ๊ฑฐ
,์์กด๊ด๊ณ ๋ถ์
๋ฑ ๊ฐ๋ฐ์ ํ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตJRE : Java Runtime Envirmont์ ์ฝ์๋ก
Class Loader
,์คํ ๋ช ๋ น(java)
์ ๊ฐ์ด ์คํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตJVM : Java Virtual Machine์ ์ฝ์๋ก
์ธํฐํ๋ฆฌํฐ
,JIT
๋ฑ์ ์ด์ฉํ์ฌ ๋ฐ์ดํธ ์ฝ๋๋ฅผ OS์ ๋ง๊ฒ ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํ์ฌ OS์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ ๋ ์ ์๋๋ก ์ถ์ํ๋ฅผ ์ ๊ณต
OracleJDK ์ OpenJDK์ ์ฐจ์ด
JVM์ ORACLE
์ด๋ผ๋ ๊ธฐ์
์ด JVM์ ํ์ค์ ์ ์ํ๋ฉด Amazon
์ด๋ Oracle
,Azul
์ ๊ฐ์ ๊ธฐ์
๋ค์ด ํ์ค์ ๋ฐ๋ผ ์ค๋ฌผ์ ๋ง๋ค์ด ์ ๊ณตํ๊ฒ ๋๋ค.
์ด๋, ์คํ๊ณผ ํ์ค์ ์ ์ํ Oracle์ด ๋ฐฐํฌํ JDK๊ฐ OracleJDK์ด๋ฉฐ, ๊ฐ๊ฒฉ ์ ์ฑ ์ด ์กด์ฌํ๋ค.
๋ค๋ฅธ ๊ธฐ์ ๋ค์ด ๋ฌด๋ฃ๋ก ๋ฐฐํฌํ JDK๋ฅผ OpenJDK๋ผ๊ณ ํ๋ค.
Reference
https://asfirstalways.tistory.com/158 https://m.blog.naver.com/ehcibear314/221228200531 https://catch-me-java.tistory.com/9 https://homoefficio.github.io/2019/01/31/Back-to-the-Essence-Java-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C-%EC%8B%A4%ED%96%89%EA%B9%8C%EC%A7%80-2/
Last updated