Garbage Collection


Garbage Collection μ΄λž€ Java λ©”λͺ¨λ¦¬ 관리 방법 쀑 ν•˜λ‚˜λ‘œ 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀을 μ œκ±°ν•˜λŠ” μž‘μ—…μ„ μ˜λ―Έν•˜λ©° JVM 의 Heap Area μ—μ„œ 주둜 λ™μž‘ν•œλ‹€.

Garbage Collection 의 λŒ€μƒ

객체듀은 μ‹€μ§ˆμ μœΌλ‘œ Heap Area 에 μƒμ„±λ˜κ³  Method Area λ‚˜ Stack Area λ“± Root Area μ—μ„œ Heap Area 에 μƒμ„±λœ 객체의 μ£Όμ†Œλ§Œ μ°Έμ‘°ν•œλ‹€.

GC 의 λŒ€μƒμ€ 이런 객체듀 쀑 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀이닀. μ—¬κΈ°μ„œ μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀은 unreachable 이라고 ν•˜λ©° 참쑰되고 μžˆλŠ” 객체듀은 reachable 이라고 ν‘œν˜„ν•œλ‹€.

unreachable 객체듀은 λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄μ„œ Stack Area μ—μ„œ Frame 이 pop λ˜κ±°λ‚˜ μ°Έμ‘° λŒ€μƒμ΄ λ°”λ€Œλ©΄μ„œ μƒκΈ°λŠ”λ° GC λŠ” 이런 객체듀을 μ œκ±°ν•˜λŠ” 역할을 ν•œλ‹€.

JVM Heap Area

JVM 의 Heap Area λŠ” GC κ°€ 효율적으둜 λ™μž‘ν•  수 μžˆλ„λ‘ Eden Survivor0 Survivor1 Old Permanent 5κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€. JDK1.8 λΆ€ν„° Permanent μ˜μ—­μ΄ Native Method Stack Area λ₯Ό μœ„ν•œ MetaSpace μ˜μ—­μœΌλ‘œ λ³€κ²½λ˜μ—ˆλ‹€. Survivor μ˜μ—­μ˜ 경우 GC κ°€ 일어날 λ•Œ 두 μ˜μ—­ 간에 볡사가 μΌμ–΄λ‚œλ‹€λŠ” 점이 μ€‘μš”ν•˜κ³  μˆ«μžλŠ” μ€‘μš”ν•œ μš”μ†Œκ°€ μ•„λ‹ˆλ‹€.

Stop-The-World

GC λ₯Ό μˆ˜ν–‰ν•  λ•Œ GC λ₯Ό μˆ˜ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μŠ€λ ˆλ“œλŠ” μ •μ§€ν•˜λŠ”λ° 이λ₯Ό Stop-The-World 라고 ν•œλ‹€.

λΉˆλ²ˆν•œ GC λŠ” 더 λ§Žμ€ Stop-The-World λ₯Ό λ°œμƒμ‹œν‚€κ³  μ΄λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯ μ €ν•˜λ‘œ 이어지기 λ•Œλ¬Έμ— Stop-The-World μ‹œκ°„μ„ 쀄여 μŠ€λ ˆλ“œκ°€ μ •μ§€λ˜λŠ” μ‹œκ°„μ„ μ€„μ΄λŠ” 것이 μ€‘μš”ν•˜λ‹€.

Garbage Collection λ™μž‘ κ³Όμ •


GC λŠ” Minor GC 와 Major GC 둜 ꡬ뢄할 수 μžˆλ‹€. Minor GC λŠ” young μ˜μ—­μ—μ„œ Major GC λŠ” old μ˜μ—­μ—μ„œ μΌμ–΄λ‚œλ‹€.

Minor GC

