Skip to content

Latest commit

ย 

History

History
220 lines (168 loc) ยท 13.7 KB

File metadata and controls

220 lines (168 loc) ยท 13.7 KB

Garbage Collection

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํž™์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒํผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ , ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

Garbage collection was invented by John McCarthy around 1959 to simplify manual memory management in Lisp. - (Wiki) Garbage collection (computer science)

GC๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•œ๋‹ค.

Heap ์˜์—ญ์˜ ์˜ค๋ธŒ์ ํŠธ ์ค‘ stack ์—์„œ ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ (Unreachable) ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

JVM ์˜ Garbage Collector ๋Š” Unreachable Object ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค. Unreachable Object ๋ž€ Stack ์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” Heap ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ๋งํ•˜๋Š”๋ฐ Garbage Collection ์ด ์ผ์–ด๋‚˜๋ฉด Unreachable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

System.gc() System.gc() ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ผ์–ด๋‚˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋‹จ์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ์œ„ํ—˜ํ•˜๋‹ค. gc-description

Table of Contents

๋ฉ”๋ชจ๋ฆฌ

// JAVA 7
<----- Java Heap ----->             <--- Native Memory --->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Permanent | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
                        <--------->
                       Permanent Heap
                       
// JAVA 8
<----- Java Heap -----> <--------- Native Memory --------->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Metaspace | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+

// S0: Survivor 0
// S1: Survivor 1

Metaspace

Metaspace ๋Š” Heap ๊ณผ๋Š” ์ƒ๊ด€์—†๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค. ์ž๋ฐ” 7๊นŒ์ง€๋Š” Permanent Generation ์˜์—ญ์œผ๋กœ ์กด์žฌํ•˜์˜€์œผ๋‚˜ Java 8์ดํ›„๋กœ Metaspace๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.

์ž๋ฐ” 7๊ณผ ์ž๋ฐ” 8์˜ ์ฐจ์ด์ 

  • Permanent Generation์€ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ค‘์— ํ•˜๋‚˜๋กœ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ• ๋•Œ ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์ด๋‹ค.(Java 7๊ธฐ์ค€)
  • ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด Java Heap ์ด๋‚˜ native heap ์˜์—ญ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค.
    • Symbols -> native heap
    • Interned String -> Java Heap
    • Class statics -> Java Heap
  • OutOfMemoryError: PermGen Space error ๋Š” ๋”์ด์ƒ ๋ณผ ์ˆ˜ ์—†๊ณ  JVM ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋˜ PermSize ์™€ MaxPermSize๋Š” ๋”์ด์ƒ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด ๋Œ€์‹ ์— MetaspaceSize ๋ฐ MaxMetaspaceSize๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์‚ฌ์šฉ๋˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ธฐ์กด์˜ Perm์€ JVM์— ์˜ํ•ด ํฌ๊ธฐ๊ฐ€ ๊ฐ•์ œ๋˜๋˜ ์˜์—ญ์ด๋‹ค. Java 8 ์ดํ›„ Metaspace๋Š” Native memory ์˜์—ญ์œผ๋กœ, OS๊ฐ€ ์ž๋™์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋ฉฐ ๊ทธ ์ด์œ ๋กœ OutOfMemoryError๋ฅผ ๋ณด๊ธฐ ํž˜๋“ค์–ด์กŒ๋‹ค.

์‹คํ–‰์‹œ ์˜ต์…˜์œผ๋กœ Metaspace์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

Heap - Old & Young (Eden, Survivor)

gc-heap-memory

