๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java][JVM] ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ Garbage Collection

์ถœ์ฒ˜

ChatGPT


Garbate Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜, GC)์€ Java Virtual Machine(JVM)์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ํ•˜์ง€ ์•Š๊ณ ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

GC ์ž์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์™„์ „ํžˆ ๋ฐฉ์ง€ํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ๋„์›€์„ ์ฃผ๋Š” ๋ฐฉ์‹๊ณผ ๊ทธ ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฐœ๋…

๊ฐ€๋น„์ง€ ์ปฌ๋ž™์…˜์ด๋ž€?

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด(garbage)๋ฅผ ์ฐพ์•„์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์žฅ๊ธฐ๊ฐ„ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์ž๋ฐ”์˜ GC๋Š” ์ฃผ๋กœ ์ฐธ์กฐ ๊ทธ๋ž˜ํ”„(reference graph)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•ด ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ(unreachable)์— ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ˆ์…˜์˜ ํ•„์š”์„ฑ

์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์•ˆ์ •์„ฑ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์žฌํ™œ์šฉ๋˜์–ด, ์žฅ๊ธฐ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ธ๋‹ค.

์ถ”์ƒํ™”

๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด ํŒŒ๊ธฐ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ง์ ‘ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

GC๊ฐ€ Memory Leak์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ด์œ 

GC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์™„์ „ํžˆ ๋ฐฉ์ง€ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.

1. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ž๋™ ํšŒ์ˆ˜

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

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— GC๋Š” ๊ฐ์ฒด๋ฅผ ํšŒ์ˆ˜ํ•œ๋‹ค.

public void someMethod() {
    Object obj = new Object();  // ๊ฐ์ฒด ์ƒ์„ฑ
    // ... some operations
    obj = null;  // ์ฐธ์กฐ ํ•ด์ œ
    // GC๋Š” obj๊ฐ€ null์ด ๋œ ์ดํ›„ ๊ฐ์ฒด๋ฅผ ์ˆ˜๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ
}

2. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์™„ํ™”

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์ฃผ๋œ ์›์ธ ์ค‘ ํ•˜๋‚˜๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. GC๋Š” ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ๊ฐ์ฒด๋“ค์ด ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์Šคํƒ ํ”„๋ ˆ์ž„(stack frame)์—์„œ ๋ฒ—์–ด๋‚œ ์ง€์—ญ ๋ณ€์ˆ˜(local variable)์— ํ• ๋‹น๋œ ๊ฐ์ฒด๋Š” ๋” ์ด์ƒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— GC์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

3. ์•ฝํ•œ ์ฐธ์กฐ(Weak Reference) ์‚ฌ์šฉ

์ž๋ฐ”๋Š” ๊ฐ•ํ•œ ์ฐธ์กฐ(strong reference) ์™ธ์—๋„ ์•ฝํ•œ ์ฐธ์กฐ(Weak Reference), ๋ถ€๋“œ๋Ÿฌ์šด ์ฐธ์กฐ(Soft Reference), ์œ ๋ น ์ฐธ์กฐ(Phantom Reference) ๋“ฑ์˜ ์ฐธ์กฐ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐธ์กฐ ํƒ€์ž…์€ GC๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์ด๋„๋ก ๋„์™€์ค€๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, WeakHashMap์€ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ‚ค(key)์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์•ฝํ•œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋ฉฐ, ๋” ์ด์ƒ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์—”ํŠธ๋ฆฌ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค. 

 

Garbage Collection์˜ ํ•œ๊ณ„

Garbage Collection์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์™„์ „ํžˆ ๋ฐฉ์ง€ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

1. ํ™œ์„ฑ ์ฐธ์กฐ์— ์˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

GC๋Š” ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„ ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์ˆ˜์ง‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„, ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ๊ทธ ๊ฐ์ฒด๋ฅผ ์—ฌ์ „ํžˆ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฉด GC๋Š” ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ ๋กœ์ง์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ๊ฐ€ ์œ ์ง€๋˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์ฝ”์Šค์—์„œ List์— ๊ณ„์†ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ, ๊ทธ ๊ฐ์ฒด๋“ค์ด ๋” ์ด์ƒ ํ•„์š” ์—†์„ ๋•Œ๋„ List์— ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

