[Java] ๐Ÿค– JVM์ด๋ž€?

Sangho Hanยท2025๋…„ 5์›” 29์ผ
4

โ˜•๏ธย Java

๋ชฉ๋ก ๋ณด๊ธฐ
16/20
post-thumbnail

๐Ÿค– JVM์ด๋ž€?

JVM(Java Virtual Machine)์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ(์ถ”์ƒํ™”๋œ ๊ธฐ๊ณ„)์ด๋‹ค.

WORA?

์ž๋ฐ”์—๋Š” WORA๋ผ๋Š” ์ค‘์š”ํ•œ ํŠน์ง•์ด ์กด์žฌํ•œ๋‹ค.
์ด๋Š” "Write Once Run Anywhere" ์˜ ์ค€๋ง๋กœ, ํ•œ ๋ฒˆ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ์–ด๋””์—์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค.

์ฆ‰, ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ์„ ํ•ด ๋‘๋ฉด ์–ด๋–ค OS ์œ„์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋ฅผ OS ์ข…์†์ ์ด์ง€ ์•Š๋‹ค๊ณ ๋„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ํŠน์ง•์€ ๊ธฐ์กด์˜ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด, C์–ธ์–ด์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•ด์ฃผ์—ˆ๊ณ , ์ด๋กœ ์ธํ•ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ž๋ฐ”๋ฅผ ์• ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ JVM์˜ ์—ญํ• ์ด๋‹ค.

์ปดํŒŒ์ผ

Java๋Š” *.java, Python์€ *.py์™€ ๊ฐ™์€ ์›์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

์ด๋Š” ์ธ๊ฐ„์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ณ ์ˆ˜์ค€ ์–ธ์–ด๋กœ, CPU๊ฐ€ ์ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ์„ ํ•ด ์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ ์ž๋ฐ”๋Š” JVM์„ ๊ฑฐ์ณ์„œ OS๋กœ ๋„๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, JVM์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” Java Bytecode๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

Java Bytecode

์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š”, JVM์˜ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ด๋‹ค. ํ•ด๋‹น ๋ฐ”์ดํŠธ์ฝ”๋“œ์™€ JVM์˜ ๋™์ž‘์€ ์ผ๊ด€๋˜๊ธฐ ๋•Œ๋ฌธ์—, OS์˜ ๊ตฌ๋ถ„ ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ๊ฐ ๋ช…๋ น์–ด๊ฐ€ 1๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ด๋ฆ„์ด ๋ถ™์—ˆ๋‹ค.

Java Compiler

๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์—ญํ• ์€ ๋ˆ„๊ฐ€ ํ• ๊นŒ?

์ด๋Š” Java Compiler๊ฐ€ ๋งก์œผ๋ฉฐ, JDK๋ฅผ ์„ค์น˜ํ•˜๋ฉด bin ๋‚ด์— ์กด์žฌํ•˜๋Š” javac.exe๋ฅผ ๋งํ•œ๋‹ค.

test.java๋ผ๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.
์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, .java(์›์‹œ ์ฝ”๋“œ) -> .class(๋ฐ”์ดํŠธ์ฝ”๋“œ)๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

javac test.java

๊ทธ๋Ÿผ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ๋ฐ”์ดํŠธ์ฝ”๋“œ .class ํŒŒ์ผ์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

JIT ์ปดํŒŒ์ผ๋Ÿฌ

๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” JVM์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
JVM์€ ์ด๋ฅผ ์ฝ๊ณ  ์ปดํ“จํ„ฐ๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ

์ด์ง„ ์ฝ”๋“œ๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, 0๊ณผ 1๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
CPU๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ธ ๊ธฐ๊ณ„์–ด๋Š” ํ•ด๋‹น ์ด์ง„ ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ -> ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด JIT ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค.

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋™์  ๋ฒˆ์—ญ์„ ํ•œ๋‹ค๊ณ ๋„ ๋งํ•˜๋Š”๋ฐ, ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ์— Just-In-Time(JIT) ์ปดํŒŒ์ผ๋Ÿฌ์ธ ๊ฒƒ์ด๋‹ค.

JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ๊ธด ์ด์œ 

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์žˆ๋˜ ์š”์†Œ๋Š” ์•„๋‹ˆ๋‹ค.

