JAVA & OOP

[JAVA] Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์ด๋ž€?

DAHLIA CHOI 2024. 3. 31. 21:20

 

๐ŸŒฑ Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์ด๋ž€?

c๋‚˜ c++ ๊ฐ™์€ unmanaged language๋Š” free() ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์—… ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค. 

ํ•˜์ง€๋งŒ java์—์„œ๋Š” JVM์˜ ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•Œ์•„์„œ ์ •๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค!! 

๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•œ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•„์š” ์—†๋Š” ๋ถ€๋ถ„์€ ๊ผญ ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 

๐Ÿค” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ vs ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ : ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ์ œ๊ฑฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ : ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋กœ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ฆ‰, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ํ”„๋กœ์„ธ์Šค ์ž์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ณ , ์‹ค์ œ ์—ญํ• ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํ•˜๊ฒŒ ๋œ๋‹ค!

 

 

๐Ÿค” ๊ทธ๋Ÿผ ๊ฐ€๋น„์ง€๊ฐ€ ๋ฌด์—‡์ผ๊นŒ?

Heap ์˜์—ญ์—์„œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์ค‘ ํ•„์š” ์—†๊ฒŒ ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋น„์ง€(Garbage)๋ผ๊ณ  ํ•œ๋‹ค.

 

Student std = new Student("๊น€๋ฏผ์ˆ˜");
std.goSchool();

// ๊ฐ€๋น„์ง€ ๋ฐœ์ƒ
std = new Student("์ด์˜ํฌ");

์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ๊น€๋ฏผ์ˆ˜๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด์„œ std๊ฐ€ ๊น€๋ฏผ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋ฉ”์„œ๋“œ ์‹คํ–‰ ํ›„ ์ด์˜ํฌ๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๊น€๋ฏผ์ˆ˜๋ผ๋Š” ๊ฐ์ฒด๋Š” ๋”์ด์ƒ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ€๋น„์ง€๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค!

 

 

 

๐ŸŒฑ JVM์˜ Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

JVM์˜ Heap ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ƒ๊ฒผ์—ˆ๋‹ค. 

ํ•˜์ง€๋งŒ Java8๋ถ€ํ„ฐ Perm์˜์—ญ์ด ์ œ๊ฑฐ๋˜์—ˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ํ”Œ๋กœ์šฐ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

 

JVM์˜ Heap ์˜์—ญ์€ 2๊ฐ€์ง€ ์ „์ œ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

  • ๋Œ€๋ถ€๋ถ„ ๊ฐ์ฒด๋Š” ๊ธˆ๋ฐฉ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ์˜ค๋ž˜๋œ ๊ฐ์ฒด์—์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ์˜ ์ฐธ์กฐ๋Š” ์•„์ฃผ ์ ๊ฒŒ ์กด์žฌํ•œ๋‹ค.

์ฆ‰, ๊ฐ์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ ์ผํšŒ์„ฑ๋˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์— ์˜ค๋žซ๋™์•ˆ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค. ๊ทธ๋ž˜์„œ Young, Old ์ด 2๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค.

 

๐Ÿซง Young ์˜์—ญ

  • ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ
  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ๊ธˆ๋ฐฉ Unreachable์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
  • Young ์˜์—ญ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ Minor GC๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿซง Old ์˜์—ญ

  • Young ์˜์—ญ์—์„œ Reachable ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๋Š” ์˜์—ญ
  • Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋ฉฐ, ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๋งŒํผ ๊ฐ€๋น„์ง€๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
  • Old ์˜์—ญ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ Major GC๋ผ๊ณ  ํ•œ๋‹ค.

 

๐Ÿค” Old ์˜์—ญ์ด Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋Š” ์ด์œ ๋Š”?

Young ์˜์—ญ์˜ ์ˆ˜๋ช…์ด ์งง์€ ๊ฐ์ฒด๋“ค์€ ํฐ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํฐ ๊ฐ์ฒด๋“ค์€ Young ์˜์—ญ์ด ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ Old ์˜์—ญ์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋งŒ์•ฝ Old ์˜์—ญ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด Old ์˜์—ญ์— ์žˆ๋Š” ์นด๋“œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

