Garbage Collection

Garbage Collection (GC)

Garbage Collection์ด๋ž€?

Java๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์—์„œ ์ž๋™ํ™”๋ฅผ ๋„์ž…ํ•˜์—ฌ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์ œ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์˜์—ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Š” Java์˜ ์ค‘์š”ํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋Š” Garbage Collector(GC)๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Java์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹์€ Java Virtual Machine Specification์— ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋Š” Heap๊ณผ Method Area์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํŠน์ • ๊ฐ์ฒด ๋‹จ์œ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. Java์—์„œ๋Š” ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด๋ฅผ new, newarray, anewarray, multianewarray์™€ ๊ฐ™์€ Bytecode๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์ง€๋งŒ, ์ด๋ฏธ ํ• ๋‹น๋œ ๊ฐ์ฒด๋‚˜ ๋ณ€์ˆ˜๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. System.gc() ๋‚˜ close() ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ๋ช…์‹œ์ ์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๊ฒ ๋‹ค๋Š” ์˜์‚ฌ ํ‘œํ˜„์ผ ๋ฟ, ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

Garbage Collection ๋Œ€์ƒ

Garbage Collection์˜ ๋Œ€์ƒ์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋Š” Root Set๊ณผ์˜ Reference ๊ด€๊ณ„๋กœ ํŒ๋‹จ๋ฉ๋‹ˆ๋‹ค. Root Set์€ ๋ณดํ†ต ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค:

  1. Stack์˜ ์ฐธ์กฐ ์ •๋ณด: LocalVariable Section๊ณผ Operand Stack์— ๊ฐ์ฒด์˜ Reference ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์ด ๊ฐ์ฒด๋Š” ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

  2. Method Area์— ๋กœ๋“œ๋œ Class: ํŠนํžˆ Constant Pool์— ์žˆ๋Š” Reference ์ •๋ณด๋Š” ์ง์ ‘์ ์œผ๋กœ ์ฐธ์กฐํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ„์ ‘์ ์œผ๋กœ ๋งํฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

  3. Native Method๋กœ ๋„˜๊ฒจ์ง„ ๊ฐ์ฒด Reference: JNI ํ˜•์‹์œผ๋กœ ํ˜„์žฌ ์ฐธ์กฐ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ Reference ์ •๋ณด์— ์˜ํ•ด ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋‹ค๋ฉด Reachable Object์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด Garbage Object๋กœ GC์˜ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

Garbage Collection์˜ ๋ชฉ์ 

GC๋Š” ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ•์ด ์žˆ์„ ๋•Œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ•์ด๋ž€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•œ ์ƒํ™ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ GC๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•ด์ œ๋ฅผ ํ†ตํ•ด ํ•œ์ •๋œ Heap ๊ณต๊ฐ„์„ ์žฌํ™œ์šฉํ•˜๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. GC ํ›„ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ง€๋Š” ํ• ๋‹นํ•œ ๊ทธ ์ž๋ฆฌ์—์„œ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— Garbage๊ฐ€ ๋น ์ ธ๋‚˜๊ฐ„ ์ž๋ฆฌ๋Š” ๋“ฌ์„ฑ๋“ฌ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‹จํŽธํ™”(Fragmentation)๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จํŽธํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐœ๋ณ„ Free Space ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•  ๊ฒฝ์šฐ ์žฌํ™œ์šฉ์ด ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด GC๋Š” Compaction๊ณผ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ GC๋ž€ Root Set์—์„œ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๊ฐ€์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

Garbage Collection ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. Reference Counting Algorithm

Reference Counting Algorithm์€ ๊ฐ ๊ฐ์ฒด๋งˆ๋‹ค Reference Count๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ Reference Count๊ฐ€ 0์ด ๋˜๋ฉด ๊ทธ๋•Œ๊ทธ๋•Œ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์— Reference๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด Reference Count๋Š” ์ฆ๊ฐ€ํ•˜๊ณ , Reference๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ˆœํ™˜ ์ฐธ์กฐ(Circular Reference) ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด Reference Count๊ฐ€ 0์ด ๋˜์ง€ ์•Š์•„ GC ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. Mark-and-Sweep Algorithm