์ž๋ฐ”๋Š” WORA๋ผ๋Š” ์žฅ์ ์ด ์กด์žฌํ•˜์ง€๋งŒ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๋‹ค.

  1. ์›์‹œ์ฝ”๋“œ๋ฅผ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.
  2. ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ JVM์ด ํ•œ ์ค„์”ฉ, ์ฆ‰ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ์ฝ์–ด์„œ ์‹คํ–‰ํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด์„œ ์„ฑ๋Šฅ์ด ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ–ˆ๊ณ , ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํƒ„์ƒํ•œ ๊ฒƒ์ด JIT ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— ์ž๋ฐ”๋Š” ์ปดํŒŒ์ผ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์–ธ์–ด๋ผ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ๋งž์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๊ธ€๋กœ ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค.


๐Ÿ› ๏ธ JVM์˜ ๊ตฌ์„ฑ ์š”์†Œ

JVM์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

  1. ํด๋ž˜์Šค ๋กœ๋”(Class Loader)
  2. ์‹คํ–‰ ์—”์ง„(Execution Engine)
    2-1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter)
    2-2. JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-In-Time Compiler)
    2-3. ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ(Garbage Collector)
  3. ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)

1. ํด๋ž˜์Šค ๋กœ๋”(Class Loader)

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ ๋ฐ ์ž์„ธํ•œ ์„ค๋ช… ๊ธ€

ํด๋ž˜์Šค ๋กœ๋”๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ, JVM ๋‚ด์— .class ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ๋งํฌ๋ฅผ ํ†ตํ•ด ๋ฐฐ์น˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค.

์ž๋ฐ”๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹Œ, ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํด๋ž˜์Šค ๋กœ๋”ฉ ๋ฐ ๋งํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๋™์  ๋กœ๋”ฉ(Dynamic Loading) ๋ฐฉ์‹์„ ๋”ฐ๋ฅธ๋‹ค.

์—ฌ๊ธฐ์„œ JVM์˜ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ๋™์ ์œผ๋กœ ํด๋ž˜์Šค ๋กœ๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ด ํด๋ž˜์Šค ๋กœ๋”์ด๋‹ค.

ํด๋ž˜์Šค ๋กœ๋” 3๋‹จ๊ณ„

ํด๋ž˜์Šค ๋กœ๋”๋Š” 3๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค.

๋กœ๋”ฉ

  • ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๋ฅผ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์ €์žฅํ•œ๋‹ค.
  • ๊ฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” JVM์— ์˜ํ•ด์„œ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ๋‹ค์Œ ์ •๋ณด๋“ค์„ ์ €์žฅํ•œ๋‹ค.
    1) ๋กœ๋“œ๋œ ํด๋ž˜์Šค + ๊ทธ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ •๋ณด
    2) ํด๋ž˜์Šค ํŒŒ์ผ๊ณผ Class, Interface, Enum์˜ ๊ด€๋ จ ์—ฌ๋ถ€
    3) ๋ณ€์ˆ˜ & ๋ฉ”์†Œ๋“œ ๋“ฑ ์ •๋ณด

๋งํฌ
1) ๊ฒ€์ฆ : ์ฝ์€ ํด๋ž˜์Šค(๋ฐ”์ดํŠธ์ฝ”๋“œ)๊ฐ€ ์ž๋ฐ” ์–ธ์–ด ๋ช…์„ธ ๋ฐ JVM ๋ช…์„ธ์— ๋ช…์‹œ๋œ๋Œ€๋กœ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
2) ์ค€๋น„ : ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ํ•„๋“œ & ๋ฉ”์†Œ๋“œ & ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ค€๋น„ํ•œ๋‹ค.
3) ๋ถ„์„ : ์‹ฌ๋ณผ๋ฆญ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์žˆ๋Š” ์‹ค์ œ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๊ต์ฒดํ•œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ๊ฒ€์ฆ์€ JVM ๋‚ด๋ถ€์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ฒ€์ฆ๊ธฐ(Verifier)๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Java Language Specification (JLS, ์ž๋ฐ” ๋ช…์„ธ) & Java Virtual Machine Specification (JVMS, JVM ๋ช…์„ธ)๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