List<Object> list = new ArrayList<>();

public void addObjects() {
    for (int i = 0; i < 1000; i++) {
        list.add(new Object());  // ๊ฐ์ฒด๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ๊ณ„์† ์ถ”๊ฐ€๋จ
    }
}

 

์ด ๊ฒฝ์šฐ, List๊ฐ€ ๊ฐ์ฒด๋“ค์„ ๊ณ„์† ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— GC๋Š” ์ด๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์—†๋‹ค.

2. ์ˆœํ™˜ ์ฐธ์กฐ Circular Reference

์ž๋ฐ”์˜ GC๋Š” ์ฐธ์กฐ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆœํ™˜ ์ฐธ์กฐ(circulr reference)๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ์ž๋ฐ”์˜ GC๊ฐ€ ๊ฐ์ฒด ์ฐธ์กฐ ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ์„ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ˆœํ™˜ ์ฐธ์กฐ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ด๋‹ค. 

3. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ตœ์ ํ™”์˜ ํ•„์š”์„ฑ

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํŒจํ„ด์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ์ค„์ด๊ณ , ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๋Š” ๋“ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ์ž‘์—…์„ ํฌํ•จํ•œ๋‹ค. GC๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค.

 

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋™์ž‘๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” ํฌ๊ฒŒ ํž™(Heap)๊ณผ ๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area)์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ, ํž™์€ ๋‹ค์‹œ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ์„ธ๋ถ„ํ™”๋œ๋‹ค.

JVM ํž™ ์˜์—ญ

1. Young Generation ์ Š์€ ์„ธ๋Œ€

  • Eden : ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ๊ณต๊ฐ„
  • Survovir Space : Eden ์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ด๋™ํ•˜๋Š” ๊ณต๊ฐ„. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ๊ฐœ(S0, S1)๋กœ ๋‚˜๋‰œ๋‹ค.

2. Old Generation ๋…ธ๋…„ ์„ธ๋Œ€

  • Young Generation์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๊ฑฐ์น˜๋ฉฐ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์ด๋™ํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค. ๊ฐ์ฒด์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.

3. Permanent Generation ์˜๊ตฌ ์„ธ๋Œ€(Java 7 ์ดํ•˜)

  • JVM ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ํด๋ž˜์Šค ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค. Java 8 ์ดํ›„์—๋Š” Metaspace๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์˜์—ญ

๋ฉ”์„œ๋“œ ์˜์—ญ์€ JVM ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ํด๋ž˜์Šค ๊ตฌ์กฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค. Java 8 ์ดํ›„์—๋Š” Metaspace๋กœ ๋Œ€์ฒด๋˜์–ด ํž™ ์˜์—ญ์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ๊ด€๋ฆฌ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋‹ค์ด์–ด๊ทธ๋žจ

+-------------------------+
|        Method Area      | <--- (1) Method Area: ํด๋ž˜์Šค์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ
|-------------------------|
|   +-----------------+   |
|   |   Young Generation | |
|   |-----------------|   |
|   | Eden Space       | | <--- (2a) Eden Space: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์ €์žฅ
|   |-----------------|   |
|   | Survivor Space 1 | | <--- (2b) Survivor Space: ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด ์ €์žฅ
|   |-----------------|   |
|   | Survivor Space 2 | | <--- (2b) Survivor Space: ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด ์ €์žฅ
|   +-----------------+   |
|        Old Generation   | <--- (2c) Old Generation: ์˜ค๋ž˜๋œ ๊ฐ์ฒด ์ €์žฅ
|-------------------------|
|                         |
|    Stack                | <--- (3) Stack: ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ, ์ง€์—ญ ๋ณ€์ˆ˜, ์Šคํƒ ํ”„๋ ˆ์ž„ ์ €์žฅ
|-------------------------|
|                         |
|   Program Counter       | <--- (4) Program Counter Register: ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด ์œ„์น˜
|   Register              |
|-------------------------|
|                         |
|   Native Method Stack   | <--- (5) Native Method Stack: ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ ์Šคํƒ
|-------------------------|

 

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

JVM์€ ๋‹ค์–‘ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‚˜ ์ƒํ™ฉ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.