์ž๋ฐ”์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Metaspace, Old, Eden, S0, S1 ์ด ๋‹ค์„ฏ๊ฐœ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํ”„๋กœ์„ธ์Šค

  1. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์˜ค๋ธŒ์ ํŠธ๋Š” Eden ์˜์—ญ์— ํ• ๋‹น๋œ๋‹ค. Survivor Space ์˜์—ญ์€ ๋น„์›Œ์ง„ ์ฑ„๋กœ ์‹œ์ž‘๋œ๋‹ค.
  2. Eden์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๋ฉด, Minor GC ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • Eden์˜ Reachable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ S0 ์œผ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.
    • Eden์˜ Unreachable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ Eden ์˜์—ญ์ด ํด๋ฆฌ์–ด ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ™์ด ํ•ด์ œ๋œ๋‹ค.
  3. Eden์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ์„œ ๋‘๋ฒˆ์งธ Minor GC ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • Eden์˜ Reachable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ S1 ์œผ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.
    • Eden์˜ Unreachable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ Eden ์˜์—ญ์ด ํด๋ฆฌ์–ด ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ™์ด ํ•ด์ œ๋œ๋‹ค.
    • S0์˜ Reachable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ S1 ์œผ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค. ์ด๋•Œ age ๊ฐ’์ด ์ฆ๊ฐ€๋˜์–ด ์ด๋™๋œ๋‹ค.
    • S0์˜ Unreachable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ S0 ์˜์—ญ์ด ํด๋ฆฌ์–ด ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ™์ด ํ•ด์ œ๋œ๋‹ค.
  4. Minor GC๊ฐ€ ๋ฐœ์ƒํ•จ์— ๋”ฐ๋ผ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐ˜๋ณต๋˜๋ฉด์„œ age๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    • Survivor Space ์—์„œ Survivor Space ๋กœ์˜ ์ด๋™์€ ์ด๋™ํ• ๋•Œ๋งˆ๋‹ค age ๊ฐ’์ด ์ฆ๊ฐ€ํ•œ๋‹ค
  5. Young Generation์—์„œ ๊ณ„์† ์‚ด์•„๋‚จ์•„ age๊ฐ’์ด ํŠน์ •๊ฐ’ ์ด์ƒ์ด ๋˜๋ฉด Old Generation ์œผ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.
    • ์ด ๋‹จ๊ณ„๋ฅผ Promotion ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  6. Promotion ์ž‘์—…์ด ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณต๋˜๋ฉด์„œ Old Generation ์ด ๊ฐ€๋“์ฐจ๊ฒŒ ๋˜๋ฉด MajorGC ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค
  7. GC๊ฐ€ ๋ฐœ์ƒ๋  ๋•Œ Thread๋ฅผ ์ž ์‹œ ๋ฉˆ์ถ”๊ฒŒ ๋˜๊ณ  Mark and Sweep ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค. (Stop the World)

GC ์ข…๋ฅ˜ MinorGC : Young Generation ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC. Major GC์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. MajorGC : Old Generation (Tenured Space) ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC. Minor GC์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค. FullGC : Heap ์ „์ฒด๋ฅผ clear ํ•˜๋Š” ์ž‘์—… (Young/Old ๊ณต๊ฐ„ ๋ชจ๋‘)

Mark & Sweep

Garbage Collection ๊ณผ์ •์€ Mark and Sweep ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

Mark

gc-root-marking

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์—๋Š” GC Root๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. GC Root๋“ค์€ ํž™ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋‚˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋œปํ•œ๋‹ค. GC Root๋Š” ๋ง๊ทธ๋Œ€๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ Root๋ผ๋Š” ๋œป์ด๋‹ค. GC Root์—์„œ ์‹œ์ž‘ํ•ด ์ด Root๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ, ๋˜ ๊ทธ ์˜ค๋ธŒ์ ํŠธ๋“ค์ด ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํƒ์ƒ‰ํ•ด ๋‚ด๋ ค๊ฐ€๋ฉฐ ๋งˆํฌ(Mark)ํ•œ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„์ธ Mark๋‹จ๊ณ„์ด๋‹ค.

์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„์ธ marking ์ž‘์—…์„ ์œ„ํ•ด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ์ค‘๋‹จ๋˜๋Š”๋ฐ ์ด๋ฅผ stop the world ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.

GC Root๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์‹คํ–‰์ค‘์ธ ์“ฐ๋ ˆ๋“œ (Active Thread)
  2. ์ •์  ๋ณ€์ˆ˜ (Static Variable)
  3. ๋กœ์ปฌ ๋ณ€์ˆ˜ (Local Variable)
  4. JNI ๋ ˆํผ๋Ÿฐ์Šค (JNI Reference)

Sweep

gc-root-sweep mark ๋˜์–ด์žˆ์ง€ ์•Š์€ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํž™์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์ด Sweep ์ด๋‹ค.

Garbage Collection ์ด๋ผ๊ณ  ํ•˜๋ฉด garbage ๋“ค์„ ์ˆ˜์ง‘ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” garbage ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, garbage ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ ๋”ฐ๋กœ mark ํ•˜๊ณ  ๊ทธ ์™ธ์˜ ๊ฒƒ์€ ๋ชจ๋‘ ์ง€์šฐ๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ํž™์— garbage ๋งŒ ๊ฐ€๋“ํ•˜๋‹ค๋ฉด ์ œ๊ฑฐ ๊ณผ์ •์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

Unreachable Object๋“ค์ด ๋ชจ๋‘ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•ด์ œ๋ ์ˆ˜๋„ ์žˆ๊ณ  ๋‹ค๋ฅธ๊ณณ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์˜ฎ๊ฒจ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์ข…๋ฅ˜