Minor GC λŠ” young μ˜μ—­μ—μ„œ μΌμ–΄λ‚˜λ©° Eden μ˜μ—­μ΄ 가득 μ°¨λ©΄μ„œ μ‹œμž‘λœλ‹€.

  1. μ΅œμ΄ˆμ— 객체가 μƒμ„±λ˜λ©΄ age-bit 이 0으둜 ν• λ‹Ήλ˜κ³  Eden μ˜μ—­μ— μ €μž₯λœλ‹€.
  2. Eden μ˜μ—­μ΄ 가득차면 μ°Έμ‘°κ°€ λ‚¨μ•„μžˆλŠ” 객체λ₯Ό mark ν•œλ‹€.
  3. Eden μ˜μ—­μ—μ„œ mark 된 객체λ₯Ό Survivor0 μ˜μ—­μœΌλ‘œ λ³΅μ‚¬ν•œλ‹€.
  4. Eden μ˜μ—­μ„ λΉ„μš°κ³  살아남은 κ°μ²΄λ“€μ˜ age-bit 이 μ¦κ°€ν•œλ‹€.
  5. Eden μ˜μ—­μ΄ λ‹€μ‹œ 가득차면 μ°Έμ‘°κ°€ λ‚¨μ•„μžˆλŠ” 객체λ₯Ό λ‹€μ‹œ mark ν•œλ‹€.
  6. Eden μ˜μ—­κ³Ό Survivor0 μ˜μ—­μ—μ„œ mark 된 객체λ₯Ό Survivor1 μ˜μ—­μœΌλ‘œ λ³΅μ‚¬ν•œλ‹€.
  7. Eden μ˜μ—­κ³Ό Survivor0 μ˜μ—­μ„ λΉ„μš°κ³  살아남은 κ°μ²΄λ“€μ˜ age-bit 이 μ¦κ°€ν•œλ‹€.
  8. Eden μ˜μ—­μ΄ λ‹€μ‹œ 가득차면 μ°Έμ‘°κ°€ λ‚¨μ•„μžˆλŠ” 객체λ₯Ό λ‹€μ‹œ mark ν•œλ‹€.
  9. Eden μ˜μ—­κ³Ό Survivor1 μ˜μ—­μ—μ„œ mark 된 객체λ₯Ό Survivor0 μ˜μ—­μœΌλ‘œ λ³΅μ‚¬ν•œλ‹€.
  10. Eden μ˜μ—­κ³Ό Survivor1 μ˜μ—­μ„ λΉ„μš°κ³  살아남은 κ°μ²΄λ“€μ˜ age-bit 이 μ¦κ°€ν•œλ‹€.
  11. μœ„ 과정을 λ°˜λ³΅ν•˜λ‹€κ°€ νŠΉμ • age-bit 에 λ„λ‹¬ν•œ 객체듀을 old μ˜μ—­μœΌλ‘œ promotion ν•œλ‹€.

Major GC

Major GC λŠ” old μ˜μ—­μ—μ„œ μΌμ–΄λ‚˜λ©° Minor GC 와 λ°˜λŒ€λ‘œ μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό mark ν•œλ‹€.

old μ˜μ—­μ΄ κ°€λ“μ°¨κ²Œ 되면 mark 된 객체λ₯Ό μ œκ±°ν•˜λŠ” Full GC(Major GC) κ°€ μΌμ–΄λ‚˜λŠ”λ° μ΄λŠ” Minor GC 보닀 훨씬 λ§Žμ€ μ‹œκ°„μ„ μ†Œλͺ¨ν•œλ‹€. 즉, Stop-The-World μ‹œκ°„μ΄ κΈΈλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Full GC 에선 Mark-Sweep-Compact Algorithm 을 κΈ°λ°˜ν•œ μ—¬λŸ¬ GC 방식듀이 선택 및 μ μš©λœλ‹€.

Garbage Collection Algorithm


Weak Generational Hypothesis

Weak Generational Hypothesis λŠ” λŒ€λΆ€λΆ„μ˜ κ°μ²΄λŠ” λΉ λ₯΄κ²Œ unreachable μƒνƒœλ‘œ μ „ν™˜λœλ‹€λŠ” 가섀이닀. μ΄λŠ” GC λ₯Ό μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” Algorithm 을 μ„€κ³„ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©λ˜λŠ” λŒ€ν‘œμ μΈ 가섀이닀.

Mark-Sweep-Compact Algorithm

GC κ°€ μˆ˜ν–‰λ  λ•Œ reachable 객체듀은 mark λœλ‹€. unreachable ν•œ 객체듀은 mark λ˜μ§€μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 이런 객체듀을 μΆ”μ ν•˜κ³  μ‚­μ œν•˜λŠ” 것을 sweep 이라고 ν•œλ‹€.

mark λ˜μ§€ μ•Šμ€ 객체듀을 μ œκ±°ν•˜λ©΄ λ©”λͺ¨λ¦¬ 곡간에 ꡬ멍이 μƒκΈ°λŠ” λ‹¨νŽΈν™”κ°€ λ°œμƒν•˜λŠ”λ° 이λ₯Ό Fragmentation 이라고 λΆ€λ₯Έλ‹€.

μ •λ ¬λ˜μ§€ μ•Šμ€ Fragmentation 된 λ©”λͺ¨λ¦¬ 곡간은 μ ˆλŒ€μ μΈ 곡간은 좩뢄해도 μ—°μ†λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간이 λΆ€μ‘±ν•΄ λ©”λͺ¨λ¦¬ 할당이 μ–΄λ €μšΈ 수 μžˆλ‹€. λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬λ₯Ό μ •λ¦¬ν•΄μ£ΌλŠ”λ° 이 방식을 Compaction 이라고 ν•œλ‹€.

Garbage Collection 적용


java -XX:+UseG1GC -XX:+DisableExplicitGC SampleProgram

Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œ μœ„μ²˜λŸΌ GC λ₯Ό μ„ νƒν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. κ°€μž₯ κ°„λ‹¨ν•œ SerialGC κ°€ λŒ€ν‘œμ μ΄κ³  쑰금 더 μ§„λ³΄λœ G1GC ZGC 등이 μžˆλ‹€.

References