๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Š Java & Kotlin & Spring/- Java & kotlin

[์กฐ๊ธˆ ๋” ๊นŠ์€ Java] JVM์˜ Runtime Data Area, Execution Engine, Garbage Collection ์— ๋Œ€ํ•ด์„œ

by Wonit 2021. 12. 5.

 

์ž๋ฐ”๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค๋ฉด ์ตํžˆ ๋“ค์—ˆ์„ JVM, Java Virtual Machine ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

๋ง‰์—ฐํ•˜๊ฒŒ JVM ์ด ๋™์ž‘ํ•˜๊ณ  JVM์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ ์ด๋ฉฐ Garbage Collection ์œผ๋กœ ์žฅ์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค.

 

์˜ค๋Š˜์€ JRE์˜ ๊ตฌ์„ฑ์š”์†Œ์ธ JVM์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๊ณ  Garbage Collection ์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

JVM ์ด๋ž€?

 

์ง€๋‚œ 2๋ฒˆ์˜ ์‹œ๊ฐ„์— ๊ฑฐ์ณ ์šฐ๋ฆฌ๋Š” Java Bytecode์™€ Java ClassLoader ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

 

์ง€๋‚œ ์‹œ๊ฐ„์—๋Š” ์–ด๋–ป๊ฒŒ ์ž๋ฐ” ํŒŒ์ผ์ด ์ปดํŒŒ์ผ๋˜์–ด ํด๋ž˜์Šค ํŒŒ์ผ๋กœ ๋ณ€ํ™˜์ด ๋˜๊ณ , ์–ด๋–ป๊ฒŒ ํด๋ž˜์Šค๋กœ๋”์— ์˜ํ•ด์„œ ๋™์  ์ ์žฌ๋˜๋ฉฐ verification ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์•˜๋‹ค.

 

์˜ค๋Š˜์€ ๊ทธ ์ดํ›„์— ์ผ์–ด๋‚  ํด๋ž˜์Šค๋กœ๋”์— ์˜ํ•ด์„œ ๋กœ๋“œ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ Runtime Data Areas ์— ๋กœ๋“œ๋˜๊ณ  Execution Engine ์ด ๋กœ๋“œ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค ํ•˜๊ณ  ์ด๊ฒƒ์ด ๋ฐ”๋กœ JVM์ด ํ•˜๋Š” ์ผ์ด๋‹ค.

 

 

JVM์€ Java Virtual Machine ์œผ๋กœ Host Machine ๋‚ด์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” Machine ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตํžˆ ๋“ค์—ˆ์„ ์ž๋ฐ”์˜ ์ด์‹์„ฑ์ด๋ผ๋Š” ํŠน์ง•์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

JVM์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

 

  1. Stack Based Machine
  2. Register Based Machine

 

1. Stack Based Machine

 

์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” JVM์ด ๋ชจ๋‘ ์Šคํƒ ๊ธฐ๋ฐ˜ ๋จธ์‹ ์ด๋‹ค.

 

์Šคํƒ ๊ธฐ๋ฐ˜ ๋จธ์‹ ์€ target hardware ์— ๋Œ€ํ•œ ์ข…์†์ด ์ ๊ธฐ ๋•Œ๋ฌธ์— ์ด์‹์„ฑ์ด ๋›ฐ์–ด๋‚˜์•ผํ•˜๋Š” VM์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ Stack ์˜ ํŠน์„ฑ์„ ๋”ฐ๋ผ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœ ๋ง์…ˆ์˜ ์—ฐ์‚ฐ์—๋„ 4๋‹จ๊ณ„ ๋ช…๋ น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

POP 10
POP 20
ADD 10, 20 RESULT
PUSH RESULT

์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Stack Based JVM์—์„œ๋Š” Oracle์˜ Hotspot JVM๊ณผ Eclipse์˜ OpenJ9 ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

Oracle์˜ Hotspot JDK ๋Š” CPU ํšจ์œจ์ด ์ข‹๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๊ณ  OpenJDK์˜ OpenJ9 ์€ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๋Š”๋ฐ, ์ด ๋‘ JDK์˜ ๋น„๊ต๋Š” ์•„๋ž˜์—์„œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. Register Based Machine

 

ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์™€ ๋ชฉ์ ์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” JVM ์ธ๋ฐ, ์•ˆ๋“œ๋กœ์ด๋“œ์˜ Dalvik JVM์ด ๊ทธ๋ ‡๋‹ค๊ณ  ํ•œ๋‹ค.

 

