๐Ÿ“Š GC ๋กœ๊ทธ ์ƒ์„ธ ๋ถ„์„


[GC pause (G1 Evacuation Pause) (young), 0.0456789 secs]
[Parallel Time: 40.0 ms, GC Workers: 8]
[Eden: 512M(512M)->0B(512M) Survivors: 32M->32M Heap: 1024M(2048M)->512M(2048M)]

๐Ÿ” ๋กœ๊ทธ ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ๋ถ„์„

๊ตฌ์„ฑ ์š”์†Œ ๊ฐ’ ์ƒ์„ธ ์„ค๋ช…
GC ํƒ€์ž… G1 Evacuation Pause (young) โ€ข G1GC์˜ Young Generation ์ˆ˜์ง‘
โ€ข Minor GC๋กœ Eden๊ณผ Survivor ์˜์—ญ๋งŒ ์ •๋ฆฌ
โ€ข Old ์˜์—ญ์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ
์ „์ฒด ์†Œ์š” ์‹œ๊ฐ„ 0.0456789 secs (45.6ms) โ€ข Stop-The-World ์‹œ๊ฐ„
โ€ข ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ ์ •์ง€
โ€ข ์ผ๋ฐ˜ ์„œ๋น„์Šค: 100ms ์ดํ•˜ ์–‘ํ˜ธ
โ€ข ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค: ๊ฐœ์„  ํ•„์š”
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ 40.0 ms โ€ข ์‹ค์ œ GC ์ž‘์—… ์‹œ๊ฐ„
โ€ข ์ „์ฒด ์‹œ๊ฐ„์˜ 87.6% ์ฐจ์ง€
โ€ข ๋‚˜๋จธ์ง€ 5.6ms๋Š” ์ค€๋น„/์ •๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ
GC Workers 8๊ฐœ โ€ข ๋ณ‘๋ ฌ๋กœ ์ž‘์—…ํ•˜๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜
โ€ข CPU ์ฝ”์–ด ์ˆ˜์™€ ์—ฐ๊ด€
โ€ข -XX:ParallelGCThreads๋กœ ์กฐ์ • ๊ฐ€๋Šฅ

๐Ÿ“ˆ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๋ณ„ ๋ณ€ํ™”

๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ GC ์ „ GC ํ›„ ์ตœ๋Œ€ ํฌ๊ธฐ ๋ถ„์„
Eden 512M 0B 512M โ€ข 100% ์‚ฌ์šฉ โ†’ ์™„์ „ ๋น„์›€
โ€ข ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋Š” Survivor๋กœ ์ด๋™
โ€ข ์ฃฝ์€ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ์ œ๊ฑฐ๋จ
Survivors 32M 32M - โ€ข ํฌ๊ธฐ ๋ณ€ํ™” ์—†์Œ
โ€ข From๊ณผ To ์˜์—ญ ๊ฐ„ Swap ๋ฐœ์ƒ
โ€ข ์ผ๋ถ€๋Š” Old๋กœ ์Šน๊ฒฉ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ
์ „์ฒด Heap 1024M 512M 2048M โ€ข 50% ๊ฐ์†Œ (512MB ํšŒ์ˆ˜)
โ€ข ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ 25%๋งŒ ์‚ฌ์šฉ ์ค‘
โ€ข ์ถฉ๋ถ„ํ•œ ์—ฌ์œ  ๊ณต๊ฐ„ ํ™•๋ณด

๐Ÿ’ก ์„ฑ๋Šฅ ์ง€ํ‘œ ํ•ด์„

  • GC ํšจ์œจ์„ฑ: 512MB ์ค‘ ๋Œ€๋ถ€๋ถ„์ด ๊ฐ€๋น„์ง€์˜€์Œ โ†’ ๋†’์€ ํšจ์œจ
  • ์ฒ˜๋ฆฌ ์†๋„: 512MB๋ฅผ 45ms์— ์ฒ˜๋ฆฌ โ†’ ์•ฝ 11GB/์ดˆ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰
  • ๋ณ‘๋ ฌํ™” ํšจ๊ณผ: 8๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ 40ms ๋™์•ˆ ์ž‘์—… โ†’ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋Œ€๋น„ ์•ฝ 6-7๋ฐฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ

์‹ค๋ฌด ํŒ: Full GC๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด Old ์˜์—ญ์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์˜์‹ฌ๋œ๋‹ค.

  • ์‹œ๊ฐ„๋‹น 1ํšŒ ์ด์ƒ: ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ•ํ™”
  • 10๋ถ„๋‹น 1ํšŒ ์ด์ƒ: ํŠœ๋‹ ๊ฒ€ํ† 
  • ๋ถ„๋‹น 1ํšŒ ์ด์ƒ: ์ฆ‰์‹œ ๋Œ€์‘ ํ•„์š”

๐Ÿšจ OutOfMemoryError(๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ) ๋Œ€์ฒ˜๋ฒ•

1. Heap ํฌ๊ธฐ ์ฆ๊ฐ€ (-Xmx ์˜ต์…˜)

์„ค์ • ๋ฐฉ๋ฒ• ์˜ˆ์‹œ ์ฃผ์˜์‚ฌํ•ญ
๊ธฐ๋ณธ ์„ค์ • -Xms4g -Xmx4g โ€ข ์ดˆ๊ธฐ/์ตœ๋Œ€ ํฌ๊ธฐ ๋™์ผ ์„ค์ •
โ€ข ๋ฆฌ์‚ฌ์ด์ง• ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐฉ์ง€
Container ํ™˜๊ฒฝ -XX:MaxRAMPercentage=75.0 โ€ข ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
โ€ข ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๊ณ ๋ ค
๋Œ€์šฉ๋Ÿ‰ ์„ค์ • -Xmx32g โ€ข 32GB ์ด์ƒ์€ ์••์ถ• OOP ๋น„ํ™œ์„ฑํ™”
โ€ข ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ €ํ•˜ ์ฃผ์˜

2. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ ํ•ด์ œ (์ฝ”๋“œ ์ ๊ฒ€)

  • Static ์ปฌ๋ ‰์…˜ ๊ด€๋ฆฌ: Cache๋‚˜ Map์˜ ๋ฌดํ•œ ์ฆ๊ฐ€ ๋ฐฉ์ง€
  • ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ: Event Listener ๋“ฑ๋ก ํ›„ ๋ฐ˜๋“œ์‹œ ํ•ด์ œ
  • ThreadLocal ์ •๋ฆฌ: ์‚ฌ์šฉ ํ›„ remove() ํ˜ธ์ถœ ํ•„์ˆ˜
  • ์ž์› ๊ด€๋ฆฌ: try-with-resources ํŒจํ„ด ํ™œ์šฉ
  • ์ฐธ์กฐ ํƒ€์ž… ํ™œ์šฉ: WeakReference/SoftReference ๊ฒ€ํ† 

3. GC ํŠœ๋‹ ์˜ต์…˜

GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ถŒ์žฅ ์˜ต์…˜ ์ ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค
G1GC -XX:+UseG1GC
-XX:MaxGCPauseMillis=200
โ€ข ์ผ๋ฐ˜์ ์ธ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ€ข 4GB ์ด์ƒ Heap
ZGC -XX:+UseZGC
-XX:ConcGCThreads=4
โ€ข ์ดˆ์ €์ง€์—ฐ ์š”๊ตฌ์‚ฌํ•ญ
โ€ข ๋Œ€์šฉ๋Ÿ‰ Heap (์ˆ˜์‹ญ GB ์ด์ƒ)
Parallel GC -XX:+UseParallelGC
-XX:ParallelGCThreads=8
โ€ข ์ฒ˜๋ฆฌ๋Ÿ‰ ์ตœ์šฐ์„ 
โ€ข ๋ฐฐ์น˜ ์ž‘์—…

4. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํƒ์ง€ ๋„๊ตฌ