Mark-and-Sweep Algorithm์€ Tracing Algorithm์œผ๋กœ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, Root Set์—์„œ ์‹œ์ž‘ํ•˜์—ฌ Reference ๊ด€๊ณ„๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. Mark Phase์—์„œ๋Š” Garbage Object์™€ Live Object๋ฅผ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค. Marking ์ž‘์—…์€ ๊ฐ์ฒด์˜ Header์— Flag๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„์˜ Bitmap Table์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. Sweep Phase์—์„œ๋Š” Marking๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ •ํ™•ํ•œ GC๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ, ๋‹จํŽธํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

3. Mark-and-Compacting Algorithm

Mark-and-Compacting Algorithm์€ Mark-and-Sweep Algorithm์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Sweep Phase ๋Œ€์‹  Compaction Phase๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Compaction ์ž‘์—…์€ Live ๊ฐ์ฒด๋ฅผ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์ด๋™์‹œ์ผœ ๋‹จํŽธํ™”๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. Mark Phase์—์„œ Marking๋œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Live ๊ฐ์ฒด๋ฅผ ์ด๋™์‹œํ‚ค๊ณ , Garbage ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ๊ฐ์ฒด๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๊ณผ์ •์—์„œ ์ถ”๊ฐ€์ ์ธ Overhead๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Copying Algorithm

Copying Algorithm์€ Fragmentation ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Heap์„ Active ์˜์—ญ๊ณผ Inactive ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด, Active ์˜์—ญ์—๋งŒ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. Active ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๋ฉด GC๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด Live ๊ฐ์ฒด๋ฅผ Inactive ์˜์—ญ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” Inactive ์˜์—ญ์˜ ๋‚ฎ์€ ์ฃผ์†Œ๋ถ€ํ„ฐ ์—ฐ์†์ ์œผ๋กœ ์ •๋ ฌ๋˜๋ฏ€๋กœ ๋‹จํŽธํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์ „์ฒด Heap์˜ ์ ˆ๋ฐ˜๋งŒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

5. Generational Algorithm

Generational Algorithm์€ Heap์„ ์—ฌ๋Ÿฌ ์„ธ๋Œ€(Young Generation, Old Generation)๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ๋œ ์ง€ ์–ผ๋งˆ ์ง€๋‚˜์ง€ ์•Š์•„ Garbage๊ฐ€ ๋˜๋Š” ์งง์€ ์ˆ˜๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒฝํ—˜์  ์ง€์‹์— ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. Young Generation์—์„œ๋Š” ์ฃผ๋กœ ์งง์€ ์ˆ˜๋ช…์˜ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, Old Generation์—์„œ๋Š” ์˜ค๋ž˜๋œ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Young Generation์—์„œ Minor GC๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ Live ๊ฐ์ฒด๋ฅผ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™์‹œํ‚ค๊ณ , ์ผ์ • ํšŸ์ˆ˜ ์ด์ƒ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old Generation์œผ๋กœ Promotion ๋ฉ๋‹ˆ๋‹ค.

6. Train Algorithm

Train Algorithm์€ Incremental Algorithm์œผ๋กœ ๋ถˆ๋ฆฌ๋ฉฐ, Heap์„ ์ž‘์€ Memory Block์œผ๋กœ ๋‚˜๋ˆ„์–ด GC๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ Block์€ Single Block ๋‹จ์œ„๋กœ GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉฐ, ์ด๋Š” ์ „์ฒด Heap์˜ Suspend ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Suspend๋ฅผ ๋ถ„์‚ฐ์‹œ์ผœ ์ „์ฒด์ ์ธ Pause Time์„ ์ค„์ด๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ Block์€ ์„œ๋กœ ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, Remember Set์„ ํ†ตํ•ด ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” GC๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ด๋™์‹œํ‚ฌ ๋•Œ ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ์ •ํ™•ํžˆ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

7. Adaptive Algorithm