1. Mark and Sweep ๋งˆํฌ ์•ฑ ์Šค์œ•

Mark and Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์ธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ฐฉ์‹์ด๋‹ค. ๋‹ค์Œ์€ ๊ทธ ๊ณผ์ •์ด๋‹ค.

์ž‘๋™ ์›๋ฆฌ

  • Mark ๋‹จ๊ณ„ : ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ๋ชจ๋“  ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๋งˆํฌํ•œ๋‹ค.
  • Sweep ๋‹จ๊ณ„ : ๋งˆํฌ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•œ๋‹ค.

์žฅ์ 

  • ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋‹ค

๋‹จ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”(fragmentation) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • GC ๊ณผ์ •์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค.

2. Coping Collection ๋ณต์‚ฌ ์ˆ˜์ง‘

์ž‘๋™ ์›๋ฆฌ

  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‘ ๊ฐœ์˜ ๋ฐ˜์ชฝ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ํ•œ ์ชฝ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • From Space์—์„œ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ To Space๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
  • From Space์˜ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋Š” To Space๋กœ ๋ณต์‚ฌํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ์ œ๊ฑฐํ•œ๋‹ค.

์žฅ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๊ฐ€ ์ค„์–ด๋“ ๋‹ค.
  • ์ Š์€ ์„ธ๋Œ€(Young Generation)์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

๋‹จ์ 

  • ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‘ ๋ฐฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋” ํ•„์š”ํ•˜๋‹ค.

 

3. Generational Garbage Collection ์„ธ๋Œ€๋ณ„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

์ž‘๋™ ์›๋ฆฌ

  • ๊ฐ์ฒด๋ฅผ ์ƒ์•  ์ฃผ๊ธฐ์™€ ์‚ฌ์šฉ ๋นˆ๋„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์„ธ๋Œ€(Generations)๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•œ๋‹ค.
  • Young Generation: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ , GC๊ฐ€ ์ž์ฃผ ์ˆ˜ํ–‰๋œ๋‹ค.
  • Old Generation: Young Generation์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ , GC๊ฐ€ ๋œ ์ž์ฃผ ์ˆ˜ํ–‰๋œ๋‹ค.
  • Permanent Generation/Metaspace: ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ๋‹ค (JVM์˜ ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” Metaspace๋กœ ๋Œ€์ฒด๋จ).

์žฅ์ 

  • ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ž‘์€ ๊ฐ์ฒด์˜ GC ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ๊ตฌํ˜„์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์กฐํ•ฉ

JVM์—์„œ๋Š” ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ฃผ์š” GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. Serila GC

์„ค๋ช…

๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Young Generation๊ณผ Old Generation์˜ GC๋ฅผ ์ˆ˜ํ–‰๋‹ค.

์žฅ์ 

๊ฐ„๋‹จํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ์ ๋‹ค.

๋‹จ์ 

๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ธด GC ์ค‘๋‹จ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. Parallel GC

์„ค๋ช…

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Young Generation์˜ GC๋ฅผ ์ˆ˜ํ–‰๋‹ค.

์žฅ์ 

๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ์—์„œ ๋” ๋น ๋ฅธ GC ์„ฑ๋Šฅ์„ ์ œ๊ณต๋‹ค.

๋‹จ์ 

GC ์ค‘๋‹จ ์‹œ๊ฐ„์ด ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

3. Concurrent Mark-Sweep (CMS) GC

์„ค๋ช…

Old Generation์˜ GC๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์™€ ๋™์‹œ์— ์ž‘์—…์„ ์ˆ˜ํ–‰๋‹ค.

์žฅ์ 

GC ์ค‘๋‹จ ์‹œ๊ฐ„์ด ์ค„์–ด๋‹ค.

๋‹จ์ 

๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. G1 (Garbage First) GC

์„ค๋ช…

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ง€์—ญ(Region)์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๊ณ , ์ฃผ์–ด์ง„ ๋ชฉํ‘œ ์‹œ๊ฐ„ ๋‚ด์— GC๋ฅผ ์™„๋ฃŒํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

์žฅ์ 

๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๋ฅผ ์ค„์ด๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ GC ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ œ๊ณต๋‹ค.

