
๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ํ์์ฑ๊ณผ ์๊ณ ๋ฆฌ์ฆ
๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ์ด๋?
GC๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ ์ค ํ๋๋ก, ํ๋ก๊ทธ๋จ์ด ๋ ์ด์ ํ์๋ก ํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํด ์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํํ GC๊ฐ ๊ด๋ฆฌํ๋ค๊ณ ๋งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก๊ทธ๋จ ์คํ ์ค ๋์ ์ผ๋ก ํ ๋น๋๋ ํ(Heap) ์์ญ์ ์๋ฏธํ๊ณ , GC๊ฐ ํด์ ํ๋ ๋์์ ์ด๋ค ๋ณ์์์๋ ์ฐธ์กฐ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ค.
C๋ C++๊ฐ์ ์ธ์ด์์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ํด์ ํด์ผ ํ์ต๋๋ค. ํ์ง๋ง ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฑด ๊ฝค ๋ฒ๊ฑฐ๋ก์ธ ๋ฟ ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ํ ์ด๋ฏธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ฑฐ๋ ๋ค์ ํด์ ํ๋ ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Java์์๋ ์ด๋ฐ ์์ ์ ์์์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ๋์ด์ค๋๋ค.
์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ค์๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๊ณ , ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ์ ์ง์คํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋จ์ ๋ ์กด์ฌํ๋๋ฐ, GC๊ฐ ์ด๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ง ๊ฒ์ฌํ๋ ๊ณผ์ ์์ฒด๊ฐ ํ๋ก๊ทธ๋จ ์คํ์ ๋ฐฉํดํ๋ ์ค๋ฒํค๋๋ก ์์ฉํ ์ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ธ์ ํด์ ๋ ์ง ์์ธกํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ๊ทธ๋์ ์ค์๊ฐ์ฑ์ด ์ค์ํ ํ๋ก๊ทธ๋จ์์๋ GC๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ ์ ํ์ง ์์ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด GC๋ ์ด๋ป๊ฒ ํด์งํ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์์ ํ๋จํ๊ฒ ๋ ๊น์?
๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ์๊ณ ๋ฆฌ์ฆ
GC๋ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋๋ฐ ๋ํ์ ์ผ๋ก ๋ ํผ๋ฐ์ค ์นด์ดํ ๋ฐฉ์๊ณผ ๋งํฌ ์ค ์ค์ ๋ฐฉ์์ด ์์ต๋๋ค.
1. ๋ ํผ๋ฐ์ค ์นด์ดํ (Reference Counting)

๋ ํผ๋ฐ์ค ์นด์ดํ ๋ฐฉ์์ ํ ์์ญ์ ์ธ์คํด์ค๋ค์ด ๊ฐ์ ์์ ์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ ๋ ํผ๋ฐ์ค์ ๊ฐ์๋ฅผ ์ธ์ด ์ ์ฅํ๊ณ , ํด๋น ์ซ์๊ฐ 0์ด ๋๋ฉด ์ ๋ฆฌํด์ผ ํ๋ ์ธ์คํด์ค๋ก ํ๋จํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ๋ฐฉ์์ ๋๋ค. ์ฆ, ๋ ํผ๋ฐ์ค ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด GC์ ๋์์ด ๋๋ ๊ฒ์ ๋๋ค.

ํ์ง๋ง ์ด ๋ฐฉ์์๋ ํฐ ๋จ์ ์ด ์๋๋ฐ, Root Space์ ์ฐ๊ฒฐ๋์ด ์์ง ์๋๋ผ๋ ์ธ์คํด์ค๋ค๋ผ๋ฆฌ ์๋ก๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ์ํ ์ฐธ์กฐ(Circular Refrence)๊ฐ ์ผ์ด๋๊ฒ ๋๋ฉด ๋ ํผ๋ฐ์ค ์นด์ดํธ๊ฐ 1๋ก ์ ์ง๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋๋ฌธ์ ๋ ํผ๋ฐ์ค ์นด์ดํ ๋ฐฉ์๋ณด๋ค๋ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋งํฌ ์ค ์ค์ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
2. ๋งํฌ ์ค ์ค์(Mark-and-Sweep)

