λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’Ž/Java

[Java] GC 방식

by dar0m! 2021. 8. 25.

JDK 5.0μ΄μƒμ—μ„œ μ§€μ›ν•˜λŠ” GC λ°©μ‹μ—λŠ” 넀가지가 μžˆλ‹€. WASλ‚˜ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜ν–‰μ‹œ μ˜΅μ…˜μ„ μ§€μ •ν•˜μ—¬ 선택할 수 μžˆλ‹€.

4가지 GC(가비지 μ½œλ ‰ν„°) 방식

  1. Serial GC (μ‹œλ¦¬μ–Ό μ½œλ ‰ν„°)
  2. Parallel GC (병렬 μ½œλ ‰ν„°)
  3. Parallel Compacting GC (Parallel Old GC, 병렬 μ»΄νŒ©νŒ… μ½œλ ‰ν„°)
  4. Concurrent Mark-Sweep GC (CMS μ½œλ ‰ν„°)
  5. Garbage First GC (G1 GC)

 

JVM GC λ™μž‘ μˆœμ„œ

μš”μ•½ν•˜λ©΄ GC λ™μž‘μ€ μ•„λž˜ 3 STEP으둜 λ‚˜λˆ μ§„λ‹€.

  1. Heap μ˜μ—­μ— μ‘΄μž¬ν•˜λŠ” 객체듀에 λŒ€ν•΄ μ ‘κ·Ό κ°€λŠ₯ν•œμ§€ ν™•μΈν•œλ‹€.
  2. GC Rootμ—μ„œ λΆ€ν„° μ‹œμž‘ν•˜μ—¬ 참쑰값을 따라가며 μ ‘κ·Ό κ°€λŠ₯ν•œ 객체듀에 Markν•˜λŠ” 과정을 μ§„ν–‰ν•œλ‹€.
  3. Mark λ˜μ§€ μ•Šμ€ 객체 즉, μ ‘κ·Όν•  수 μ—†λŠ” κ°μ²΄λŠ” 제거(Sweep) λŒ€μƒμ΄ 된고, ν•΄λ‹Ή 객체듀을 μ œκ±°ν•œλ‹€.

μ ‘κ·Ό κ°€λŠ₯ν•œ 객체 νŒλ‹¨ κ³Όμ •

GC Rootμ—μ„œ μ‹œμž‘ν•΄μ„œ μ°Έμ‘°ν•˜λŠ” 객체λ₯Ό μ°Ύκ³ , 또 κ·Έ 객체가 μ°Έμ‘°ν•˜λŠ” 객체λ₯Ό μ°Ύμ•„κ°€λ©° Mark ν•œλ‹€.

Mark λ˜μ§€ μ•Šμ€ κ°μ²΄λŠ” μ ‘κ·Όν•  수 μ—†λŠ” 객체 (Unreachable Object)둜 νŒλ‹¨ν•˜κ³  λ©”λͺ¨λ¦¬λ₯Ό 돌며 제거(Sweep)ν•œλ‹€.

GC Rootκ°€ 될 수 μžˆλŠ” λŒ€μƒ

  • JVM λ©”λͺ¨λ¦¬μ˜ Stack μ˜μ—­μ— μ‘΄μž¬ν•˜λŠ” μ°Έμ‘° λ³€μˆ˜
  • Method Area의 static λ°μ΄ν„°
  • JNI에 μ˜ν•΄ μƒμ„±λœ 객체듀

 

1. Serial GC

Young μ˜μ—­κ³Ό Old μ˜μ—­μ΄ μ‹œλ¦¬μ–Όν•˜κ²Œ(μ—°μ†μ μœΌλ‘œ) 처리되며 ν•˜λ‚˜μ˜ CPUλ₯Ό μ‚¬μš©ν•œλ‹€.