์นด๋“œ  ํ…Œ์ด๋ธ”์ด๋ž€?

512 ๋ฐ”์ดํŠธ์˜ ๋ฉ์–ด๋ฆฌ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ Old ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

์นด๋“œํ…Œ์ด๋ธ”์ด ๋„์ž…๋œ ์ด์œ ๋Š” Young ์˜์—ญ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ง„ํ–‰๋  ๋•Œ, Young ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” Old ์˜์—ญ์„ ๋ชจ๋‘ ์‹๋ณ„ํ•ด ๋ณด๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์นด๋“œ ํ…Œ์ด๋ธ”๋งŒ ์กฐํšŒํ•ด์„œ GC์˜ ๋Œ€์ƒ์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

 

 

๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด Perm ์˜์—ญ์€ ์™œ ์‚ฌ๋ผ์กŒ์„๊นŒ?

Perm ์˜์—ญ์—์„  ๋ฌด์—‡์„ ํ–ˆ์„๊นŒ?

  • JVM์—์„œ ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ, ํ•„๋“œ ์ •๋ณด)๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ
  • ํด๋ž˜์Šค ๋กœ๋”๋Š” ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์—ฌ์„œ ์ด ์˜์—ญ์— ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ์ด ์ •๋ณด๋“ค์€ JVM์‹คํ–‰ ๋„์ค‘์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ JVM ์ข…๋ฃŒ ์‹œ๊นŒ์ง€ ์œ ์ง€๋จ

JAVA8 ์ดํ›„๋กœ๋Š” Metaspace ์˜์—ญ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.

 

Metaspace๋ž€?

  • Perm ์˜์—ญ์—์„œ ์ €์žฅํ•˜๋˜ Class์˜ Meta ์ •๋ณด๋“ค์ด ์ด ์˜์—ญ์— ์ €์žฅ
  • Native Memory ์˜์—ญ์— ์œ„์น˜ํ•˜๋ฉฐ, JVM์ด ์•„๋‹Œ OS ๋ ˆ๋ฒจ์—์„œ ๊ด€๋ฆฌ
  • ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅ

 

์™œ ๋Œ€์ฒด๋˜์—ˆ์„๊นŒ?

  • Perm ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, OutOfMemoryError ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ
    • ํด๋ž˜์Šค ๋กœ๋”ฉ ๋ฐ ์–ธ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํ•ด์ œ์˜ ๋นˆ๋ฒˆํ•œ ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋” ์‹ฌ๊ฐํ•ด์กŒ๋‹ค.
  • ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ Native Memory์— ์ €์žฅํ•˜๋ฉด์„œ, JVM์—์„œ์˜ OutOfMemoryError ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

 

 

๐ŸŒฑ Reachability vs Unrechability

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋น„์ง€์ธ์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ Reachability๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ๋ž˜ํผ๋Ÿฐ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด Reachable๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ , ๊ฐ์ฒด์— ์œ ํšจํ•œ ๋ž˜ํผ๋Ÿฐ์Šค๊ฐ€ ์—†๋‹ค๋ฉด Unreachable์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ˆ˜๊ฑฐํ•œ๋‹ค.

 

 

JVM์—์„œ๋Š” ์‹ค์งˆ์ ์ธ ๊ฐ์ฒด๋“ค์€ Heap์— ์ƒ์„ฑ๋˜๊ณ , Method Area์™€ Stack์—์„œ๋Š” Heap ์˜์—ญ์˜ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋งŒ ์ฐธ์กฐํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ•ด๋‹น ๊ทธ๋ฆผ์—์„œ Heap ์˜์—ญ์— ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ Unreachable๋กœ ๊ตฌ๋ถ„๋˜์–ด GC์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฒƒ์ด๊ณ , ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด๋“ค์€ Reachable๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