๋งํฌ ์ค ์ค์ ๋ฐฉ์์ Root space์์ ์์ํด ๊ทธ๋ํ ํ์์ ํตํด ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ์ด๋ฅผ ํด์ ์ ๊ธฐ์ค์ผ๋ก ์ผ์ต๋๋ค. Root space์์๋ถํฐ ์ฐ๊ฒฐ๋ ์ธ์คํด์ค๋ฅผ ์ฐพ์ ๋งํฌํ๊ณ , Root space๋ก๋ถํฐ ์ ๊ทผํ ์ ์๋ ์ธ์คํด์ค๋ ์ค์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค.
์ด ๋ฐฉ์์ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋๋ผ๋, Root space๋ก ๋ถํฐ ์ฐ๊ฒฐ์ด ๋์ด์ง ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์ ๋ฆฌํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค. Java์์๋ ์ด๋ฌํ ๋งํฌ ์ค ์ค์ ๋ฐฉ์์ ์ฑํํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ํ ์ ์ํํ๊ณ ์์ต๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์๋ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค. ๋ํผ๋ฐ์ค ์นด์ดํ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, GC๋ฅผ ์๋์ ์ผ๋ก ์คํํด์ผ ํ๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ์ค์ผ ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ํ๋๊ธฐ ์ํด์ ํน์ ์์ ์ ์ปดํจํ ๋ฆฌ์์ค๋ฅผ ํ ๋นํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํฅ์ ๋ผ์น๊ธฐ ๋๋ฌธ์ ์ด ์๊ฐ์ ์ต์ํํ๋ ๊ฒ์ด ์ต์ ํ์ ํต์ฌ์ ๋๋ค.
JVM์์์ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ๊ณผ์
์ด์ Java ํ๋ก๊ทธ๋จ์ด ๋์๊ฐ๋ JVM์์ ์ด๋ป๊ฒ ๊ฐ๋น์ง ์ปฌ๋ ํ ์ ์งํํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
JVM์ GC๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋งํฌ ์ค ์ค์ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๋งํฌ ์ค ์ค์ ๋ฐฉ์์ Root Space์์ ๋ถํฐ ํด๋น ๊ฐ์ฒด์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๊ฐ ํด์ ์ ๊ธฐ์ค์ด ๋๋๋ฐ, ์ด๋ Root space๋ JVM ๋ฉ๋ชจ๋ฆฌ์ Stack์ ๋ก์ปฌ ๋ณ์, Method Area์ ์ ์ฅ๋ ์คํ ๋ณ์, Native Stack์ C, C++๋ก ์์ฑ๋ JNI ์ฐธ์กฐ์ ๋๋ค.
JVM์ GC์ ํ ์์ญ
JVM์ GC๋ ์๋์ ์ผ๋ก ๋งํฌ ์ค ์ค์์ ๋์์์ผ์ผ ํ๋ฉฐ, ์ธ์ ํด๋น ์์ ์ ์ํํ๋ ์ง ํ์ ํด์ผ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ JVM์ ํ ์์ญ์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค.

JVM์ ํ ์์ญ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋๋ฉฐ, Young generation๊ณผ Old generation์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์ด๋ Young generation์์ ๋ฐ์ํ๋ GC๋ฅผ Minor GC, Old generation์์ ๋ฐ์ํ๋ GC๋ฅผ Major GC๋ผ๊ณ ํฉ๋๋ค.

Young generation์ ๋ ๋ค์ ์ธ ์์ญ์ธ Eden, Survival 0, Survival 1 ์์ญ์ผ๋ก ๋๋๊ฒ ๋ฉ๋๋ค. Eden ์์ญ์ ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๋ค์ด ํ ๋น๋๋ ์์ญ์ด๊ณ , Survival ์์ญ์ Minor GC๋ก ๋ถํฐ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์กด์ฌํ๋ ์์ญ์ ๋๋ค. ์ด Survival ์์ญ์๋ ํน๋ณํ ๊ท์น์ด ์๋๋ฐ, Survival 0 ํน์ Survival 1 ๋ ์ค ํ๋๋ ๊ผญ ๋น์ด์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๊ท์น ๋๋ฌธ์ Survival ์์ญ์ ๋งํฌ ์ค ์ค์์ด ๋ฐ์ํ ๋๋ง๋ค ๋ฒ๊ฐ์ ๊ฐ๋ฉด์ ์ฌ์ฉ๋๊ฒ ๋ฉ๋๋ค.
JVM์ GC ๊ณผ์