이 처리λ₯Ό μˆ˜ν–‰ν•  λ•Œλ₯Ό Stop-the-world라고 ν‘œν˜„ν•œλ‹€. λ‹€μ‹œ λ§ν•˜λ©΄, μ½œλ ‰μ…˜μ΄ μˆ˜ν–‰λ  λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜ν–‰μ΄ μ •μ§€λœλ‹€.

  • κ°€μž₯ λ‹¨μˆœν•œ λ°©μ‹μ˜ GC둜 μ‹±κΈ€ μŠ€λ ˆλ“œ(μŠ€λ ˆλ“œ 1개)둜 λ™μž‘ν•œλ‹€.
  • μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜μ—¬ 느리고, 그만큼 Stop The World μ‹œκ°„이 λ‹€λ₯Έ GC에 λΉ„ν•΄ κΈΈλ‹€.
  • Mark & Sweep & Compact μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©
  • 보톡 μ‹€λ¬΄μ—μ„œ μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” μ—†μŒ (λ””λ°”μ΄μŠ€ μ„±λŠ₯이 μ•ˆμ’‹μ•„μ„œ CPU μ½”μ–΄κ°€ 1개인 κ²½μš°μ—λ§Œ μ‚¬μš©)

 

 

  1. 일단 μ‚΄μ•„μžˆλŠ” 객체듀은 Eden μ˜μ—­μ— μžˆλ‹€.
  2. Eden μ˜μ—­μ΄ κ½‰μ°¨κ²Œ 되면 To Survivor μ˜μ—­(λΉ„μ–΄μžˆλŠ” μ˜μ—­)으둜 μ‚΄μ•„ μžˆλŠ” 객체가 μ΄λ™ν•œλ‹€. μ΄λ•Œ Survivor μ˜μ—­μ— 듀어가기에 λ„ˆλ¬΄ 큰 κ°μ²΄λŠ” λ°”λ‘œ Old μ˜μ—­μœΌλ‘œ μ΄λ™ν•œλ‹€. 그리고 From Survivor μ˜μ—­μ— μžˆλŠ” μ‚΄μ•„ μžˆλŠ” κ°μ²΄λŠ” To Survivor μ˜μ—­μœΌλ‘œ μ΄λ™ν•œλ‹€.
  3. To Survivor μ˜μ—­μ΄ 꽉 찼을 경우, Eden μ˜μ—­μ΄λ‚˜ From Survivor μ˜μ—­μ— 남아 μžˆλŠ” 객체듀은 Old μ˜μ—­μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

이 이후에 Old μ˜μ—­μ΄λ‚˜ Perm μ˜μ—­μ— μžˆλŠ” 객체듀은 Mark-sweep-compact μ½œλ ‰μ…˜ μ•Œκ³ λ¦¬μ¦˜μ„ λ”°λ₯Έλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ λ§ν•˜λ©΄, μ•ˆ μ“°λŠ” κ±° ν‘œμ‹œν•΄μ„œ μ‚­μ œν•˜κ³  ν•œ 곳으둜 λͺ¨μœΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

Mark-sweep-compact μ•Œκ³ λ¦¬μ¦˜

1) Old μ˜μ—­μœΌλ‘œ μ΄λ™λœ 객체듀 쀑 μ‚΄μ•„ μžˆλŠ” 개체λ₯Ό μ‹λ³„ν•œλ‹€. (Mark)
2) Old μ˜μ—­μ˜ 객체듀을 ν›‘λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ—¬ μ“°λ ˆκΈ° 객체λ₯Ό μ‹λ³„ν•œλ‹€. (Sweep)
3) ν•„μš” μ—†λŠ” 객체듀을 μ§€μš°κ³  μ‚΄μ•„ μžˆλŠ” 객체듀을 ν•œ 곳으둜 λͺ¨μ€λ‹€. (Compact)

