JVM

Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ ๋จธ์‹  ์œผ๋กœ, Java ์ฝ”๋“œ (๋ฐ”์ดํŠธ์ฝ”๋“œ) ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•จ.

ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ ์„ ์ œ๊ณตํ•˜๋ฉฐ, Java ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ.


1. JVM ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

1.1 ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ ์ œ๊ณต

  • Java ์ฝ”๋“œ๋Š” .class ํŒŒ์ผ(๋ฐ”์ดํŠธ์ฝ”๋“œ)๋กœ ๋ณ€ํ™˜๋จ.

  • JVM์ด ํ•ด๋‹น ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์šด์˜์ฒด์ œ(OS)์™€ ์ƒ๊ด€์—†์ด ์‹คํ–‰ ๊ฐ€๋Šฅ

  • "Write Once, Run Anywhere(WORA)" ๊ฐœ๋… ๊ตฌํ˜„

1.2 ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ(Garbage Collection)

  • JVM ์€ Heap ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ

  • Garbage Collector(GC) ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ์ ํ™”

1.3 ์‹คํ–‰ ์ตœ์ ํ™”(JIT ์ปดํŒŒ์ผ๋Ÿฌ)

  • Java ์ฝ”๋“œ๋Š” ์ฒ˜์Œ์—๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, JVM ์˜ JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ€ ์‹คํ–‰ ์ค‘ ์ผ๋ถ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ


2. JVM ์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

JVM ์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋จ.

2.1 ํด๋ž˜์Šค ๋กœ๋” ์‹œ์Šคํ…œ(Class Loader System)

  • ํด๋ž˜์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๊ณ  ๋งํฌ, ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• 

  • Java ์ฝ”๋“œ(.java ) โ‡’ ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class ) ๋ณ€ํ™˜ ํ›„ JVM ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋จ.

ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ณผ์ •

  1. ๋กœ๋”ฉ(Loading) : .class ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ

  2. ๋žญํ‚น(Ranking) :

    1. ๊ฒ€์ฆ(Verification) : ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ

    2. ์ค€๋น„(Preparation) : ์ •์  ๋ณ€์ˆ˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

    3. ํ•ด์„(Resolution) : ์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์‹ค์ œ ์ฐธ์กฐ๋กœ ๋ณ€ํ™˜

  3. ์ดˆ๊ธฐํ™”(Initialization) : static ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ๋ฐ static ๋ธ”๋ก ์‹คํ–‰

ํด๋ž˜์Šค ๋กœ๋” ์œ ํ˜•

  • Bootstrap ClassLoader : java.lang ํŒจํ‚ค์ง€ ๋“ฑ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ

  • Extension ClassLoader : ext ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ

  • Application ClassLoader : ํด๋ž˜์ŠคํŒจ์Šค์—์„œ ์‚ฌ์šฉ์ž ํด๋ž˜์Šค ๋กœ๋“œ

2.2 ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)

JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰จ

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

  1. Method Area(๋ฉ”์„œ๋“œ ์˜์—ญ)

    1. ํด๋ž˜์Šค ์ •๋ณด, ์ •์  ๋ณ€์ˆ˜, ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€์„ ์ €์žฅ

    2. ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ (Static Data ์ €์žฅ)

  2. Heap Area(ํž™ ์˜์—ญ)

    1. ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„

    2. ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ 

    3. Garbage Collector(GC) ๊ด€๋ฆฌ ๋Œ€์ƒ

  3. Stack Area(์Šคํƒ ์˜์—ญ)

    1. ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋จ.

    2. ์ง€์—ญ ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ •๋ณด ์ €์žฅ

  4. PC Register(PC ๋ ˆ์ง€์Šคํ„ฐ)

    1. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ ๋ฅผ ์ €์žฅ

    2. ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ๋ณ„๋„๋กœ ์กด์žฌ

  5. Native Method Stack(๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ)

    1. JNI(Java Native Interface) ๊ธฐ๋ฐ˜์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ(C/C++ ๋“ฑ) ์‹คํ–‰์„ ์œ„ํ•œ ๊ณต๊ฐ„

2.3 ์‹คํ–‰ ์—”์ง„(Execution Engine)

JVM ์—์„œ ์‹ค์ œ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ

์‹คํ–‰ ๊ณผ์ •

  1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ

    1. ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•œ์ค„ ์”ฉ ์ฝ์–ด ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰

    2. ์‹คํ–‰ ์†๋„๊ฐ€ ๋А๋ฆฌ์ง€๋งŒ, ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ

  2. JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ

    1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์†๋„๋ฅผ ํ–ฅ์ƒ

    2. HotSpot JVM ์—์„œ ํ™œ์šฉ

  3. Garbage Collector(GC)

    1. Heap ์˜์—ญ์˜ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ์ ํ™”


3. JVM ์˜ ์‹คํ–‰ ๊ณผ์ •

Java ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ๋ฆ„

  1. ์†Œ์Šค ์ฝ”๋“œ ์ž‘์„ฑ(.java ํŒŒ์ผ)

  2. ์ปดํŒŒ์ผ(javac ์‚ฌ์šฉํ•˜์—ฌ .class ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ƒ์„ฑ)

  3. JVM ์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋กœ๋“œ(Class Loader ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋กœ๋“œ)

  4. ๋ฐ”์ดํŠธ์ฝ”๋“œ ์‹คํ–‰ (Execution Engine ์ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ/JIT ๋กœ ์‹คํ–‰)

  5. Garbage Collector๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ


4. JVM ๊ณผ JDK, JRE ์˜ ์ฐจ์ด์ 

๊ตฌ์„ฑ ์š”์†Œ

์„ค๋ช…

JVM (Java Virtual Machine)

๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ 

JRE (Java Runtime Environment)

JVM + ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Java ์‹คํ–‰ ํ™˜๊ฒฝ)

JDK (Java Development Kit)

JRE + Java ๊ฐœ๋ฐœ ๋„๊ตฌ (์ปดํŒŒ์ผ๋Ÿฌ, ๋””๋ฒ„๊ฑฐ ํฌํ•จ)

JVM โ†’ JRE โ†’ JDK ์ˆœ์œผ๋กœ ํฌํ•จ ๊ด€๊ณ„๊ฐ€ ์žˆ์Œ. ์ฆ‰, JDK๋ฅผ ์„ค์น˜ํ•˜๋ฉด JRE์™€ JVM์ด ํฌํ•จ๋จ.


5. JVM ํŠœ๋‹ ๋ฐ ์ตœ์ ํ™”

JVM ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•จ.

JVM ์˜ต์…˜ ์˜ˆ์ œ

java -Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200

-Xms512m

์ดˆ๊ธฐ Heap ํฌ๊ธฐ 512MB ์„ค์ •

-Xmx2g

์ตœ๋Œ€ Heap ํฌ๊ธฐ 2GB ์„ค์ •

-XX:+UseG1GC

G1 Garbage Collector ์‚ฌ์šฉ

-XX:MaxGCPauseMillis=200

GC ์ตœ๋Œ€ ์ •์ง€ ์‹œ๊ฐ„ 200ms๋กœ ์ œํ•œ


6. JVM Garbage Collection (GC)

JVM ์€ GC(Garbage Collection) ์„ ํ†ตํ•ด Heap ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™ ๊ด€๋ฆฌํ•จ.

GC ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. Serial GC โ‡’ ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ์—์„œ GC ์ˆ˜ํ–‰(์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉ)

  2. Parallel GC โ‡’ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋กœ GC ์ˆ˜ํ–‰(๋ฉ€ํ‹ฐ์ฝ”์–ด ํ™˜๊ฒฝ์— ์ ํ•ฉ)

  3. CMS GC(Concurrent Mark Sweap) โ‡’ ์‘๋‹ต ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ

  4. G1 GC(Garbage First GC) โ‡’ ์ตœ์‹  GC, ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ตœ์ ํ™”

GC ๋™์ž‘ ๋ฐฉ์‹

  1. Young Generation(Eden + Survivor)

    1. ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋จ.

    2. Minor GC ๋ฐœ์ƒ ์‹œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Survivor ๋กœ ์ด๋™

  2. Old Generation(Tenured)

    1. Young Generation ์„ ์ง€๋‚˜ ์˜ค๋ž˜๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋จ.

    2. Major GC/ Full GC ๋ฐœ์ƒ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜

  3. Permanent Generation(Metaspace)

    1. ํด๋ž˜์Šค ์ •๋ณด์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ(Java 8 ์ดํ›„ Metaspace๋กœ ๋ณ€๊ฒฝ)

Last updated

Was this helpful?