๐ŸŒฑ JAVA & SPRING/Java (JVM)

JVM GC์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •

ming412 2023. 8. 24. 12:12

GC(Garbage Collector)๋ž€?

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” Garbage๋ž€, ๋™์ ์œผ๋กœ ํ• ๋‹นํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์ค‘ ํ•„์š”์—†๊ฒŒ ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Garbage Collector๋ฅผ ํ•œ ๋‹จ์–ด๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด "์“ฐ๋ ˆ๊ธฐ ๊ฐ์ฒด ์ •๋ฆฌ์ž" ์ •๋„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

GC ๋Œ€์ƒ

GC๋Š” Heap ์˜์—ญ์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค. GC์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ, Heap ์˜์—ญ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.

 

Heap์€ ์ฒ˜์Œ ์„ค๊ณ„๋  ๋•Œ 2๊ฐ€์ง€ ์ „์ œ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค.

1. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” ๊ธˆ๋ฐฉ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(Unreachable)๊ฐ€ ๋œ๋‹ค.

2. ์˜ค๋ž˜๋œ ๊ฐ์ฒด์—์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ์˜ ์ฐธ์กฐ๋Š” ์•„์ฃผ ์ ๊ฒŒ ์กด์žฌํ•œ๋‹ค.

 

์ฆ‰, ๊ฐ์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ ์ผํšŒ์„ฑ์ด๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ค๋žซ๋™์•ˆ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์ด์šฉํ•ด JVM ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ฐ์ฒด์˜ ์ƒ์กด ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ๋ฌผ๋ฆฌ์ ์ธ Heap ์˜์—ญ์„ ๋‚˜๋ˆ„๊ฒŒ ๋˜์—ˆ๊ณ  Young ์˜์—ญ๊ณผ Old ์˜์—ญ์œผ๋กœ ์„ค๊ณ„ํ•˜์˜€๋‹ค. (์ดˆ๊ธฐ์—๋Š” Permanet ์˜์—ญ๋„ ์žˆ์—ˆ์ง€๋งŒ Java 8๋ถ€ํ„ฐ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค.)

Heap Area

New/Young ์˜์—ญ

- Eden: ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์ตœ์ดˆ๋กœ ์ €์žฅ๋˜๋Š” ์˜์—ญ

- Survivor 0 / 1: Eden ์˜์—ญ์—์„œ ๊ณ„์†ํ•ด์„œ ์ฐธ์กฐ๋˜๋Š”(Reachable) ๊ฐ์ฒด๋“ค์ด ๋ณต์‚ฌ๋˜๋Š” ์˜์—ญ

 

๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ๊ธˆ๋ฐฉ Unreachable ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

 

Eden ์˜์—ญ์— ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด Minor GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Eden ์˜์—ญ์— ์žˆ๋Š” ๊ฐ’๋“ค์„ Survivor ์˜์—ญ์— ๋ณต์‚ฌํ•˜๊ณ  ์ด ์˜์—ญ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Survivor ์˜์—ญ์—๋Š” ์ตœ์†Œ 1๋ฒˆ์˜ GC์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ์กด์žฌํ•œ๋‹ค.

 

Old ์˜์—ญ

Young ์˜์—ญ์—์„œ ๊ณ„์†ํ•ด์„œ ์ฐธ์กฐ๋˜๋Š” ๊ฐ์ฒด๋“ค์ด ๋ณต์‚ฌ๋˜๋Š” ์˜์—ญ์ด๋‹ค.

Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋ฉฐ, ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๋งŒํผ ๊ฐ€๋น„์ง€๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.

Old ์˜์—ญ์ด ๊ฝ‰ ์ฐผ์„ ๋•Œ Full(=Major) GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. Full GC๊ฐ€ ์ผ์–ด๋‚จ๊ณผ ๋™์‹œ์— ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉ์ด ์ €ํ•˜๋œ๋‹ค.

Old ์˜์—ญ์ด Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋Š” ์ด์œ ๋Š”,
Young ์˜์—ญ์˜ ์ˆ˜๋ช…์ด ์งง์€ ๊ฐ์ฒด๋“ค์€ ํฐ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํฐ ๊ฐ์ฒด๋“ค์€ Young ์˜์—ญ์ด ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ Old ์˜์—ญ์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Permanent ์˜์—ญ