μ΄λ ‡κ²Œ μž‘λ™ν•˜λŠ” μ‹œλ¦¬μ–Ό μ½œλ ‰ν„°λŠ” 일반적으둜 ν΄λΌμ΄μ–ΈνŠΈ μ’…λ₯˜μ˜ μž₯λΉ„μ—μ„œ 많이 μ‚¬μš©λœλ‹€. λ‹€μ‹œ λ§ν•˜λ©΄, λŒ€κΈ° μ‹œκ°„μ΄ λ§Žμ•„λ„ 크게 λ¬Έμ œλ˜μ§€ μ•ŠλŠ” μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©λœλ‹€.

λͺ…μ‹œμ  지정 방법
-XX:+UseSerialGC

 

2. Parallel GC

이 방식은 throughput collectorλ‘œλ„ μ•Œλ €μ§„ 방식이닀. 이 λ°©μ‹μ˜ λͺ©ν‘œλŠ” λ‹€λ₯Έ CPUκ°€ λŒ€κΈ° μƒνƒœλ‘œ 남아 μžˆλŠ” 것을 μ΅œμ†Œν™”ν•˜λŠ” 것이닀.

μ‹œλ¦¬μ–Ό μ½œλ ‰ν„°μ™€ 달리 Young μ˜μ—­μ—μ„œμ˜ μ½œλ ‰μ…˜μ„ 병렬(Parallel)둜 μ²˜λ¦¬ν•œλ‹€. λ§Žμ€ CPU λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— GC의 λΆ€ν•˜λ₯Ό 쀄이고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ²˜λ¦¬λŸ‰μ„ μ¦κ°€μ‹œν‚¬ 수 μžˆλ‹€.

  • Java 8의 default GC
  • Young μ˜μ—­μ˜ GCλ₯Ό λ©€ν‹° μŠ€λ ˆλ“œ 방식을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—, Serial GC에 λΉ„ν•΄ μƒλŒ€μ μœΌλ‘œ Stop The World κ°€ 짧닀
    • Old μ˜μ—­μ€ μ•„λ‹˜
    • Old μ˜μ—­μ˜ GCλŠ” μ‹œλ¦¬μ–Ό μ½œλ ‰ν„°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ Mark-Sweep-Compact μ½œλ ‰μ…˜ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€.

 

λͺ…μ‹œμ  지정 방법
-XX:+UseParallelGC

 

3. Parallel Compacting GC

병렬 μ½œλ ‰ν„°μ™€ λ‹€λ₯Έ 점은 Old μ˜μ—­ GCμ—μ„œ μƒˆλ‘œμš΄ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€.

  • Parallel GCλŠ” Young μ˜μ—­μ— λŒ€ν•΄μ„œλ§Œ λ©€ν‹° μŠ€λ ˆλ“œ 방식을 μ‚¬μš©ν–ˆλ‹€λ©΄, Parallel Old GCλŠ” Oldμ˜μ—­κΉŒμ§€ λ©€ν‹°μŠ€λ ˆλ“œ 방식을 μ‚¬μš©

κ·ΈλŸ¬λ―€λ‘œ Young μ˜μ—­μ— λŒ€ν•œ GCλŠ” 병렬 μ½œλ ‰ν„°μ™€ λ™μΌν•˜μ§€λ§Œ, Old μ˜μ—­μ˜ GCλŠ” λ‹€μŒμ˜ 3단계λ₯Ό 거치게 λœλ‹€.

  1. Mark 단계 : μ‚΄μ•„ μžˆλŠ” 객체λ₯Ό μ‹λ³„ν•˜μ—¬ ν‘œμ‹œν•΄ λ†“λŠ” 단계
  2. Sweep 단계 : 이전에 GCλ₯Ό μˆ˜ν–‰ν•˜μ—¬ μ»΄νŒ©μ…˜λœ μ˜μ—­μ— μ‚΄μ•„ μžˆλŠ” 객체의 μœ„μΉ˜λ₯Ό μ‘°μ‚¬ν•˜λŠ” 단계
  3. Compact 단계 : μ»΄νŒ©μ…˜μ„ μˆ˜ν–‰ν•˜λŠ” 단계. μˆ˜ν–‰ μ΄ν›„μ—λŠ” μ»΄νŒ©μ…˜λœ μ˜μ—­κ³Ό λΉ„μ–΄ μžˆλŠ” μ˜μ—­μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

