์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

GC ํŠœ๋‹ ๊ธฐ๋ณธ

๐Ÿ˜Ž ์ง€์‹ in Action/Java & Kotlin

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2026. 4. 1. 23:42

๋ณธ๋ฌธ

728x90

1) JVM์˜ ์ฃผ์š” default ์„ค์ •

1. ์„œ๋ฒ„์šฉ ๋จธ์‹  : G1GC๊ฐ€ ์‚ฌ์šฉ, ๊ทธ ์™ธ : Serial Collector ์‚ฌ์šฉ

2. Initial heap size (JVM์ด ์‹œ์ž‘ํ•  ๋•Œ ๋ฐ”๋กœ ํ™•๋ณดํ•˜๋Š” heap ํฌ๊ธฐ) : RAM์˜ 1/64

3. maximum heap size (JVM heap์˜ ์ตœ๋Œ€ ํฌ๊ธฐ) : RAM์˜ 1/4

4. minimum heap size (JVM heap์˜ ์ตœ์†Œ ํฌ๊ธฐ) : ๋””ํดํŠธ ๊ฐ’ ์„ค์ •์ด ์•ฝ๊ฐ„ ๋ณต์žกํ•˜๊ฒŒ ๊ฒฐ์ •๋จ

 

 

=> ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์ด ์„ธ๊ฐ€์ง€ ๊ฐ’์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถค 

5. ์ตœ๋Œ€ GC thread ์ˆ˜ : heap size์™€ ์ด์šฉ ๊ฐ€๋Šฅํ•œ CPU resources์— ์˜ํ•ด ๊ฒฐ์ •๋จ

6. JIT ์ปดํŒŒ์ผ๋Ÿฌ : C1๊ณผ C2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” tiered compiler ์‚ฌ์šฉ

 

 

์‹คํ–‰ ์ค‘์ธ ์ž๋ฐ” ํ”„๋กœ์„ธ์Šค์˜ JVM ๊ธฐ๋ณธ ์˜ต์…˜ ๋ณด๊ธฐ 

jps -l # ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ž๋ฐ” ํ”„๋กœ์„ธ์Šค ID ๋ฆฌ์ŠคํŠธ

jcmd ํ”„๋กœ์„ธ์Šค์•„์ด๋”” VM.flags # ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋œ VM Option

 

2) ํŠœ๋‹ ๋Œ€์ƒ 

์ตœ๋Œ€ ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„(Maximum Pause-Time Goal) : -XX:MaxGCPauseMillis=๋ฐ€๋ฆฌ์ดˆ

 - ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„ :  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ค‘์ง€ํ•˜๊ณ  ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ณต๊ฐ„์„ ํšŒ์ˆ˜ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ 

- pause time์ด ์•„๋ฌด๋ฆฌ ๊ธธ์–ด๋„ `maximum pause-time goal`๋ณด๋‹ค๋Š” ์ ์–ด์•ผ ํ•œ๋‹ค 
- GC๋Š” pause time์— ๋Œ€ํ•œ ๊ฐ€์ค‘ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์„ ๊ณ„์‚ฐํ•ด์„œ ์ด ๋‘˜์˜ ํ•ฉ์„ maximum pause-time ์œผ๋กœ ์„ค์ •
- maximum pause-time goal์˜ ๋””ํดํŠธ ๊ฐ’์€ collector๋งˆ๋‹ค ๋‹ค๋ฆ„

 

>> heap size๋‚˜ gc ๊ด€๋ จ ์—ฌ๋Ÿฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ์กฐ์ •ํ•˜์—ฌ pause time์„ nnn milliseconds๋ณด๋‹ค ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋ ค๊ณ  ์‹œ๋„ 

 

Q. ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ์‹ถ์–ด+ํž™ ๊ด€์ ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์กฐ์ ˆํ•ด์•ผ ํ•˜๋Š”๊ฐ€

ํž™ ์‚ฌ์ด์ฆˆ ์ค„์ด๊ธฐ (ํƒ์ƒ‰ํ•ด์•ผํ•˜๋Š” ํž™๋‚ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ค„์–ด๋“ค์Œ) 

 

์ฒ˜๋ฆฌ๋Ÿ‰ ๋ชฉํ‘œ(Throughput Goal)  : -XX:GCTimeRatio=nnn

- GC time๊ณผ application time์„ ๋น„๊ตํ•ด์„œ ํŠน์ • ๋น„์œจ์„ ๋งž์ถ˜๋‹ค 

- `-XX:GCTimeRatio=nnn`๋กœ ์ง€์ •. `GC Time Ratio = 1/(1+nnn)`๋กœ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•œ๋‹ค 

 

Q. throughput goal์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ

ํž™ ์‚ฌ์ด์ฆˆ ๋Š˜์ด๊ธฐ 

 

ํ’‹ํ”„๋ฆฐํŠธ (Minimum Footprint Goal)

- ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ฐ ์ตœ๋Œ€ ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„ ๋ชฉํ‘œ๊ฐ€ ์ถฉ์กฑ๋˜๋ฉด, ๋‘ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜(๋Œ€๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ชฉํ‘œ)๋ฅผ ๋” ์ด์ƒ ์ถฉ์กฑํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ํž™ ํฌ๊ธฐ๋ฅผ ์ค„์ธ๋‹ค

(๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ ์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์—ฌ์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค)

- ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค 

 

-Xms=<nnn>  : ์ตœ์†Œ ํž™ ํฌ๊ธฐ 

-Xmx=<mmm> : ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ 

 

 

Q. ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ตœ์†Œ ํž™ = ์ตœ๋Œ€ ํž™ . ์™œ ?

๋Ÿฐํƒ€์ž„ ์ค‘ ํž™ ํฌ๊ธฐ ๋ณ€ํ™”๋ฅผ ๋ง‰์•„์„œ GC ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด

 

 

์„œ๋ฒ„๋Š”:

  • ํ•ญ์ƒ ํŠธ๋ž˜ํ”ฝ ์žˆ์Œ
  • latency ๋ฏผ๊ฐ (ํŠนํžˆ API)
  • ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ ์ค‘์š”

๐Ÿ‘‰ ํž™์ด ๋Š˜์–ด๋‚˜๋ฉด:

  • GC pause ์‹œ๊ฐ„ ์ฆ๊ฐ€
  • ์š”์ฒญ ์ง€์—ฐ ๋ฐœ์ƒ
  • tail latency ํА (์ด๊ฒŒ ์ œ์ผ ์œ„ํ—˜)

 

3) ํž™ ์‚ฌ์ด์ฆˆ ํŠœ๋‹์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€ 

throughput goal์„ ์žก๊ณ  max heap size๋ฅผ ์žก๋Š”๋‹ค (swap ์—†์ด)

๊ทธ๋Ÿผ์—๋„ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜์ง€ ๋ชปํ•˜๋ฉด RAM ์ด ์ด throughput ์„ ๊ฐ๋‹นํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค 

๋‹ฌ์„ฑํ–ˆ๋Š”๋ฐ pause time์ด ๋„ˆ๋ฌด ๊ธธ๋ฉด maximum pause-time goal ์„ ์ง€์ •ํ•œ๋‹ค 

(๋‹จ, throughput goal๊ณผ maximum pause-time goal์€ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„ ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํ•œ ํƒ€ํ˜‘์ด ํ•„์š”ํ•˜๋‹ค)

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•œ๋‹ค 

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