๋‹จ์ 

๊ตฌํ˜„์ด ๋ณต์žกํ•˜๊ณ  ์ดˆ๊ธฐ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

 

GC ๊ณผ์ • ๋‹จ๊ณ„

Garbage Collection ๊ณผ์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

1. Initial Mark (์ดˆ๊ธฐ ๋งˆํ‚น)

๋ฃจํŠธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ Young Generation์˜ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งˆํ‚นํ•œ๋‹ค.

2. Root Scanning (๋ฃจํŠธ ์Šค์บ๋‹)

๋ฃจํŠธ ๊ฐ์ฒด์™€ ๊ทธ ์ฐธ์กฐ๋ฅผ ์ถ”์ ํ•˜์—ฌ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งˆํ‚นํ•œ๋‹ค.

3. Marking (๋งˆํ‚น)

์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งˆํ‚นํ•˜์—ฌ GC๊ฐ€ ํšŒ์ˆ˜ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ๋‹ค.

4. Relocation (์žฌ๋ฐฐ์น˜)

๋ณต์‚ฌ ์ˆ˜์ง‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

5. Cleanup (์ •๋ฆฌ)

๋งˆํ‚น๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๊ณ , ๋นˆ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํšŒ์ˆ˜ํ•œ๋‹ค.

 

GC ํŠœ๋‹๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง

GC์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ํŠœ๋‹ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ GC ํŠœ๋‹ ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” ํž™ ์‚ฌ์ด์ฆˆ ์„ค์ •, GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ, ์Šค๋ ˆ๋“œ ์ˆ˜ ์กฐ์ • ๋“ฑ์ด ์žˆ๋‹ค.

  • JVM ์˜ต์…˜: -Xms, -Xmx, -XX:+UseG1GC์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํž™ ์‚ฌ์ด์ฆˆ์™€ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค์ •ํ•œ๋‹ค.
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ: JVisualVM, GC ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ, JConsole ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ GC ์„ฑ๋Šฅ๊ณผ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค.

 


ChatGPT ๊ธ€์˜ ์ถœ์ฒ˜

์ œ๊ฐ€ ์ œ๊ณตํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection) ๊ด€๋ จ ์„ค๋ช…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ์ •๋ณด์™€ ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‚ด์šฉ์€ ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๋‹ค๋ฃจ์–ด์ง€๋Š” ๋‚ด์šฉ์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž๋ฃŒ๋“ค์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค:

  1. Java ๊ณต์‹ ๋ฌธ์„œ
    • Oracle์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • Java HotSpot VM Options - JVM ์˜ต์…˜๊ณผ GC ๊ด€๋ จ ์„ค์ •
  2. ์ฑ…
    • "Java Performance: The Definitive Guide" by Scott Oaks: Java ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์‹ฌ๋„ ๊นŠ์€ ์„ค๋ช…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • "Java: The Complete Reference" by Herbert Schildt: Java์˜ ๊ธฐ๋ณธ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ฐœ๋…๊นŒ์ง€ ํญ๋„“๊ฒŒ ๋‹ค๋ฃจ๋ฉฐ, GC์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์˜จ๋ผ์ธ ์ž๋ฃŒ
    • Oracle Java Tutorials: Java์˜ ๊ธฐ๋ณธ ๋ฐ ๊ณ ๊ธ‰ ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๋ฉฐ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ ๊ด€๋ จ๋œ ์ž๋ฃŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • "Garbage Collection in Java" - ๋‹ค์–‘ํ•œ ์˜จ๋ผ์ธ ํŠœํ† ๋ฆฌ์–ผ๊ณผ ๋ธ”๋กœ๊ทธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์„ค๋ช…, ์˜ˆ๋ฅผ ๋“ค๋ฉด Baeldung์—์„œ๋Š” GC์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํŠœ๋‹ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  4. JVM ๊ด€๋ จ ๋ฌธ์„œ์™€ ์ž๋ฃŒ
    • "Inside the Java Virtual Machine" by Bill Venners: JVM์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ GC ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž๋ฃŒ๋“ค์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฐœ๋…, ์•Œ๊ณ ๋ฆฌ์ฆ˜, JVM์—์„œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.