병렬 μ½œλ ‰ν„°μ™€ λ™μΌν•˜κ²Œ 이 방식도 μ—¬λŸ¬ CPUλ₯Ό μ‚¬μš©ν•˜λŠ” μ„œλ²„μ— μ ν•©ν•˜λ‹€. GCλ₯Ό μ‚¬μš©ν•˜λŠ” μŠ€λ ˆλ“œ κ°œμˆ˜λŠ” -XX:+ParallelGCThreads=n μ˜΅μ…˜μœΌλ‘œ 지정할 수 μžˆλ‹€.

λͺ…μ‹œμ  지정방법
-XX:+UseParallelOldGC
-XX:+ParallelGCThreads=n

 

4. Concurrent Mark-Sweep GC

Stop The World둜 Java Application이 λ©ˆμΆ”λŠ” ν˜„μƒμ„ μ€„μ΄κ³ μž λ§Œλ“  GC
Reacable ν•œ 객체λ₯Ό ν•œλ²ˆμ— 찾지 μ•Šκ³  λ‚˜λˆ μ„œ μ°ΎλŠ” 방식을 μ‚¬μš© (4 STEP)

이 방식은 low-latency collectorλ‘œλ„ μ•Œλ €μ Έ 있으며, νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ˜ 크기가 클 λ•Œ μ ν•©ν•˜λ‹€. Young μ˜μ—­μ— λŒ€ν•œ GCλŠ” 병렬 μ½œλ ‰ν„°μ™€ λ™μΌν•©λ‹ˆλ‹€. Old μ˜μ—­μ˜ GCλŠ” λ‹€μŒ 4단계λ₯Ό κ±°μΉœλ‹€.

  1. Initial Mark : GC Rootκ°€ μ°Έμ‘°ν•˜λŠ” 객체만 λ§ˆν‚Ή (stop-the-world λ°œμƒ)
    • μ‚΄μ•„ μžˆλŠ” 객체λ₯Ό μ°ΎλŠ” 단계
  2. Concurrent Mark : μ°Έμ‘°ν•˜λŠ” 객체λ₯Ό 따라가며, μ§€μ†μ μœΌλ‘œ λ§ˆν‚Ή. (stop-the-world 없이 이루어짐)
    • μ„œλ²„ μˆ˜ν–‰κ³Ό λ™μ‹œμ— μ‚΄μ•„ μžˆλŠ” 객체에 ν‘œμ‹œλ₯Ό ν•΄λ†“λŠ” 단계
  3. Remark : concurrent mark κ³Όμ •μ—μ„œ λ³€κ²½λœ 사항이 μ—†λŠ”μ§€ λ‹€μ‹œ ν•œλ²ˆ λ§ˆν‚Ήν•˜λ©° ν™•μ •ν•˜λŠ” κ³Όμ •. (stop-the-world λ°œμƒ)
  4. Concurrent Sweep : μ ‘κ·Όν•  수 μ—†λŠ” 객체λ₯Ό μ œκ±°ν•˜λŠ” κ³Όμ • (stop-the-world 없이 이루어짐)

μœ„μ™€ 같이 stop-the-worldκ°€ μ΅œλŒ€ν•œ 덜 λ°œμƒν•˜λ„λ‘ ν•˜μ—¬, Java Application이 λ©ˆμΆ”λŠ” ν˜„μƒμ„ 쀄인닀.

CMSλŠ” μ»΄νŒ©μ…˜ 단계λ₯Ό κ±°μΉ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ™Όμͺ½μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό λͺ°μ•„ λ†“λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έλž˜μ„œ GC 이후에 κ·Έλ¦Όκ³Ό 같이 빈 곡간이 λ°œμƒν•˜λ―€λ‘œ, -XX:+CMSInitiatingOccupancyFraction=n μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ Old μ˜μ—­μ˜ %λ₯Ό n 값에 μ§€μ •ν•©λ‹ˆλ‹€. (κΈ°λ³Έκ°’ : 68)