Dalvik JVM์€ ์ผ๋ฐ˜ JVM์˜ ๋ช…์„ธ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ๋Œ€์‹  ํšจ์œจ๊ณผ ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๋‹ค.

 

  • 30% fewer instruction
  • 35% fewer code units
  • 35% more bytes in instruction stream

์ด๋ผ๋Š” ์žฅ์ ๊ณผ ํŠน์ง•์ด ์กด์žฌํ•˜์ง€๋งŒ ํ•˜๋“œ์›จ์–ด (์•ˆ๋“œ๋กœ์ด๋“œ)์— ์ข…์†์ ์ด๋ผ๋Š” ํŠน์„ฑ์œผ๋กœ ์ธํ•ด์„œ ์ด์‹์„ฑ์ด ๋›ฐ์–ด๋‚จ์„ ํฌ๊ธฐํ•œ case ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

JVM ์˜ ๊ตฌ์„ฑ์š”์†Œ

 

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

 

  1. Runtime Data Areas
  2. Execution Engine
  3. Garbage Collection

 

ํ•˜๋‚˜ ํ•˜๋‚˜ ๊ฐ๊ฐ ์•Œ์•„๋ณด์ž

 

1. Runtime Data Areas

 

์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•˜๋Š” Runtime Area ๋Š” ํด๋ž˜์Šค๋กœ๋”๊ฐ€ Bytecode ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋Œ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

 

์ด๋Š” OS๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›๋Š” ์‹ค์ œ์  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑํ•œ ๋ชจ๋“  ์ฝ”๋“œ์˜ ๋™์ž‘์€ ์ด ๋ฉ”๋ชจ๋ฆฌ ์œ„์—์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

Runtime Data Area ๋Š” Thread๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Thread๊ฐ€ ๋‹ค๋ฅธ Thread ์™€ ๊ณต์œ ํ•˜๋Š” ์—ฌ๋ถ€์™€ ๊ณต์œ ํ•˜์ง€ ๋ชปํ•˜๋Š” ์—ฌ๋ถ€์— ๋”ฐ๋ผ์„œ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค.

 

Thread ๋ณ„๋กœ ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ : PC Register, JVM Stack, Native Method Stack

  • PC Register
    • Program Count Register ๋Š” ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ JVM Instruction ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
    • Register Based ์ธ CPU ๋‚ด์˜ PC์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Stack-Based ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • JVM Stack
    • Thread ์˜ Method ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ์˜ ์ˆ˜ํ–‰ ์ •๋ณด์™€ ๊ฐ™์€ StackFrame ์˜ ์ •๋ณด, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ฃผ์†Œ, ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ˆ˜ํ–‰ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • Exception.printStackTrace() ์— ๋‚˜์˜ค๋Š” ์ •๋ณด๊ฐ€ ๋ฐ”๋กœ JVM ์Šคํƒ์˜ ์ •๋ณด์ด๋‹ค.
  • Native Method Stack
    • Java ์™ธ์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ Native Code ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ Stack์ด๋‹ค.
    • JNI ๋ฅผ ํ†ตํ•ด์„œ ํ˜ธ์ถœ๋˜๋Š” C๋‚˜ C++์˜ ์ฝ”๋“œ์— ๋งž๊ฒŒ ์Šคํƒ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