์ดˆ๊ธฐํ™”

  • ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”, ์ฆ‰ static ํ•„๋“œ๋“ค์ด ์„ค์ •๋œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ static ํ•„๋“œ๋งŒ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ด์œ ?

ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ๋Š” static ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด static ํ•„๋“œ๋Š” ํด๋ž˜์Šค ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ „์—ญ์ ์ธ ์ž์›์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ ํ•ด๋‹น ์ž์›์€ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, JVM์€ ํด๋ž˜์Šค๊ฐ€ ์ฒ˜์Œ ๋กœ๋”ฉ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ดํ›„์—๋Š” ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐ˜๋ฉด, non-static ํ•„๋“œ๋Š” ๊ฐ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๋ฉฐ, ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ๋ณ„๋„๋กœ ์ดˆ๊ธฐํ™”๋˜๋ฏ€๋กœ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ๋Š” ์ฒ˜๋ฆฌ ๋Œ€์ƒ์ด ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”๋Š” ์ „์—ญ์ ์ธ ์ž์›์˜ ์ผ๊ด€์„ฑ๊ณผ ํšจ์œจ์ ์ธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด static ํ•„๋“œ์™€ static ๋ธ”๋ก๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

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

์‹ค์งˆ์ ์œผ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณณ์ด๋‹ค.

ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ JVM ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ ๋‚ด์— ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ฐฐ์น˜์‹œํ‚ค๊ฒŒ ๋˜๊ณ , ์ด๋ฅผ ์‹คํ–‰ ์—”์ง„์ด ์‹คํ–‰ํ•œ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์•„๋ž˜ 3๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ
  2. JIT ์ปดํŒŒ์ผ๋Ÿฌ
  3. GC(Garbage Collector)

1, 2๋ฒˆ์€ ์œ„ JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ๊ธด ์ด์œ ์—์„œ ์„ค๋ช…ํ–ˆ์œผ๋‹ˆ ๋„˜์–ด๊ฐ€๊ณ , 3๋ฒˆ GC์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค.

GC(Garbage Collector)

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” JVM์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด(๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด)๋ฅผ ์ž๋™์œผ๋กœ ํƒ์ง€ํ•˜๊ณ  ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ž๋ฐ”์˜ ์•ˆ์ „์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

GC์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด๋‹น ๊ธ€๋กœ ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค.

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

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ JVM์ด ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ๊ตฌ์กฐ๋ฅผ ๋œปํ•œ๋‹ค.

์ด๋Š” ํด๋ž˜์Šค ์ •๋ณด, ๊ฐ์ฒด, ๋ณ€์ˆ˜, ์Šค๋ ˆ๋“œ ์‹คํ–‰ ์ •๋ณด ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

PC Register

๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค 1๊ฐœ์”ฉ ์กด์žฌํ•˜๋Š” ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ, ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋  ๋•Œ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.

ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋ฉฐ, JVM์ด ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ๋‹ค์Œ์— ์‹คํ–‰ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ, ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ฐ„์„ญ ์—†์ด ๋ช…๋ น์–ด ์‹คํ–‰ ํ๋ฆ„์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

JVM Stack

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰๊ณผ์ •์—์„œ ์ž„์‹œ๋กœ ํ• ๋‹น๋˜์—ˆ๋‹ค๊ฐ€, ๋ฉ”์„œ๋“œ๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด ์†Œ๋ฉธ๋˜๋Š” ํŠน์„ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์˜์—ญ์ด๋‹ค.

๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ์˜์—ญ์— ๊ณ ์œ ํ•œ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋œ๋‹ค. ๋ฉ”์„œ๋“œ ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ํ”„๋ ˆ์ž„์ด ์ œ๊ฑฐ๋œ๋‹ค.

์ด ์˜์—ญ์—๋Š” ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’, ์—ฐ์‚ฐ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ, ๊ทธ๋ฆฌ๊ณ  ํž™ ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ ๊ฐ’(์ฃผ์†Œ) ๋“ฑ์ด ์ €์žฅ๋œ๋‹ค.

PC Register ์˜์—ญ๊ณผ ๋™์ผํ•˜๊ฒŒ ์Šค๋ ˆ๋“œ๋‹น 1๊ฐœ์”ฉ ์ƒ์„ฑ๋œ๋‹ค. ๋˜ํ•œ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ ์‹œ ํ•จ๊ป˜ ์†Œ๋ฉธํ•œ๋‹ค.

Native Method Stack

Native Method Stack์€ ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ, C/C++ ๋“ฑ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ(native method)๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์Šค๋ ˆ๋“œ๋ณ„ ์Šคํƒ ์˜์—ญ์ด๋‹ค.