CMS μ½œλ ‰ν„°λŠ” 좔가적인 μ˜΅μ…˜μœΌλ‘œ 점진적 방식을 μ§€μ›ν•œλ‹€. 이 방식은 Young μ˜μ—­μ˜ GCλ₯Ό 더 잘게 μͺΌκ°œμ–΄ μ„œλ²„μ˜ λŒ€κΈ° μ‹œκ°„μ„ 쀄일 수 μžˆλ‹€. CPUκ°€ λ§Žμ§€ μ•Šκ³  μ‹œμŠ€ν…œμ˜ λŒ€κΈ° μ‹œκ°„μ΄ 짧아야 ν•  λ•Œ μ‚¬μš©ν•˜λ©΄ μ’‹λ‹€.
점진적은 GCλ₯Ό μˆ˜ν–‰ν•˜λ €λ©΄ -XX:+CMSIncrementalMode μ˜΅μ…˜μ„ μ§€μ •ν•˜λ©΄ λœλ‹€. JVM에 λ”°λΌμ„œλŠ” -XingcλΌλŠ” μ˜΅μ…˜μ„ 지정해도 같은 μ˜λ―Έκ°€ λœλ‹€. ν•˜μ§€λ§Œ 이 μ˜΅μ…˜μ„ 지정할 경우 예기치 λͺ»ν•œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ, μΆ©λΆ„ν•œ ν…ŒμŠ€νŠΈλ₯Ό ν•œ 후에 운영 μ„œλ²„μ— μ μš©ν•΄μ•Ό ν•œλ‹€.

CMS GCλŠ” 2개 μ΄μƒμ˜ ν”„λ‘œμ„Έμ„œλ₯Ό μ‚¬μš©ν•˜λŠ” μ„œλ²„μ— μ λ‹Ήν•˜λ‹€. κ°€μž₯ μ λ‹Ήν•œ λŒ€μƒμœΌλ‘œλŠ” μ›Ή μ„œλ²„κ°€ μžˆλ‹€.

λͺ…μ‹œμ  지정방법
-XX:+UseConcMarkSweepGC
-XX:+CMSInitiatingOccupancyFraction=n
-XX:+CMSIncrementalMode

CMS GCλŠ” Java9 버젼뢀터 deprecated λ˜μ—ˆκ³  κ²°κ΅­ Java14μ—μ„œλŠ” μ‚¬μš©μ΄ μ€‘μ§€λ˜μ—ˆλ‹€.

 