๋ชจ๋“  Thread ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ : Heap, Method Area, Runtime Constant Pool

  • Heap
    • ์ผ๋ฐ˜์ ์ธ Heap Memory ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    • ์ธ์Šคํ„ด์Šค๋‚˜ ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ์„ ๋™์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ์ด๊ณณ์ด ๋ฐ”๋กœ Garbage Collection์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
    • JVM ์„ฑ๋Šฅ ์ด์Šˆ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰๋˜๋Š” ๊ณต๊ฐ„์ด๊ธฐ๋„ ํ•˜๋‹ค.
  • Method Area
    • ClassLoader ๊ฐ€ ์ ์žฌํ•œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
    • ๋…ผ๋ฆฌ์ ์œผ๋กœ Heap ์— ํฌํ•จ๋˜๋Š”๋ฐ PermGen ์ด๋ผ๋Š” ์˜์—ญ์ด๋‹ค
    • Java 8 ์ดํ›„๋ถ€ํ„ฐ Metaspace OS๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ์˜ฎ๊ฒจ์ง€๊ฒŒ ๋œ๋‹ค.
      • ์ด๋Š” ์ถ”ํ›„์— ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ๋”ฐ๋กœ ํฌ์ŠคํŒ…์„ ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.
  • Runtime Constant Pool
    • Method Area ๋‚ด๋ถ€์— ์†ํ•œ ์˜์—ญ์œผ๋กœ ๋ชจ๋“  Constant ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ์ด์™ธ์—๋„ Class Variable, Field Information, Type Information ๋“ฑ์ด Method Area ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

 

2. Execution Engine

์‹คํ–‰ ์—”์ง„, Execution Engine ์€ Runtime Data Area ์— ์ž˜ ํ• ๋‹น๋œ Bytecode ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

CPU๋Š” Java Bytecode ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.

 

 

๊ทธ๋ž˜์„œ Bytecode๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ๊ผญ ํ•„์š”ํ•œ๋ฐ, ์ด ๊ณผ์ •์œผ๋กœ ์ธํ•ด์„œ Java๊ฐ€ C๋‚˜ C++์— ๋น„ํ•ด ๋Š๋ฆฌ๋‹ค๊ณ  ํ•œ๋‹ค.

 

Bytecode๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์ฝ๊ณ  ๋ฒˆ์—ญํ•˜๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค.

 

  1. Interpreter ๋ฐฉ์‹
  2. JIT(Just In Time) ์ปดํŒŒ์ผ ํ˜น์€ ๋™์  ๋ฒˆ์—ญ ๋ฐฉ์‹

 

Interpreter ๋ฐฉ์‹์€ ๊ฐ OS ํ”Œ๋žซํผ์— ๋งž๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰(๋ฒˆ์—ญ)ํ•˜๋Š”๋ฐ, ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ผ์ธ์”ฉ ์ฝ๊ณ  ์‹คํ–‰(๋ฒˆ์—ญ)์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ํ•œ ๋ผ์ธ์”ฉ ์ฝ๋Š” Interpreting ๋ฐฉ์‹์— ์†๋„ issue ๊ฐ€ ๋™๋ฐ˜๋œ๋‹ค.

 

์ด ๋•Œ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์˜์—ญ์„ ๊ธฐ๊ณ„์–ด๋กœ ํ†ต์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ JIT ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค.

 

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ์˜์—ญ์„ ๊ธฐ์–ตํ–ˆ๋‹ค ํ•œ ๋ฒˆ์— ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ์กฐ๊ธˆ ๋นจ๋ผ์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” Junhyunny ๋‹˜์˜ ๋ธ”๋กœ๊ทธ ์—์„œ JIT๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋‹ค.

 

public class JitCompilerTest {

    public static void main(String[] args) {
        int a = 0;
        for (int index = 0; index < 500; index++) {
            long startTime = System.nanoTime();
            for (int subIndex = 0; subIndex < 1000; subIndex++) {
                a++;
            }
            System.out.println("loop count: " + index + ", execution time: " + (System.nanoTime() - startTime));
        }
    }
}

 

์ด ๊ฒฐ๊ณผ๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์‹คํ–‰๋˜๋Š” ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋Š”๋ฐ, ์ด๋Š” JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

loop count: 0, execution time: 8300
loop count: 1, execution time: 9000
loop count: 2, execution time: 8300
...
loop count: 51, execution time: 8100
loop count: 52, execution time: 890200
loop count: 53, execution time: 8500
...
loop count: 109, execution time: 231500
loop count: 110, execution time: 7700
loop count: 112, execution time: 1600
...
loop count: 335, execution time: 36000
loop count: 336, execution time: 3000
loop count: 337, execution time: 0
...

 

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์œ„์˜ ๋‚ด์šฉ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋งค๋ฒˆ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ  ์บ์‹ฑ์„ ํ•˜์—ฌ ์žฌํ˜ธ์ถœ์ด ์ผ์–ด๋‚˜๋ฉด ์บ์‹ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

3. Garbage Collector

 