Collector ์•Œ๊ณ ๋ฆฌ์ฆ˜

Garbage Collector Option YG ์•Œ๊ณ ๋ฆฌ์ฆ˜ OG ์•Œ๊ณ ๋ฆฌ์ฆ˜
Serial Collector -XX:+UseSerialGC Serial Serial Mark-Sweep-Compact
Parallel Collector -XX:+UseParallelGC Parallel Scavenge Serial Mark-Sweep-Compact
Parallel Compacting Collector -XX:+UseParallelOldGC Parallel Scavenge Parallel Mark-Sweep-Compact
CMS Collector -XX:+UseConcMarkSweepGC Parallel Concurrent Mark-Sweep
G1 Collector -XX:+UseG1GC Young GC(Evacuation Pause)
Concurrent Mark - Marking
Current Mark - Remarking
Old Region Reclaim - Remarking
Old Region Reclaim - Evacuation Pause
Compaction Phase

Serial GC

gc-normaldeletion-deletion-with-compactiong Serial GC ๋Š” Java SE 5, 6 ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋””ํดํŠธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์ด๋‹ค.

-XX:+UseSerialGC

MinorGC, MajorGC ๋ชจ๋‘ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹œํ–‰๋œ๋‹ค. Mark-Compact collection method ๋ฅผ ์‚ฌ์šฉ

Mark-Compact collection method ๋ž€ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ์กด์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋˜ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํž™์˜ ์‹œ์ž‘์œ„์น˜๋กœ ์˜ฎ๊ฒจ ๋†“๋Š” ๋ฐฉ๋ฒ• ์ฐฝ๊ณ ์—์„œ ํ•„์š”์—†๋Š” ๋ฌผ๊ฑด๋“ค์„ ๋ฒ„๋ฆฐ ํ›„, ์ฐฝ๊ณ ์— ๋ฌผ๊ฑด์„ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“๊ธฐ์œ„ํ•ด ์ฐฝ๊ณ ์•ˆ์„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Parallel GC

gc-serial-collection-parrallel-collection Parallel ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” young generation ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ˆ˜ํ–‰์‹œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ParallelGC ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ต์…˜์„ ์ฃผ์—ˆ๋”๋ผ๋„, ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์ด ์‹ฑ๊ธ€ CPU ๋ผ๋ฉด ๋””ํดํŠธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Serial GC)๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ํ˜ธ์ŠคํŠธ์˜ CPU ๊ฐ€ ๋‘๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด young generation ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋Š” ๋””ํดํŠธ๋กœ CPU ๊ฐœ์ˆ˜๋งŒํผ์ด ํ• ๋‹น๋˜๋Š”๋ฐ -XX:ParallelGCThread=<N> ์˜ต์…˜์œผ๋กœ ์กฐ์ ˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ, -XX:+UseParallelOldGC ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, old generation ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์—์„œ๋„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

-XX:+UseParallelGC # ParallelGC ์‚ฌ์šฉ
-XX:ParallelGCThread=<N> # ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์Šค๋ ˆ๋“œ ๊ฐฏ์ˆ˜ (default : Cpu ๊ฐฏ์ˆ˜)
-XX:+UseParallelOldGC # old generation์—๋„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์‚ฌ์šฉ

Old Generation์œผ๋กœ Promotion ์ž‘์—…์„ ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜์—ฌ ์ถฉ๋Œ์ด ๋‚˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Minor GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋งˆ๋‹ค Old Generation์˜ ์ผ์ •๋ถ€๋ถ„์„ PLAB์ด๋ผ๋Š” ๋ฒ„ํผ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ถฉ๋Œ์ƒํ™ฉ์„ ํ”ผํ•˜๊ณ  ์žˆ๋‹ค. gc-parellel-collector-pcm-plab

PLAB(Parallel Allocation Buffer) ๋‹จ์  PLAB ๋•Œ๋ฌธ์— ์–ด์ฉ” ์ˆ˜ ์—†์ด Old Generation์— ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๊ฐ€ ์ƒ๊ธฐ๊ณค ํ•œ๋‹ค.

Concurrent Mark Sweep (CMS) Collector

gc-cms-collector Concurrent Low Pause Collector ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” CMS ์ปฌ๋ ‰ํ„ฐ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ž‘์—…์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์™€ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ธํ•œ stop-the-world ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋Š” GC์ด๋‹ค.

CMS ์ปฌ๋ ‰ํ„ฐ๋Š” young generation ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์‹œ Parallel GC ์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, -XX:ParallelCMSThreads=<N> ์˜ต์…˜์œผ๋กœ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ CMS ์ปฌ๋ ‰ํ„ฐ๋Š” ์‚ด์•„์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์— ๋Œ€ํ•œ compact ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ์˜ ํŒŒํŽธํ™”(Fragmentation) ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด ๋” ํฐ ํž™์‚ฌ์ด์ฆˆ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค.