5. G1 GC

  • Java 9 λΆ€ν„° default GC
  • ν˜„μž¬ GC 쀑 stop-the-world의 μ‹œκ°„μ΄ 제일 짧음
  • μ–΄λ– ν•œ GC 방식보닀 처리 속도가 λΉ λ₯΄λ©° ν° λ©”λͺ¨λ¦¬ κ³΅κ°„μ—μ„œ λ©€ν‹° ν”„λ‘œλ ˆμŠ€ 기반으둜 μš΄μ˜λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•΄ κ³ μ•ˆλ˜μ—ˆλ‹€. λ˜ν•œ G1 GCλŠ” λ‹€λ₯Έ GC λ°©μ‹μ˜ μ²˜λ¦¬μ†λ„λ₯Ό λŠ₯κ°€ν•œλ‹€.
  • CMS GC λ₯Ό κ°œμ„ ν•˜μ—¬ λ§Œλ“  GC둜 μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ GCμ™€λŠ” λ‹€λ₯Έ ꡬ쑰λ₯Ό 가진닀.

  • Heap을 Regionμ΄λΌλŠ” μΌμ •ν•œ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆ μ„œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•œλ‹€.
    • κΈ°μ‘΄ GC처럼 물리적인 μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ§€ μ•Šκ³ , Region(지역)μ΄λΌλŠ” κ°œλ…μ„ μƒˆλ‘œ λ„μž…ν•˜μ—¬ Heap을 κ· λ“±ν•˜κ²Œ μ—¬λŸ¬ 개의 μ§€μ—­μœΌλ‘œ λ‚˜λˆ„κ³ , 각 지역을 μ—­ν• κ³Ό ν•¨κ»˜ λ…Όλ¦¬μ μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬(Eden 지역인지, Survivor 지역인지, Old 지역인지) 객체λ₯Ό ν• λ‹Ήν•œλ‹€.
  • G1 GCμ—μ„œλŠ” Eden, Survivor, Old 역할에 더해 Humongous와 Availalbe/UnusedλΌλŠ” 2가지 역할을 μΆ”κ°€ν•˜μ˜€λ‹€. HumongousλŠ” Region 크기의 50%λ₯Ό μ΄ˆκ³Όν•˜λŠ” 객체λ₯Ό μ €μž₯ν•˜λŠ” Region을 μ˜λ―Έν•˜λ©°, Availabe/UnusedλŠ” μ‚¬μš©λ˜μ§€ μ•Šμ€ Region을 μ˜λ―Έν•œλ‹€. 
  • G1 GC의 핡심은 전체 Heap에 λŒ€ν•΄μ„œ νƒμƒ‰ν•˜μ§€ μ•Šκ³  λΆ€λΆ„μ μœΌλ‘œ Region λ‹¨μœ„λ‘œ νƒμƒ‰ν•˜μ—¬, 가비지가 λ§Žμ€ Regionμ—λ§Œ μš°μ„ μ μœΌλ‘œ GCλ₯Ό μˆ˜ν–‰ν•˜λŠ” 것이닀.
  • G1 GC도 λ‹€λ₯Έ 가비지 μ»¬λ ‰μ…˜κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ 2가지 GC(Minor GC, Major GC)둜 λ‚˜λˆ„μ–΄ μˆ˜ν–‰λœλ‹€.

1. Minor GC

ν•œ 지역에 객체λ₯Ό ν• λ‹Ήν•˜λ‹€κ°€ ν•΄λ‹Ή 지역이 꽉 μ°¨λ©΄ λ‹€λ₯Έ 지역에 객체λ₯Ό ν• λ‹Ήν•˜κ³ , Minor GCκ°€ μ‹€ν–‰λœλ‹€. G1 GCλŠ” 각 지역을 μΆ”μ ν•˜κ³  있기 λ•Œλ¬Έμ—, 가비지가 κ°€μž₯ λ§Žμ€(Garbage First) 지역을 μ°Ύμ•„μ„œ Mark and Sweepλ₯Ό μˆ˜ν–‰ν•œλ‹€.

Eden μ§€μ—­μ—μ„œ GCκ°€ μˆ˜ν–‰λ˜λ©΄ 살아남은 객체λ₯Ό 식별(Mark)ν•˜κ³ , λ©”λͺ¨λ¦¬λ₯Ό 회수(Sweep)ν•œλ‹€. 그리고 살아남은 객체λ₯Ό λ‹€λ₯Έ μ§€μ—­μœΌλ‘œ μ΄λ™μ‹œν‚€κ²Œ λœλ‹€. λ³΅μ œλ˜λŠ” 지역이 Available/Unused 지역이면 ν•΄λ‹Ή 지역은 이제 Survivor μ˜μ—­μ΄ 되고, Eden μ˜μ—­μ€ Available/Unused 지역이 λœλ‹€.

2. Major GC(Full GC)

μ‹œμŠ€ν…œμ΄ 계속 μš΄μ˜λ˜λ‹€κ°€ 객체가 λ„ˆλ¬΄ λ§Žμ•„ λΉ λ₯΄κ²Œ λ©”λͺ¨λ¦¬λ₯Ό 회수 ν•  수 없을 λ•Œ Major GC(Full GC)κ°€ μ‹€ν–‰λœλ‹€. 그리고 μ—¬κΈ°μ„œ G1 GC와 λ‹€λ₯Έ GC의 차이점이 두각을 보인닀.