๐ŸŒฑ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋™์ž‘ ๋ฐฉ์‹

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

 

1. Stop The Word

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JVM์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๋Š” ์ž‘์—…์ด๋‹ค. 

GC๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋Š” GC๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์˜ ์ž‘์—…์ด ์ค‘๋‹จ๋˜๊ณ  GC๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ž‘์—…์ด ์žฌ๊ฐœ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์ด ์ค‘๋‹จ๋œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ž‘์—…์ด ์ค‘๋‹จ๋˜๊ฒŒ ๋˜๋ฉด ๋‹น์—ฐํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์— GC์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ํŠœ๋‹ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด stop-the-world์˜ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.

 

๊ฐ์ฒด ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ์ถ”์ ํ•˜๋Š”๊ฑด ์‹คํ–‰ ์ค‘์—๋„ ํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ์ด ์ž‘์—…์€ ๋งค์šฐ ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋‹จํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค!

 

2. Mark and Sweep

  • Mark : ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ž‘์—…
  • Sweep : Mark ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์œผ๋กœ ์‹๋ณ„๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ์ž‘์—…

 

Stop The World๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ž‘์—…์„ ์ค‘๋‹จ์‹œํ‚ค๋ฉด GC๋Š” ์Šคํƒ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜ ๋˜๋Š” reachable ๊ฐ์ฒด๋ฅผ ์Šค์บ”ํ•˜๋ฉด์„œ ๊ฐ๊ฐ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ถ”์ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š”๋ฐ ์ด๋Ÿฐ ๊ณผ์ •์„ Mark๋ผ๊ณ  ํ•œ๋‹ค.

์ดํ›„์— Mark๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ Sweep๋ผ๊ณ  ํ•œ๋‹ค.

 

 

Minor GC

์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด Young ์˜์—ญ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด Minor GC์ด๋‹ค.

 

Young ์˜์—ญ์—๋Š” 1๊ฐœ์˜ Eden์˜์—ญ๊ณผ 2๊ฐœ์˜ Survivor์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • Eden : ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ
  • Survivor : ์ตœ์†Œ 1๋ฒˆ์˜ GC ์ด์ƒ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ์˜์—ญ

์ƒˆ๋กœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด Young ์˜์—ญ์—์„œ๋„ Eden ์˜์—ญ์— ํ• ๋‹น๋œ๋‹ค. ์ดํ›„ Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉด, Minor GC๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ด์ œ๋˜๊ณ , ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด๋Š” Survivor ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ์ง€๋Š” ๊ฒƒ์ด๋‹ค.  ์—ฌ๊ธฐ์„œ Servivor๋Š” 2๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ์ค‘ ํ•˜๋‚˜์—๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

  1. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ Eden์˜์—ญ์— ํ• ๋‹น๋œ๋‹ค.
  2. ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜๊ณ  Eden์˜์—ญ์ด ๊ฝ‰์ฐจ๊ณ  Minor GC๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  3. 1~2 ๊ณผ์ •์— ๋ฐ˜๋ณต๋˜๋‹ค๊ฐ€ Survivor ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉด Survivor ์˜์—ญ์˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์€ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. (์—ฌ๊ธฐ์„œ 1๊ฐœ์˜ Survivor์˜์—ญ์€ ๋ฐ˜๋“œ์‹œ ๋ฐ˜ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.)
  4. ์ด๋Ÿฐ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด๋•Œ, ์ƒ์กด ํšŸ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๋Š”๋ฐ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” age๋ฅผ Object Header์— ๊ธฐ๋กํ•œ๋‹ค. ์ดํ›„, Minor GC๋•Œ Object Header์˜ age๋ฅผ ๋ณด๊ณ  ์ด๋™ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

์œ„์—๋„ ์ ์—ˆ๋“ฏ์ด, ํ•ด๋‹น ๊ณผ์ •์„ ์‹คํ–‰ํ•  ๋•Œ Survivor์˜์—ญ์€ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜๋งŒ ์ฐจ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ชจ๋‘ 0์ด๊ฑฐ๋‚˜ ๋ชจ๋‘ ์ฐจ์žˆ๋‹ค๋ฉด ๋น„์ •์ƒ์ ์ธ ์‹คํ–‰์ด๋‹ค.

 

 

 