๋„๊ตฌ ์‚ฌ์šฉ๋ฒ• ์ฃผ์š” ๊ธฐ๋Šฅ
Heap Dump jmap -dump:format=b,file=heap.hprof <PID> โ€ข ๋ฉ”๋ชจ๋ฆฌ ์Šค๋ƒ…์ƒท ์ƒ์„ฑ
โ€ข ์‚ฌํ›„ ๋ถ„์„์šฉ
MAT Leak Suspects Report ์‹คํ–‰ โ€ข ๋ˆ„์ˆ˜ ์˜์‹ฌ ๊ฐ์ฒด ์ž๋™ ํƒ์ง€
โ€ข Dominator Tree ๋ถ„์„
VisualVM ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง โ€ข CPU/Memory ํ”„๋กœํŒŒ์ผ๋ง
โ€ข ์‹ค์‹œ๊ฐ„ GC ํ™œ๋™ ์ถ”์ 
APM ๋„๊ตฌ Pinpoint, Datadog ๋“ฑ โ€ข ์žฅ๊ธฐ๊ฐ„ ์ถ”์ด ๋ถ„์„
โ€ข ์•Œ๋ฆผ ์ž๋™ํ™”

๐ŸŽฏ ๊ฒฐ๋ก 

JVM ๊ตฌ์กฐ์™€ GC ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด, ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠนํžˆ ์„œ๋ฒ„ ์šด์˜, ์žฅ์•  ๋Œ€์‘, ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์—์„œ GC ๋กœ๊ทธ ํ•ด์„ ๋Šฅ๋ ฅ์€ ํ•„์ˆ˜๋‹ค.

๐Ÿ“Œ ์‹ค๋ฌด์—์„œ ๊ผญ ๊ธฐ์–ตํ•  ๊ฒƒ

Heap/GC ์˜ต์…˜์€ ์„œ๋น„์Šค ํŠน์„ฑ์— ๋งž๊ฒŒ ์กฐ์ •

  • ๋ ˆ์ดํ„ด์‹œ ๋ฏผ๊ฐ: G1GC/ZGC + ์ž‘์€ Heap + ์žฆ์€ GC
  • ์ฒ˜๋ฆฌ๋Ÿ‰ ์ค‘์‹ฌ: Parallel GC + ํฐ Heap + ๋“œ๋ฌธ GC
  • ์ผ๋ฐ˜ ์›น์„œ๋น„์Šค: G1GC + 4-8GB Heap์ด ๋ฌด๋‚œ

GC ๋กœ๊ทธ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ํ•„์ˆ˜ ๋กœ๊ทธ ์„ค์ •: -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M
  • ์ฃผ์š” ์ง€ํ‘œ: GC ๋นˆ๋„, ์†Œ์š” ์‹œ๊ฐ„, Heap ์‚ฌ์šฉ ์ถ”์ด
  • ์•Œ๋ฆผ ์ž„๊ณ„๊ฐ’: Full GC ๋นˆ๋ฐœ, GC ์‹œ๊ฐ„ 100ms ์ดˆ๊ณผ, Heap ์‚ฌ์šฉ๋ฅ  85% ์ด์ƒ

OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, Heap Dump ๋ถ„์„๊ณผ ์ฝ”๋“œ ์ ๊ฒ€์„ ๋ณ‘ํ–‰

  • ์ž๋™ ๋คํ”„ ์„ค์ •: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps
  • ๋ถ„์„ โ†’ ์›์ธ ํŒŒ์•… โ†’ ์ฝ”๋“œ ์ˆ˜์ • โ†’ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ โ†’ ๋ฐฐํฌ์˜ ์‚ฌ์ดํด
  • ๊ทผ๋ณธ ์›์ธ ํ•ด๊ฒฐ ์—†์ด Heap๋งŒ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ ์ž„์‹œ๋ฐฉํŽธ

์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•ด๋‘๋ฉด, ๋‚˜์ค‘์— ์‹ค๋ฌด์—์„œ JVM/GC ์ด์Šˆ๊ฐ€ ํ„ฐ์กŒ์„ ๋•Œ ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
GC ๋กœ๊ทธ ํ•œ ์ค„ ํ•œ ์ค„์ด ์„œ๋น„์Šค์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ๋งํ•ด์ฃผ๋Š” ์ค‘์š”ํ•œ ์ง€ํ‘œ์ž„์„ ์žŠ์ง€ ๋ง์ž.



Written by@[namu]
๋ชจ๋ฐ”์ผ, ์Šค๋งˆํŠธํฐ, ๊ธˆ์œต, ์žฌํ…Œํฌ, ์ƒํ™œ ์ •๋ณด ๋“ฑ