기쑴의 λ‹€λ₯Έ GC μ•Œκ³ λ¦¬μ¦˜μ€ λͺ¨λ“  Heap의 μ˜μ—­μ—μ„œ GCκ°€ μˆ˜ν–‰λ˜μ—ˆμœΌλ©°, 그에 따라 처리 μ‹œκ°„μ΄ μƒλ‹Ήνžˆ 였래 κ±Έλ Έλ‹€. ν•˜μ§€λ§Œ G1 GCλŠ” μ–΄λŠ μ˜μ—­μ— 가비지가 λ§Žμ€μ§€λ₯Ό μ•Œκ³  있기 λ•Œλ¬Έμ— GCλ₯Ό μˆ˜ν–‰ν•  지역을 μ‘°ν•©ν•˜μ—¬ ν•΄λ‹Ή 지역에 λŒ€ν•΄μ„œλ§Œ GCλ₯Ό μˆ˜ν–‰ν•œλ‹€. 그리고 μ΄λŸ¬ν•œ μž‘μ—…μ€ Concurrentν•˜κ²Œ μˆ˜ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 지연도 μ΅œμ†Œν™”ν•  수 μžˆλŠ” 것이닀.

λ¬Όλ‘  G1 GCλŠ” λ‹€λ₯Έ GC 방식에 λΉ„ν•΄ 잦게 호좜될 것이닀. ν•˜μ§€λ§Œ μž‘μ€ 규λͺ¨μ˜ λ©”λͺ¨λ¦¬ 정리 μž‘μ—…μ΄κ³  Concurrentν•˜κ²Œ μˆ˜ν–‰λ˜κΈ° λ•Œλ¬Έμ΄ 지연이 크지 μ•ŠμœΌλ©°, 가비지가 λ§Žμ€ 지역에 λŒ€ν•΄ 정리λ₯Ό ν•˜λ―€λ‘œ 훨씬 νš¨μœ¨μ μ΄λ‹€.

λͺ…μ‹œμ  지정방법
-XX:+UseG1GC

 

GC 방식 비ꡐ

λ„€ μ’…λ₯˜ GC 방식에 λŒ€ν•œ μ„±λŠ₯ 및 κΈ°λŠ₯ 비ꡐ ν‘œ

μœ„μ˜ λ‚΄μš©μ„ μ’…ν•©ν•˜λ©΄, GC μˆ˜ν–‰ μ‹œμ μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  1. 각 μ˜μ—­μ˜ ν• λ‹Ήλœ 크기의 λ©”λͺ¨λ¦¬κ°€ ν—ˆμš©μΉ˜λ₯Ό λ„˜μ„ λ•Œ
  2. κ°œλ°œμžκ°€ μ»¨νŠΈλ‘€ν•  μ˜μ—­μ€ μ•„λ‹˜

개발자라면, μžλ°”μ˜ GC 방식을 μ™Έμš°λ©΄μ„œ κ°œλ°œν•˜κ±°λ‚˜ μ„œλ²„λ₯Ό μ„ΈνŒ…ν•  ν•„μš”λŠ” μ—†λ‹€. μ΄ν•΄λ§Œ ν•˜κ³  있으면 λœλ‹€. λ‹¨, ν•„μš”ν• λ•Œ(μ‹œμŠ€ν…œ μ˜€ν”ˆ μ „ μ„±λŠ₯ ν…ŒμŠ€νŠΈ / μ„œλ²„ μ„ΈνŒ… μ‹œ), μ•Œλ§žμ€ GC 방식을 κ°œλ°œν•œ μ‹œμŠ€ν…œμ— μ μš©ν•˜λ©΄ λœλ‹€κ³  ν•œλ‹€.

 

μ°Έκ³ 

λŒ“κΈ€