๋จผ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์์ ์ฌ์ง๊ณผ ๊ฐ์ด Eden ์์ญ์ ์ธ์คํด์ค๋ค์ด ์์ฑ๋๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค๋ณด๋ฉด Eden ์์ญ์ด ๊ฝ์ฐจ๋ ์๊ฐ์ด ์ค๊ฒ๋๋๋ฐ ์ด๋ Minor GC๊ฐ ๋ฐ์ํฉ๋๋ค.
๐ก Survival 0/Survival 1 ์์ญ๋ ๊ฐ๋ ์ฐจ๋ฉด ์๊ฐ์ด ๋ฐ์ํ๋ฉด Minor GC๊ฐ ๋ฐ์ํฉ๋๋ค.

Minor GC๋ฅผ ํตํด Young generation์ ๋งํฌ ์ค ์ค์์ ์งํํ๊ฒ ๋๋ฉฐ Root space๋ก ๋ถํฐ ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ผ ํ๋จ๋๋ ๊ฐ์ฒด๋ค์ Survival 0 ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ฉด์ Age Bit์ด 1์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
Age Bit์ ์ผ์ ์์ค์ ๋์ด๊ฐ๊ฒ ๋๋ฉด ์ค๋๋๋ก ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ผ๊ณ ํ๋จํ์ฌ ํด๋น ๊ฐ์ฒด๋ฅผ Old generation์ผ๋ก ๋๊ฒจ์ฃผ๊ฒ ๋ฉ๋๋ค. ์ด ๊ณผ์ ์ ํ๋ก๋ชจ์ (Promotion)์ด๋ผ ํฉ๋๋ค. Java 8์ Parallel GC ๋ฐฉ์ ์ฌ์ฉ ๊ธฐ์ค Age Bit์ด 15๊ฐ ๋๋ฉด ํ๋ก๋ชจ์ ์ด ์งํ๋ฉ๋๋ค.

์๊ฐ์ด ๋ง์ด ์ง๋๊ฒ ๋๋ฉด Old generation๋ ๋ค ์ฑ์์ง ๋๊ฐ ์์ต๋๋ค. ์ด๋ Major GC๊ฐ ๋ฐ์ํ๋ฉด์ ๋งํฌ ์ค ์ค์ ๋ฐฉ์์ ํตํด ํ์์๋ ๋ฉ๋ชจ๋ฆฌ๋ค์ ๋น์์ฃผ๊ฒ ๋ฉ๋๋ค. ์ด Major GC๋ Minor GC๋ณด๋ค ๋ ์ค๋ ์๊ฐ์ด ์์๋๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ๊ตณ์ด ํ ์์ญ์ Young generation๊ณผ Old generation์ผ๋ก ๋๋์์๊น์?

์ ์ฌ์ง์์ ๋ณด๋ฏ์ด Minor collections๊ฐ Major collections๋ณด๋ค ํจ์ฌ ๋ง์ด ์์กดํด์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ์์ฑ๋ ํ ๊ณง๋ฐ๋ก ์ญ์ ๋๊ธฐ ๋๋ฌธ์, GC ์ค๊ณ์๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ถ์ํ ๊ฒฐ๊ณผ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ค์ด ์งง์ ์์ ๋ฅผ ๊ฐ๋๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๊ฐ์ฒด๋ค์ด ๋น ๋ฅด๊ฒ ์ฌ๋ผ์ง๋ฏ๋ก, Young generation ์์ญ์์ ์ต๋ํ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์ค๊ณํ ๊ฒ์ ๋๋ค.
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Call by Value์ Call by Reference (0) | 2025.03.07 |
---|---|
ConcurrentHashMap์ ์ด๋ป๊ฒ ๋์์ฑ์ ๋ณด์ฅํ ๊น? (0) | 2024.10.28 |
CompletableFuture์ ForkJoinPool (0) | 2024.08.08 |