ํด๋ž˜์Šค๋กœ๋”์— ์˜ํ•ด load ๋˜๋Š” ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ ๋“ฑ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์ด๋‹ค.

Java 7๊นŒ์ง€๋Š” ํž™ ์˜์—ญ์— ์กด์žฌํ–ˆ์ง€๋งŒ Java 8๋ถ€ํ„ฐ Metaspace๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.

Metaspace
Default๋กœ ์ œํ•œ๋œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์กŒ๋˜ Permanet ์˜์—ญ๋ณด๋‹ค ๋” ๋™์ ์ด๋ฉฐ ํ•„์š”ํ•œ ๋งŒํผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
JVM์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ํž™ ์˜์—ญ์ด ์•„๋‹ˆ๋ผ, OS์—์„œ ๊ด€๋ฆฌ๋˜๋Š” Native ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.
Metaspace๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ํž™(Heap)์— ํ• ๋‹น๋˜๋ฉฐ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋” ํฐ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

Java 8 ์ „/ํ›„ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

 

GC์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •

Minor GC

1. ์ฒ˜์Œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” Young Generation ์˜์—ญ์˜ ์ผ๋ถ€์ธ Eden ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.

2. ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜์–ด Eden ์˜์—ญ์ด ๊ฝ‰์ฐจ๊ฒŒ ๋˜๊ณ  Minor GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

3. Mark ๋™์ž‘์„ ํ†ตํ•ด reachable ๊ฐ์ฒด๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

4. Eden ์˜์—ญ์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” 1๊ฐœ์˜ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

5. Eden ์˜์—ญ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”(unreachable) ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ(sweep)ํ•œ๋‹ค.

6. ์‚ด์•„๋‚จ์€ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์€ age๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

7. ๋˜ ๋‹ค์‹œ ์‹ ๊ทœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด Eden ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.

8. Eden ์˜์—ญ์— ์‹ ๊ทœ ๊ฐ์ฒด๋“ค๋กœ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด,

9. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Mark ๋™์ž‘์„ ํ†ตํ•ด reachable ๊ฐ์ฒด๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

10. Marking ํ•œ ๊ฐ์ฒด๋“ค์€ ๋น„์–ด์žˆ๋Š” Survivor 1 ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

11. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”(unreachable) ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ(sweep)ํ•œ๋‹ค.

12. ์‚ด์•„๋‚จ์€ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์€ age๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

 

Major GC

1. ๊ฐ์ฒด์˜ age๊ฐ€ ์ž„๊ณ„๊ฐ’(์˜ˆ์‹œ๋Š” 5๋กœ ์„ค์ •)์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด,

2. ์ด ๊ฐ์ฒด๋“ค์€ Old Generation์œผ๋กœ ์ด๋™๋œ๋‹ค. ์ด๋ฅผ promotion์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

3. 1~2๋ฒˆ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜์–ด Old Generation ์˜์—ญ์˜ ๊ณต๊ฐ„์ด ๊ฐ€๋“์ฐจ๋ฉด Major GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. Major GC๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ Old ์˜์—ญ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œํ•œ๋‹ค.

Old ์˜์—ญ์€ Young ์˜์—ญ๋ณด๋‹ค ํฐ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ์ด ๊ณต๊ฐ„์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๊ฐ์ฒด ์ œ๊ฑฐ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Major GC๊ฐ€ ๋ฐœ์ƒํ•จ๊ณผ ๋™์‹œ์— ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ์ €ํ•˜๋œ๋‹ค.

 

์ •๋ฆฌ

์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ Eden ์˜์—ญ์— ์ €์žฅ๋˜๋ฉฐ ๊ณ„์†ํ•ด์„œ ์‚ด์•„๋‚จ์€(reachable) ๊ฐ์ฒด๋Š” ์ ์ฐจ Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

New/Young ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC๋ฅผ Minor GC, Old ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC๋ฅผ Major GC ํ˜น์€ Full GC๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ

[Java] Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์˜ ๊ฐœ๋… ๋ฐ ๋™์ž‘ ์›๋ฆฌ (1/2)

โ˜• ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋™์ž‘ ์›๋ฆฌ & GC ์ข…๋ฅ˜ ๐Ÿ’ฏ ์ด์ •๋ฆฌ

[Java] JVM GC์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •

Java - Perm ์˜์—ญ์ด Metaspace๋กœ ๋ฐ”๋€ ์ด์œ ! [+ Heap Area, Native Memory ์ฐจ์ด]