Garbage Collector์€ JVM์˜ ์„ฑ๋Šฅ๊ณผ ๊ฐ€์žฅ ์—ฐ๊ด€์ด ์žˆ๋Š” Runtime Data Areas ์˜ Heap ์˜์—ญ์˜ ๋™์  ํ• ๋‹น ๋ฐ์ดํ„ฐ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

๊ด€๋ฆฌ๋ผ๋ฉด ๋‹น์—ฐํžˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ด€์ฐฐํ•˜๊ณ  ์ฐพ์•„์„œ ์ œ๊ฑฐ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

 

Java ์—์„œ๋Š” c๋‚˜ c++๊ณผ ๋‹ค๋ฅด๊ฒŒ malloc ๊ณผ free ์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ณผ์ •์ด ์—†๋Š” ์ด์œ ๋„ ์ž˜ ์•Œ๋‹ค์‹ถ์ด ๋ฐ”๋กœ GC๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

GC๋Š” Weak Generational Hypothesis ๋ผ๋Š” ์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค์— ๊ธฐ๋ฐ˜ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค์—์„œ๋Š” 2๊ฐ€์ง€ Generation์ด ์กด์žฌํ•œ๋‹ค.

 

  • Young Generation
    • ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„ ์ด๊ณณ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
    • ๋งŒ์•ฝ Young Generation ์ด ๊ฐ€๋“ ์ฐจ๋ฉด Minor Collection ์ด ๋ฐœ์ƒํ•œ๋‹ค
    • Minor GC๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‚ดํ•˜์žˆ๋Š” ๊ฐ์ฒด๋“ค๋งŒ ํ™•์ธํ•˜๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ๋ฒ„๋ฆฐ๋‹ค.
    • ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด์ค‘ ๋” ์˜ค๋ž˜ ์“ธ ๊ฒƒ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ Tenured Generation ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  • Tenured Generation
    • Young Generation ์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.
    • ์—ญ์‹œ Tenured Generation ๊ฐ€ ๊ฐ€๋“์ฐจ๋ฉด Major Collection์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

์œ„์˜ ๋‘ ์˜์—ญ์— ๋Œ€ํ•ด์„œ Minor GC์™€ Major GC๊ฐ€ ๋™์ž‘ํ•  ๋•Œ ๋‹ค์Œ์˜ 2๊ฐ€์ง€ ๊ณตํ†ต์  ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

 

  1. Stop The World
  2. Mark And Sweep

 

1. Stop The World

 

Stop The World ๋Š” GC๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„์ฃผ ์ž ๊น JVM์ด Application ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ˜๋‹ค.

 

์ด ๋•Œ GC๊ฐ€ ๋™์ž‘ํ•˜๋Š” Thread ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ Thread ์˜ ์ž‘์—…์ด ์ค‘๋‹จ๋˜๊ณ  Collecting ๊ณผ์ •์„ ๊ฑฐ์นœ ํ›„์— ๋‹ค์‹œ Thread ๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค.

 

GC๊ฐ€ ๋ฉˆ์ถ”๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์šฐ๋ฆฌ์˜ ๋ˆˆ์—๋Š” Latency ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ  GC ์„ฑ๋Šฅ ๊ฐœ์„ ์ด๋ผ๊ณ  ํ•˜๋ฉด Stop-The-World ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

2. Mark And Sweep

 

Stop The World ๋ฅผ ํ†ตํ•ด์„œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์„ ์ค‘๋‹จ์‹œํ‚ค๋ฉด, GC๋Š” ๋™์  ๊ฐ์ฒด์— ๋Œ€ํ•œ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๊ฐ์ฒด๊ฐ€ ์ ์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณผ์ •์„ Mark ๊ณผ์ •์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, Mark ๊ณผ์ •์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์†Œ๋ฆฌ๋Š” ๊ฐ์ฒด๊ฐ€ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด์•ผ๊ธฐ์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์ด ๋ฐ”๋กœ Sweep ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

  • Garbage Collector
    • JVM์ด ๋™์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ฐพ์•„์„œ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• 
    • ์‹คํ–‰ ์ˆœ์„œ
      • ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ ํ›„ ์‚ญ์ œ -> ์‚ญ์ œ๋œ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜ -> ํž™ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ

 


๋Œ“๊ธ€