JVM์€ JNI(Java Native Interface)๋ฅผ ํ†ตํ•ด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๊ธฐ๊ณ„์–ด ์ˆ˜์ค€์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•œ ๋ณ„๋„์˜ ํ˜ธ์ถœ ์Šคํƒ์ด ์‚ฌ์šฉ๋œ๋‹ค.

์ด ์˜์—ญ์€ ์šด์˜์ฒด์ œ์˜ ํ˜ธ์ถœ ๊ทœ์•ฝ์— ๋”ฐ๋ผ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ •๋ณด(๋ฆฌํ„ด ์ฃผ์†Œ, ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ ๋ณ€์ˆ˜ ๋“ฑ)๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์ธ C ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

์ด ์Šคํƒ ์—ญ์‹œ ํฌ๊ธฐ์—๋Š” ์ œํ•œ์ด ์žˆ์œผ๋ฉฐ, ๊ณผ๋„ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ์ด๋‚˜ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ์‹œ StackOverflowError๋‚˜ OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ† ์Šค SLASH22 - Java Native Memory Leak ์›์ธ์„ ์ฐพ์•„์„œ

Method Area(=Static Area)

Method Area๋Š” JVM์ด ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ฒ˜์Œ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•  ๋•Œ, ํ•ด๋‹น ํด๋ž˜์Šค ์ˆ˜์ค€์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

์—ฌ๊ธฐ์—๋Š” ํด๋ž˜์Šค ์ด๋ฆ„, ๋ถ€๋ชจ ํด๋ž˜์Šค ์ •๋ณด, static ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ์ •๋ณด, ์ƒ์ˆ˜ ํ’€(Runtime Constant Pool) ๋“ฑ์ด ์ €์žฅ๋œ๋‹ค.

๋˜ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ static ํ•„๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’ ํ• ๋‹น ๋ฐ static ๋ธ”๋ก ์‹คํ–‰ ์ „๊นŒ์ง€์˜ ์ •๋ณด๊ฐ€ ์ด ์˜์—ญ์— ์ค€๋น„๋œ๋‹ค.

Runtime Constant Pool(๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€)

ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌํ„ฐ๋Ÿด(๋ฌธ์ž์—ด, ์ˆซ์ž ์ƒ์ˆ˜ ๋“ฑ)์ด๋‚˜ ๊ธฐํ˜ธ ์ฐธ์กฐ ์ •๋ณด(๋ฉ”์„œ๋“œ/ํ•„๋“œ ์ฐธ์กฐ, ํด๋ž˜์Šค ์ด๋ฆ„ ๋“ฑ)๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ๋กœ,
JVM์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ์ƒ์ˆ˜ ๋ฐ ์ฐธ์กฐ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Heap

Heap์€ ์ž๋ฐ”์—์„œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค.
new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋Š” Heap์— ์ €์žฅ๋˜๋ฉฐ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)์˜ ๊ด€๋ฆฌ ๋Œ€์ƒ์ด ๋œ๋‹ค.

ํž™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

1. Young Generation
์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์œผ๋กœ, Minor GC๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜์—ฌ ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค.
Eden, Survivor ์˜์—ญ(S0, S1)์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

2. Old Generation
Young ์˜์—ญ์„ ์ง€๋‚˜ ์‚ด์•„๋‚จ์€ ์˜ค๋ž˜๋œ ๊ฐ์ฒด๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ณณ์ด๋‹ค.
YG์— ๋น„ํ•ด์„œ ์ƒ๋Œ€์ ์œผ๋กœ GC๊ฐ€ ์ ๊ฒŒ ๋ฐœ์ƒํ•˜๋ฉฐ, Major GC ๋˜๋Š” Full GC์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

3. Metaspace(Permanent Generation)
ํด๋ž˜์Šค ๋ฉ”ํƒ€์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์œผ๋กœ, JVM์ด ์•„๋‹Œ OS๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

์™œ Metaspace๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

1. PermGen์˜ ๋‹จ์  ๋ณด์™„ ๋ชฉ์ 
Java 8 ์ด์ „์—๋Š” PermGen์ด๋ผ๋Š” ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •์ด๋ผ OOM์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

2. ์œ ์—ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
Java 8๋ถ€ํ„ฐ ๋„์ž…๋œ Metaspace๋Š” JVM ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์‹ , OS๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๋งŒํผ ๋™์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด, PermGen๋ณด๋‹ค ํ›จ์”ฌ ์•ˆ์ •์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ 1
์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ 2
์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ 3

profile
์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํ•œ์ƒํ˜ธ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€