-XX:+UseConcMarkSweepGC # CMS Collector ์‚ฌ์šฉ
-XX:ParallelCMSThreads=<N> # ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •

G1(Garbage First) Garbage Collector

gc-g1gc

Garbage First ๋ผ๋Š” ์˜๋ฏธ์˜ G1 ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” Java 7 ๋ถ€ํ„ฐ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์žฅ๊ธฐ์ ์œผ๋กœ CMS ์ปฌ๋ ‰ํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. G1์€ ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ GC์ด๋ฉฐ ์“ฐ๋ ˆ๊ธฐ๋กœ ๊ฐ€๋“์ฐฌ heap ์˜์—ญ์„ ์ง‘์ค‘์ ์œผ๋กœ ์ˆ˜์ง‘ํ•œ๋‹ค. GC ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ, ๋”ฐ๋กœ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ฒ˜๋ฆฌ๋Ÿ‰(throughput)๋„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด G1GC์˜ ๋ชฉํ‘œ์ด๋‹ค. G1์€ ์‹ค์‹œ๊ฐ„(real time) GC๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๊ธด ํ•˜์ง€๋งŒ ์™„์ „ํžˆ ์—†์• ์ง€๋Š” ๋ชปํ•œ๋‹ค. ํ†ต๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ด๊ฐ€๋ฉด์„œ GC ์ž‘์—…๋Ÿ‰์„ ์กฐ์ ˆํ•œ๋‹ค.

Oracle๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด heap size๊ฐ€ 6GB๋ณด๋‹ค ํด ๊ฒฝ์šฐ GC์˜ latency๋ฅผ 0.5sec์ดํ•˜๋กœ ๋‚ฎ์ถœ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.(

// G1GC๋Š” Java 9๋ถ€ํ„ฐ ๋””ํดํŠธ์ด๋ฏ€๋กœ ๋ณดํ†ต์€ ๋”ฐ๋กœ ์˜ต์…˜์„ ์จ์„œ ํ™œ์„ฑํ™”ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
-XX:+UseG1GC
-XX:ParallelGCThreads # ์Šค๋ ˆ๋“œ ๊ฐฏ์ˆ˜ ์กฐ์ ˆ 

G1GC๋Š” ์ „์ฒด heap์„ ์ฒด์ŠคํŒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์˜์—ญ(region)์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•œ๋‹ค.

๋”ฐ๋ผ์„œ G1์€ ์˜์—ญ์˜ ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋ชฉ์ ์œผ๋กœ remember set๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค. remember set์€ total heap์˜ 5% ๋ฏธ๋งŒ ํฌ๊ธฐ.

  • ๋น„์–ด ์žˆ๋Š” ์˜์—ญ์—๋งŒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
  • ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ์Œ“์—ฌ ๊ฝ‰ ์ฐฌ ์˜์—ญ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒญ์†Œํ•œ๋‹ค.
  • ๊ฝ‰ ์ฐฌ ์˜์—ญ์—์„œ ๋ผ์ด๋ธŒ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์˜์—ญ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ , ๊ฝ‰ ์ฐฌ ์˜์—ญ์€ ๊นจ๋—ํ•˜๊ฒŒ ๋น„์šด๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์ด ์กฐ๊ฐ ๋ชจ์Œ์˜ ์—ญํ• ๋„ ํ•œ๋‹ค.

Oracle์—์„œ G1 GC๋ฅผ ์‚ฌ์šฉ์„ ๊ถŒํ•˜๋Š”(Recommend) ๊ธฐ์ค€ Full GC durations are too long or too frequent. The rate of object allocation rate or promotion varies significantly. Undesired long garbage collection or compaction pauses (longer than 0.5 to 1 second)

Garbage Collection ์ด ์ค‘์š”ํ•œ ์ด์œ 

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

๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ๋ชจ๋‘๊ฐ€ ๊ฐ™์„ ์ˆ˜๊ฐ€ ์—†๊ณ  ๊ฐ์ฒด์˜ ํฌ๊ธฐ์™€ ์ƒ์กด ์ฃผ๊ธฐ๊ฐ€ ๋‹ค ๋‹ฌ๋ผ GC์— ๋Œ€ํ•œ ์˜ต์…˜์„ ๊ณ„์† ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๊พธ์ค€ํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ตœ์ ์˜ ๊ฐ’์„ ์ฐพ์•„๋‚ด์–ด ํŠœ๋‹์„ ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.