JVM์—์„œ Eden ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด์„œ bump the pointer์™€ TLABs(Thread-Local Allocation Buffers)๋ผ๋Š” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

bump the pointer

  • Eden ์˜์—ญ์— ๋งˆ์ง€๋ง‰ ํ• ๋‹น๋œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์บ์‹ฑํ•ด ๋‘๋Š” ๊ฒƒ
  • ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์œ„ํ•ด ์œ ํšจํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•  ํ•„์š” ์—†์ด ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ์˜ ๋‹ค์Œ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์†๋„๋ฅผ ๋†’์ธ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•  ๋•Œ ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ Eden ์˜์—ญ์— ์ ํ•ฉํ•œ์ง€๋งŒ ํŒ๋ณ„ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” Eden ์˜์—ญ์— ํ• ๋‹นํ•  ๋•Œ lock์„ ๊ฑธ์–ด์„œ ๋™๊ธฐํ™”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

TLABs

  • ๊ฐ๊ฐ€์˜ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค Eden์˜์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋ฅผ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ๋™๊ธฐํ™” ์ž‘์—… ์—†์ด ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
  • ๊ฐ๊ฐ์˜ ์“ฐ๋ ˆ๋“œ๋Š” ์ž์‹ ์ด ๊ฐ–๋Š” ์ฃผ์†Œ์—๋งŒ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•จ์œผ๋กœ์จ ๋™๊ธฐํ™” ์—†์ด bump the pointer๋ฅผ ํ†ตํ•ด  ๋น ๋ฅด๊ฒŒ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋„๋ก ํ•˜๊ณ  ์žˆ๋‹ค.

 

 

Major GC

Young ์˜์—ญ์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. 

Major GC๋Š” ๊ฐ์ฒด๋“ค์ด ๊ณ„์† ์ด๋™๋˜์–ด Old ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ง€๋ฉด ๋ฐœ์ƒํ•œ๋‹ค. Young ์˜์—ญ์€ Old ์˜์—ญ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— GC๊ฐ€ ๋ณดํ†ต 0.5์ดˆ์—์„œ 1์ดˆ ์‚ฌ์ด์— ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— Minor GC์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ง€๋งŒ, Old ์˜์—ญ์€ Young ์˜์—ญ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํฌ๊ณ  Young์˜์—ญ์„ ์ฐธ์กฐํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Major GC๋Š” Minor GC๋ณด๋‹ค ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉฐ, 10๋ฐฐ ์ด์ƒ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. 

 

+) Young๊ณผ Old ์˜์—ญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” GC๋Š” Full GC๋ผ๊ณ  ํ•œ๋‹ค.

 

Major GC๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๊ณ  Mark and Sweep ์ž‘์—…์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU์— ๋ถ€ํ•˜๋ฅผ ์ค˜์„œ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ์ด ์ผ์–ด๋‚œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

๐ŸŒฑ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

1. Serial GC

# Serial GC ์‹คํ–‰ ๋ช…๋ น์–ด
# -XX:+UseSerialGC: Serial GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ์‹คํ–‰
java -XX:+UseSerialGC -jar Application.java

serial GC๋Š” Young์˜์—ญ์—์„œ Mark Sweep๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ Old์˜์—ญ์—์„œ๋Š” Mark Sweep Compact์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

๊ธฐ์กด์— Mark Sweep์— Compact๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋‹ค. Compact๋Š” Heap์˜์—ญ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋กœ ์œ ํšจํ•œ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก ํž™์˜ ๊ฐ€์žฅ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ์„œ๋ฒ„์˜ CPU์ฝ”์–ด๊ฐ€ 1๊ฐœ์ผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ๋ชจ๋“  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ด์šฉํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ณดํ†ต ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ด ์—†๋‹ค.

 

 