Adaptive Algorithm์€ ํŠน์ • GC ๋ฐฉ๋ฒ•์„ ์ง€์นญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Heap์˜ ํ˜„์žฌ ์ƒํ™ฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ ์ ˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒ ์ ์šฉํ•˜๊ฑฐ๋‚˜ Heap Sizing์„ ์ž๋™ํ™”ํ•˜๋Š” ์ผ๋ จ์˜ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Hotspot JVM์˜ Ergonomics ๊ธฐ๋Šฅ์ด๋‚˜ IBM JVM์˜ Tilting ๊ธฐ๋Šฅ ๋“ฑ์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. Adaptive Algorithm์€ Application์ด๋‚˜ ์‚ฌ์šฉ์ž์˜ ํŒจํ„ด์— ๋”ฐ๋ผ ์ตœ์ ์˜ GC ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Hotspot JVM์˜ Garbage Collection

Hotspot JVM์€ Generational Collection ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Heap์„ Young Generation๊ณผ Old Generation์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Young Generation์€ Eden ์˜์—ญ๊ณผ ๋‘ ๊ฐœ์˜ Survivor ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. Young Generation์—์„œ Minor GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์„ฑ์ˆ™๋œ ๊ฐ์ฒด๋Š” Old Generation์œผ๋กœ Promotion ๋ฉ๋‹ˆ๋‹ค. Major GC๋Š” Old Generation์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” Garbage Collector

  1. Serial Collector: ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ GC ๋ฐฉ์‹์œผ๋กœ, Single CPU๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Serial๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Young Generation์—์„œ๋Š” Generational Algorithm์„, Old Generation์—์„œ๋Š” Mark-and-Compacting Algorithm์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. Parallel Collector: ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ค‘์‹œํ•˜๋Š” GC ๋ฐฉ์‹์œผ๋กœ, Young Generation์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. Old Generation์—์„œ๋Š” ๊ธฐ์กด์˜ Mark-and-Compacting Algorithm์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  3. Parallel Compacting Collector: Young Generation๊ณผ Old Generation ๋ชจ๋‘์—์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ GC๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Old Generation์—์„œ๋Š” Parallel Compaction Algorithm์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  4. CMS (Concurrent Mark-Sweep) Collector: ์‘๋‹ต ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ Low Pause Collector๋กœ, Young Generation์—์„œ๋Š” Parallel Copy Algorithm์„, Old Generation์—์„œ๋Š” Concurrent Mark-and-Sweep Algorithm์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  5. G1 (Garbage First) Collector: ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” GC ๋ฐฉ์‹์œผ๋กœ, ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ Region์„ ์‚ฌ์šฉํ•˜์—ฌ GC๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Generational ๊ตฌ๋ถ„ ์—†์ด ํ•„์š”ํ•œ Region์„ GC ๋Œ€์ƒ์œผ๋กœ ์‚ผ์•„, Suspend ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

JVM ์˜ต์…˜

JVM ์˜ต์…˜์€ ํฌ๊ฒŒ Standard Option๊ณผ Non-Standard Option์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. Non-Standard Option์€ JVM๋งˆ๋‹ค ๋‹ค๋ฅด๋ฉฐ, ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” Heap Sizing ๊ด€๋ จ ์˜ต์…˜

Heap Sizing ๊ด€๋ จ ์˜ต์…˜์€ ์ดˆ๊ธฐ Heap ํฌ๊ธฐ, ์ตœ๋Œ€ Heap ํฌ๊ธฐ, Young Generation์˜ ํฌ๊ธฐ, Permanent Area์˜ ํฌ๊ธฐ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • Hotspot JVM์€ ๊ฐ์ฒด์˜ ๋‚˜์ด์™€ ํ•จ๊ป˜ ํ”„๋กœ๋ชจ์…˜์„ ์œ„ํ•œ ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•จ. ์ด ์˜ต์…˜์€ -XX:MaxTenuringThreshold๋กœ ๊ธฐ๋ณธ๊ฐ’์€ 31์ด๋‹ค. ์ด ์ˆ˜์น˜๊ฐ€ ์ž‘๋‹ค๊ณ  ์ƒ๊ฐํ•ด 100์ด๋‚˜ 1000์œผ๋กœ ์„ค์ •ํ•ด๋„ ์‹ค์ œ ๋‚˜์ด์˜ ์ตœ๋Œ€๊ฐ’์€ 31์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐ์ฒด ํ—ค๋”์˜ ์ฒซ ๋ฒˆ์งธ ์›Œ๋“œ์— ๊ธฐ๋ก๋œ ๋‚˜์ด๊ฐ€ 6๋น„ํŠธ๋กœ ํ‘œํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” 0๋ถ€ํ„ฐ 31๊นŒ์ง€์˜ ๊ฐ’๋งŒ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

Promotion and Survivor Areas in Hotspot JVM

  • ๊ทธ๋ฆผ 51์—์„œ๋Š” ๋งˆํฌ ๋‹จ๊ณ„๊ฐ€ ๋๋‚œ ํ›„ ํ”„๋กœ๋ชจ์…˜ ๊ฐ€๋Šฅํ•œ ์„ฑ์ˆ™ํ•œ ๊ฐ์ฒด๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์žˆ๋‹ค. Eden ์˜์—ญ์—๋Š” LiveObjectA๊ฐ€ ์žˆ๊ณ  Survivor 2์—๋Š” LiveObject๋กœ B์™€ M์ด ์žˆ๋‹ค. ์ด ์ค‘ M์€ ์„ฑ์ˆ™ํ•œ ๊ฐ์ฒด์ด๋‹ค.

  • From๊ณผ To๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋ช…์นญ์œผ๋กœ, ํ•ญ์ƒ To ์˜์—ญ์œผ๋กœ ๋ณต์‚ฌ๋˜๊ณ  From ์˜์—ญ์€ ๋ณด๋‚ด๊ธฐ๋งŒ ํ•œ๋‹ค. Minor GC ๋‹น์‹œ ๊ฐ์ฒด๊ฐ€ ๋‚จ์•„ ์žˆ๋Š” ๊ณณ์ด From์ด ๋˜๊ณ  ๋น„์–ด ์žˆ๋Š” ๊ณณ์ด To๊ฐ€ ๋œ๋‹ค. ์ดํ›„ ๋‹ค์Œ Minor GC์—๋Š” From๊ณผ To๊ฐ€ ์„œ๋กœ ๋’ค๋ฐ”๋€๋‹ค.

Old Generation์˜ Garbage Collection: Mark-and-Compacting

  • Old Generation์€ Young Generation๊ณผ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. Old Generation์˜ GC๋Š” ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐœ์ƒ ์‹œ Minor GC๋ณด๋‹ค ๋” ๊ธด ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์„ ํ•„์š”๋กœ ํ•œ๋‹ค. ์ด๋Š” Old Generation์˜ ํฌ๊ธฐ๊ฐ€ Young Generation๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • Old Generation์€ Mark-and-Compaction ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋œ๋‹ค. Old Generation์—์„œ์˜ GC๋Š” ํ”„๋กœ๋ชจ์…˜์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

Serial Collector ์˜ต์…˜

  • -XX:+UseSerialGC: Serial Collector๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์˜ต์…˜.

  • -XX:InitialTenuringThreshold=<value>: ๊ฐ์ฒด์˜ ์ดˆ๊ธฐ ๋‚˜์ด๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜. ๊ธฐ๋ณธ๊ฐ’์€ 0์ด๋ฉฐ, ๊ฐ์ฒด๋ฅผ ๋นจ๋ฆฌ ํ”„๋กœ๋ชจ์…˜๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ด๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  • -XX:MaxTenuringThreshold=<value>: ๊ฐ์ฒด๊ฐ€ ํ”„๋กœ๋ชจ์…˜๋˜๋Š” ๋‚˜์ด๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜. ๊ธฐ๋ณธ๊ฐ’์€ 31์ด๋‹ค.

  • -XX:PretenureSizeThreshold=<byte size>: Young Generation์— ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์˜ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•˜๋Š” ์˜ต์…˜. ์„ค์ •๋œ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๊ฐ์ฒด๋Š” Tenured ์˜์—ญ์— ๋ฐ”๋กœ ์ƒ์„ฑ๋œ๋‹ค.

  • -XX:+PrintTenuringDistribution: Young Generation์— ํ• ๋‹น๋œ ๊ฐ์ฒด์˜ ๋‚˜์ด ์ •๋ณด์™€ ์„œ๋ฐ”์ด๋ฒ„ ์˜์—ญ์˜ ์ ์ • ์ž„๊ณ„๊ฐ’ ๋“ฑ์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Incremental Collector

  • Incremental Collector๋Š” 1.3.1 ๋ฒ„์ „์—์„œ ์†Œ๊ฐœ๋œ Low Pause Goal์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ตœ์ดˆ์˜ Collector์ด๋‹ค. Young Generation์˜ GC๋ฅผ ์œ„ํ•ด Serial Collector์™€ ๋™์ผํ•œ Generational Algorithm์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, Old Generation์—์„œ๋Š” Train Algorithm์„ ์‚ฌ์šฉํ•œ๋‹ค.