2. Parallel GC

# GC ์Šค๋ ˆ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ cpu ๊ฐœ์ˆ˜๋งŒํผ ํ• ๋‹น
# ์˜ต์…˜์„ ํ†ตํ•ด GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์“ฐ๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜ ๋“ฑ์„ ์„ค์ • ๊ฐ€๋Šฅ
java -XX:+UseParallelGC -jar Application.java 
# -XX:ParallelGCThreads=N : ์‚ฌ์šฉํ•  ์“ฐ๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜

 

๊ธฐ๋ณธ ์ฒ˜๋ฆฌ ๊ณผ์ •์€ Serial GC์™€ ๋™์ผํ•˜์ง€๋งŒ Parallel GC๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌ์ ์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ƒ๋‹นํžˆ ์ค„์—ฌ์ค€๋‹ค. ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ๋˜๋Š” ๋ฉ€ํ‹ฐ  ์Šค๋ ˆ๋“œ ๋จธ์‹ ์—์„œ ์ค‘๊ฐ„ ๊ทœ๋ชจ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์œผ๋ฉฐ, ์˜ต์…˜์„ ํ†ตํ•ด ์ตœ๋Œ€ ์ง€์—ฐ ์‹œ๊ฐ„ ๋˜๋Š” GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜ ๋“ฑ์„ ์„ค์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • Java8๊นŒ์ง€ ๊ธฐ๋ณธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์—†์–ด ๊ฐœ์„ ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

 

 

3. Parallel Old GC

java -XX:+UseParallelOldGC -jar Application.java
# -XX:ParallelGCThreads=N : ์‚ฌ์šฉํ•  ์“ฐ๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜

 

Parallel GC์—์„œ Old ์˜์—ญ์— ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถ”๊ฐ€ํ•œ ๋ฒ„์ „์ด๋‹ค. Young ์˜์—ญ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Old์˜์—ญ์—์„œ๋„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

 

 

4. G1(Garbage First) GC

java -XX:+UseG1GC -jar Application.java

Java7 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ๊ธฐ์กด์˜ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” Heap ์˜์—ญ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ Young ์˜์—ญ๊ณผ Old ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉํ•˜์˜€์ง€๋งŒ, G1 GC๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋‚˜๋ˆ„์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  Region(์ง€์—ญ)์˜ ๊ฐœ๋…์„ ๋„์ž…ํ•ด์„œ Heap์„ ๊ท ๋“ฑํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ์ง€์—ญ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์ง€์—ญ์„ ์—ญํ• ๊ณผ ํ•จ๊ป˜ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

 

  • ๊ฐ€๋น„์ง€๋กœ ๊ฐ€๋“ ์ฐฌ ์˜์—ญ์„ ๋น ๋ฅด๊ฒŒ ํšŒ์ˆ˜ํ•˜์—ฌ ๋นˆ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ธฐ ๋•Œ๋ฌธ์— GC ๋นˆ๋„๊ฐ€ ์ค„์–ด๋“œ๋Š” ํšจ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.
  • ์ด์ „์—๋Š” Eden → Survivor0 → Survivor1 ์ˆœ์„œ๋กœ ์ด๋™ํ–ˆ์ง€๋งŒ, G1 GC์—์„œ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์œ„์น˜๋กœ ๊ฐ์ฒด๋ฅผ ์žฌํ• ๋‹น ์‹œํ‚จ๋‹ค. 

 

 

 


๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์ƒ๊ฐํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋Š”๋ฐ, ๊ธ€๋กœ ์ •๋ฆฌํ•˜๋‹ˆ๊นŒ ๋จธ๋ฆฟ์†์—์„œ๋„ ์ •๋ฆฌ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋‹ค!

 

 

 

 

reference

https://jellili.tistory.com/60

https://mangkyu.tistory.com/118

https://velog.io/@yarogono/Java%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%ED%84%B0Garbage-Collector%EB%9E%80