Parallel Collector

  • Parallel Collector๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. Young Generation์—์„œ๋งŒ ์ ์šฉ๋˜๋ฉฐ, Old Generation์€ Mark-and-Compacting ๋ฐฉ์‹์„ ์œ ์ง€ํ•œ๋‹ค.

  • -XX:+UseParallelGC: Parallel Collector๋ฅผ ์„ ํƒํ•˜๋Š” ์˜ต์…˜.

  • -XX:ParallelGCThreads=<value>: GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜. ๊ธฐ๋ณธ๊ฐ’์€ CPU ๊ฐœ์ˆ˜์™€ ๋™์ผํ•˜๋‹ค.

  • -XX:+AlwaysTenure: ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ Old Generation์œผ๋กœ ํ”„๋กœ๋ชจ์…˜ํ•˜๋Š” ์˜ต์…˜.

CMS (Concurrent Mark-Sweep) Collector

  • CMS Collector๋Š” Pause Time Goal์„ ๊ฐ€์ง„ Collector๋กœ, Old Generation์˜ GC๋ฅผ Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์„ ์ค„์ธ๋‹ค.

  • -XX:+UseConcMarkSweepGC: CMS Collector๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜.

  • -XX:+UseParNewGC: Young Generation์—์„œ Parallel GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ์˜ต์…˜.

  • -XX:+CMSParallelRemarkEnabled: Remark Phase์˜ ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์˜ต์…˜.

Garbage First (G1) Collector

  • G1 Collector๋Š” Region ๋‹จ์œ„๋กœ Heap์„ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋ฉฐ, Pause Time Goal์„ ๊ฐ€์ง€๋ฉด์„œ๋„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์„ ์ œ๊ณตํ•œ๋‹ค.

  • -XX:+UnlockExperimentalVMOptions: G1 Collector๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ—˜์  ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ์˜ต์…˜.

  • -XX:+UseG1GC: G1 Collector๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜.

IBM JVM Garbage Collection

  • IBM JVM์˜ GC๋Š” Hotspot JVM๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, Generational Heap์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค Mark, Sweep, Compaction ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•œ๋‹ค.

  • -Xgcpolicy:<optthruput | optavgpause | gencon | subpool>: GC ์ •์ฑ…์„ ์„ ํƒํ•˜๋Š” ์˜ต์…˜.

  • -disableexplicitgc: ๋ช…์‹œ์ ์ธ GC ํ˜ธ์ถœ์„ ๋ฌด์‹œํ•˜๋Š” ์˜ต์…˜.

  • -verbose:gc: GC ์ •๋ณด๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ์˜ต์…˜.

  • -compactexplicitgc: ๋ช…์‹œ์ ์ธ GC ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค Compaction์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ์˜ต์…˜.

Optimize for Throughput Collector

  • ์ด Collector๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ๋ณ‘๋ ฌ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, AF (Allocation Failure) ์‹œ Compaction์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • Parallel Mark, Parallel Bitwise Sweep, Incremental Compaction ๋“ฑ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

Optimize for Pause Time Collector

  • Pause Time์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Concurrentํ•˜๊ฒŒ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Concurrent Mark, Concurrent Sweep, Mostly Concurrent Compaction ๋“ฑ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

Generational Concurrent Collector

  • Young Generation๊ณผ Old Generation์„ ๊ตฌ๋ถ„ํ•˜์—ฌ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Scavenge, Global Collection ๋“ฑ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

Subpooling Collector

  • ๋Œ€๊ทœ๋ชจ SMP ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, FreeList๋ฅผ ํฌ๊ธฐ๋ณ„๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ๊ฐ€์ด๋“œ๋Š” ๊ฐ JVM์˜ GC ์˜ต์…˜๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

Last updated