์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ(Garbage)๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํด์ฃผ๋ ์์ ์ด๋ค. Java Appliation์ JVM(Java Virtual Machine)์์์ ๊ตฌ๋๋๋๋ฐ, JVM์ ๊ธฐ๋ฅ ์ค ๋์ด์ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฒญ์ํ์ฌย ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ ์์ ์ด๋ค.
GC๊ฐ ํ์ํ ์ด์ ๋?
Heap ์์ญ์ ์ ์ฅ๋๋ ๊ฐ์ฒด๋ค์ด ๊ณ์ํด์ ์์ด๊ฒ๋๋ฉด OutOfMemoryException์ด ๋ฐ์ํ์ฌ, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์์งํ์ฌ ์ ๊ฑฐํด์ค์ผํ๋ค.
์์ ย
Test test = new Test();
test.setId(1L);
test.setName("seohae");
testRepository.save(test);
test = null; // ๋์ด์ ์ฐธ์กฐ๋ฅผ ํ์ง ์๊ณ ์๋ ์ฝ๋์์ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก GC์ ๋์์ด ๋๋ค.
...
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ์ฐ๋ ๊ธฐ๋ฅผ ์ ๋ฆฌํด์ฃผ๋ ์์ (Garbage Collection)์ ์ํํ๋ ํ๋ก๊ทธ๋จ์ด Garbage Collector ๋ผ๊ณ ๋ถ๋ฅธ๋ค. GC ์์ ์ ํ๋ ๊ฐ๋น์ง ์ฝ๋ ํฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ผ์ ํ๋ค.
1. ๋ฉ๋ชจ๋ฆฌ ํ ๋น
2. ์ฌ์ฉ์ค์ธ ๋ฉ๋ชจ๋ฆฌ ์ธ์
3. ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์ธ์
ํ ๋ฉ๋ชจ๋ฆฌ
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ๊ธฐ ์ํด JVM์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ ์ผ์ ์ ์งํ๋ ๊ฒ์ ๋งํ๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์คํ๋๋ฉด GC ์์ ์ ๋งก์ ์ค๋ ๋๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ค๋ ๋๋ ๋ชจ๋ ๋ฉ์ถ๊ฒ๋๊ณ GC ์์ ์ด ์ข ๋ฃ๋๋ฉด ์ฌ๊ฐ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ์ผ์ ์ค์ง๋๋ฉด GC๋ ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ฅผ ํ๊ณ ์ด๋ํ๋ฉฐ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๊ณผ์
๋ชจ๋ ๊ฐ์ฒด ํ์์ด ๋๋๋ฉด ์๋ณ(Mark)๋์ง ์์ ๊ฐ์ฒด๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํค๋ ๊ณผ์
- ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น(Allocation)๋๋ ์์ญ์ด๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ Unreachable ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์, ๋ง์ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค.
- Young ์์ญ์ ๋ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ Minor GC ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
** Minor GC
Young ์์ญ ์ค Eden ์์ญ์ด ๊ฝ ์ฐจ๊ฒ๋๋ฉด ๋ฐ์ํ๋ค.ย
- Young์์ญ์์ Reachable ์ํ๋ฅผ ์ ์งํ์ฌ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋๋ ์์ญ
- Old ์์ญ์ Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๋ฉฐ, ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ ๊ฐ๋น์ง๋ ์ ๊ฒ ๋ฐ์ํ๋ค.
- ํด๋น ์์ญ์ด ๊ฐ๋ ์ฐจ๋ฉด Major GC๊ฐ ๋ฐ์ํ๋ค.
- ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ์์ญ์ด๋ค.
- Eden ์์ญ์ด ๊ฝ์ฐจ๋ฉด GC๊ฐ ๋ฐ์ํ๋ฉด์ Mark(์ฐธ์กฐ ์ฌ๋ถ ์๋ณ), Sweep(๋ฉ๋ชจ๋ฆฌ ํด์ ) ๊ณผ์ ์ด ์ผ์ด๋๋ค.
- ์์ง ์ฌ์ฉ์ค์ธ ๊ฐ์ฒด๋ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ฉฐ, Eden ์์ญ์ ๋น์์ง๋ค.
- Eden ์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด, GC๊ฐ ๋ฐ์ํ๋ฉด์ ์ ๊ฑฐ๋ ๊ฐ์ฒด ์ธ์ย ๋๋จธ์ง ์ด์๋จ์ ๊ฐ์ฒด๋ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
(ํ๋ฒ์ Minor GC๋ฅผ ๊ฒฝํํ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ๊ณณ)
- Survivor ๋ ์์ญ์ค ํ๋๋ ๋ฐ๋์ ๋น์ด์๋ ์ํ๋ค. ๋ง์ฝ ๋ ์์ญ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๊ฑฐ๋, ์ฌ์ฉ๋์ด 0์ด๋ผ๋ฉด ์ ์์ ์ธ ์ํฉ์ด ์๋๋ค.
** ์ด๋ค ๋ป์ผ๊น?
- Minor GC๊ฐ ๋ฐ์ํ๋ฉด Eden๊ณผ Survivor1์ ์ด์์๋ ๊ฐ์ฒด๋ฅผ Survivor2๋ก ๋ณต์ฌํ๋ค.
- ๊ทธ๋ฆฌ๊ณ Survivor1๊ณผ Eden์ Clearํ๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ํ๋ฒ์ Minor GC์์ ์ด์๋จ์ ๊ฐ์ฒด๋ง Survivor2์์ญ์ ๋จ๋๋ค.
> 4)ย ๊ทธ๋ฆฌ๊ณ ๋ค์๋ฒ Minor GC๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ์ ๋ฐฉ์์ผ๋ก Eden๊ณผ ย Survivor2์์ญ์์ ์ด์์๋ ๊ฐ์ฒด๋ฅผ Survivor1๋ก ๋ณต์ฌํ๊ณ ํด๋ฆฌ์ดํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Survivor1์๋ง ์ด์์๋ ๊ฐ์ฒด๊ฐ ๋จ๊ฒ๋๋ค.
> 4)ย ์ด๋ ๊ฒ ๋ฐ๋ณต์ ์ผ๋ก Survivor1, Survivor2๋ฅผ ์๋ค๊ฐ๋คํ๋ค๊ฐ, Survivor ์์ญ์์ ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๋ Old์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค.ย
- promotion ๊ณผ์ ์ด ๋ฐ์ํ๋ค.
** promotion
๊ณ์ํด์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ 2๊ฐ์ Survivor ์์ญ์ ์ด๋ํ๋ฉด์, ํน์ ย ageย ๊ฐ์ ๋์ด๊ฐ๋ ๊ฒฝ์ฐย Old Generation์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.** age
๊ฐ์ฒด๋ค์ด ์ด์๋ ๋๋ง๋ค age๊ฐ ์ฆ๊ฐํ๋ค.
Survivor ์์ญ์ ์ 2๊ฐ์ผ๊น?
๋ฉ๋ชจ๋ฆฌ์ ์ธ๋ถ ๋จํธํ ๋ฐ์์ ๋ฐฉ์งํ๋ค. ์ธ๋ถ ๋จํธํ๋, ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ ํด์ ๋๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋จ์ง๋ง ํํธํ๋์ด์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋์ ๋๊ฐ์ Survivor ๋ผ๋ฆฌ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉฐ ์ด๋ฅผ ๋ฐฉ์งํ๋ค.
-ย Permanent ์์ญ์ Java8๋ถํฐ๋ ์ฌ๋ผ์ง๊ณ , Mataspace ์์ญ์ผ๋ก ์ ํ๋์๋ค.
- ๊ด๋ จ ์ ๋ณด ์ฐธ๊ณ : https://johngrib.github.io/wiki/java8-why-permgen-removed/
- ์๋ฐ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉด ์ฒ์์ Eden ์์ญ์ ์ ์ฅ๋๋ค.
- ์์ฑ๋ ๊ฐ์ฒด๋ Minor GC๊ฐ ๋ฐ์ํ ๋ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- Survivor ์์ญ์ Survivor1, Survivor2 ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๋๋ฐ, Minor GC๊ฐ ๋ฐ์ํ๋ฉด Eden๊ณผ Survivor1์ ํ์ฑ ๊ฐ์ฒด๋ฅผ Survivor2๋ก ๋ณต์ฌํ๋ค.
> -> Survivor ๋ ์์ญ์ค์ ๋ฐ๋์ 1๊ฐ์ ์์ญ์๋ง ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ์ ์๋ค. ๋ ์ค 1๊ฐ์ Survivor ์์ญ์ ๋ฐ๋์ ๋น ์ํ๊ฐ ๋๋ค.ย- ํ์ฑ์ด ์๋ ๊ฐ์ฒด(GC ๋์)๋ Survivor1์ ๋จ์์๊ฒ ๋๊ณ , Survivor1 ๊ณผ Eden ์์ญ์ ํด๋ฆฌ์ดํ๋ค.ย
- 1)~4)๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด์ Survivor ์์ญ์์ ์ค๋๋ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ฎ๊ธฐ๊ฒ๋๋ค.
- ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค.
- ์์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ๋ ํ ํ๋๋ฐ ์์ฃผ ํจ๊ณผ์ ์ด๋ค.
- Stop The World ๋ฐฉ์์ด๋ฉฐ, Stop The World ์๊ฐ์ด ์งง๋ค.
-ย Oldย ์์ญ์ดย ๊ฐ๋์ฐจ๋ฉดย ๋ฐ์ํ๋ค.
-ย Minorย GCย ๊ณผ์ ์์ย ์ญ์ ๋์งย ์๊ณ ,ย Oldย Generationย ์์ญ์ผ๋กย ์ฎ๊ฒจ์งย ๊ฐ์ฒดย ์คย ๋ฏธ์ฌ์ฉ๋๋ค๊ณ ย ํ๋จ๋๋ย ๊ฐ์ฒด๋ฅผย ์ญ์ ํ๋ย GC๋ค.
- Stop The World ๋ฐฉ์์ด๋ฉฐ, Stop The World ์๊ฐ์ด ๊ธธ๋ค.
๋ํ์ ์ผ๋ก Mark & Sweep ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
- GC Root๋ก๋ถํฐ ๋ชจ๋ ย ๊ฐ์ฒด๋ค์ ์ฐธ์กฐ๋ฅผ ํ์ธํ๋ฉด์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ Mark ํ๋ค.
- 1)๋ฒ์ ์์ ์ด ๋๋๋ฉด ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ํ์ํ๊ณ ์ด ํ์๋ ๊ฐ์ฒด๋ฅผ Sweep ํ๋ค.
** GC Root๋?
Runtime Data Area์์ Method Area, Native Stack(JNI), Java Stack ๋ฑ์์ Heap ๋ฉ๋ชจ๋ฆฌ์ Object๋ค์ ์ฐธ์กฐํ๋ ๋ฐ์ดํฐ ์์ญ
-ย Heapย ๋ฉ๋ชจ๋ฆฌย ์ ์ฒดย ์์ญ์์ย ๋ฐ์ํ๋ค.
- Old, Young ์์ญ ๋ชจ๋์์ ๋ฐ์ํ๋ GC์ด๋ค.
- Minor GC, Major GC ๋ชจ๋ ์คํจํ๊ฑฐ๋, Young ์์ญ์ Old ์์ญ ๋ชจ๋ ๊ฐ๋ ์ฐผ์๋ ๋ฐ์ํ๋ค.
๋ํ์ ์ผ๋ก Mark & Sweep & Compact ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
- ์ ์ฒด ๊ฐ์ฒด๋ค์ ์ฐธ์กฐ๋ฅผ ํ์ธํ๋ฉด์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ Mark ํ๋ค.
- 1)๋ฒ์ ์์ ์ด ๋๋๋ฉด ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ํ์ํ๊ณ ์ด ํ์๋ ๊ฐ์ฒด๋ฅผ Sweep ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ์ฌ, ๋ฉ๋ชจ๋ฆฌ ๋จํธํ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ก ํ๋ค.ย
- ์๋๊ฐ ๋งค์ฐ ๋๋ฆฌ๋ค.
- Full GC๊ฐ ์ผ์ด๋๋ ๋์ค์๋ ์๊ฐ์ ์ผ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค์ง๋๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ํฐ ์ํฅ์ ์ค๋ค.
MinorGC ์ MajorGC๋ก ๊ตฌ๋ถ๋๋ ์ด์ ๋?
JVM์ Heap ์์ญ์ ์ค๊ณํ ๋ ์๊ฐ 2๊ฐ์ง ์ ์ ์กฐ๊ฑด์ผ๋ก ์ค๊ณ๋์๋ค.
1. ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋๋ค.
2. ์ค๋๋ ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋๋ฌผ๊ฒ ์กด์ฌํ๋ค.
๊ฐ์ฒด๋ ์ผํ์ฑ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ ๋จ์์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ young, old ์์ญ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ค๊ณํ์๋ค. ๋ฐ๋ผ์ ์์ฃผ ๋ฐ์ํ๋ MinorGC, Old ์์ญ์ด ๊ฐ๋ ์ฐฐ๋ ๋ฐ์ํ์ฌ ๋น๊ต์ ์ ๊ฒ ๋ฐ์ํ๋ Major GC๋ก ๋๋ ์ ธ์ ๋ฐ์ํ๋ค.
- JVM ๋ฒ์ ์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ง GC ๋ฐฉ์์ด ์ถ๊ฐ๋๊ณ ๋ฐ์ ๋๋ค.
- ์ฌ์ฉ์๊ฐ JVM ์ต์ ์ค์ ์ ํตํด GC ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ์์ GC๋ก ์ฑ๊ธ ์ค๋ ๋(์ค๋ ๋ 1๊ฐ)๋ก ๋์ํ๋ค.
- ์ฑ๊ธ ์ค๋ ๋๋ก ๋์ํ์ฌ ๋๋ฆฌ๊ณ , ๊ทธ๋งํผย Stop The Worldย ์๊ฐ์ด ๋ค๋ฅธ GC์ ๋นํด ๊ธธ๋ค.
- Mark & Sweep & Compactย ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- Mark : Old ์์ญ์์ ์ด์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ค.
- Sweep : ๋ชจ๋ ๊ฐ์ฒด ํ์์ด ๋๋๋ฉด ์๋ณ(Mark)๋์ง ์์ ๊ฐ์ฒด๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํจ๋ค.
- Compaction : ๊ฐ ๊ฐ์ฒด๋ค์ด ์ฐ์๋๊ฒ ์์ด๋๋ก Heap์ ๊ฐ์ฅ ์ ๋ถ๋ถ๋ถํฐ ์ฑ์์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ๊ฐ์ฒด๊ฐ ์๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
- Compaction ํ์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด, ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ๊ฐ์ฒด๊ฐ ์๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ธ์๋ค.ย ์ฆ, Compaction์ ํ์ ์๋ ๊ฐ์ฒด๋ค์ ์ง์ฐ๊ณ ์ด์์๋ ๊ฐ์ฒด๋ค์ ํ ๊ณณ์ผ๋ก ๋ชจ์๋ค
- Java 8์ default GC ์ด๋ค.
- Young ์์ญ์ GC๋ฅผ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ, Serial GC์ ๋นํด ์๋์ ์ผ๋ก Stop The World ๊ฐ ์งง๋ค.
- ๊ทธ๋ฆผ์ ๋ณด์ด๋ฏ, GC Thread ๊ฐ ์ฌ๋ฌ๊ฐ์ด๋ค. GC ํ๋ก์ธ์ค๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋์ํ๊ณ Stop The World ์๊ฐ์ ์ข๋ ์ค์ผ ์ ์๊ฒ๋์๋ค.
- Mark & Sweep & Compactย ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- ์ 2) Parallel GC ์์ ์กฐ๊ธ ๋ ์ ๊ทธ๋ ์ด๋๋ ๋ฒ์ ์ด๋ค. Old GC๋ ๋ณ๋ ฌ๋ก ์ํํ ์ ์๋๋ก ํ๋ค.
- Mark & Summary & Compaction ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
Mark & Summary & Compaction ์๊ณ ๋ฆฌ์ฆ
Mark : Old Generation์ Region์ด๋ผ๋ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๊ท ์ผํ๊ฒ ๋๋๊ณ , ๊ฐ ์ค๋ ๋๋ค์ Region ๋ณ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ค.
Summary
> - region๋ณ ํต๊ณ์ ๋ณด๋ก ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ๋ฐ๋๊ฐ ๋์ ๋ถ๋ถ์ด ์ด๋๊น์ง์ธ์ง dense prefix๋ฅผ ์ ํ๋ค.
> - ์ค๋ ๊ธฐ๊ฐ ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ ์์ผ๋ก ์ฌ์ฉํ ํ๋ฅ ์ด ๋๋ค๋ ๊ฐ์ ํ์ย dense prefix๋ฅผ ๊ธฐ์ค์ผ๋กย compact ์์ญ์ ์ค์ธ๋ค.Compaction : destination๊ณผ source๋ก ๋๋์ด, ์ด์๋จ์ ๊ฐ์ฒด๋ destination์ผ๋ก ์ด๋์ํค๊ณ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ ์ ๊ฑฐํ๋ค.
- Old GC ์ฒ๋ฆฌ๋์ ๋๋ ค์ฃผ๊ธฐ์ํ Summary ์์ ์ ์ถ๊ฐ์ ์ผ๋ก ์งํํ๋ค.
- Stop The World๋ก Java Application์ด ๋ฉ์ถ๋ ํ์์ ์ค์ด๊ณ ์ ๋ง๋ GC ์ด๋ค.
- Young ์์ญ์ ์ 3) Parallel GC ์ ๋์ผํ๋ค.
- Old ์์ญ์ Reacable ํ ๊ฐ์ฒด๋ฅผ ํ๋ฒ์ ์ฐพ์ง ์๊ณ ๋๋ ์ ์ฐพ๋ ์๋ 1)~4)๋จ๊ณ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
Old ์์ญ์ GC ๊ณผ์
- Initial Mark : GC Root๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ง ๋งํนํ๋ค. (stop-the-world ๋ฐ์ํ์ง๋ง, ํ์ ๊น์ด๊ฐ ์์์ ๋ฐ์ ์๊ฐ์ด ๋งค์ฐ ์งง๋ค.)
- Concurrent Mark : stop-the-worldย ์์ด ์งํ๋๋ค. ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ, ์ง์์ ์ผ๋ก ๋งํนํ๋ค.ย
- Remark : Concurrent Mark ๊ณผ์ ์์ ๋ณ๊ฒฝ๋ ์ฌํญ์ด ์๋์ง ๋ค์ ํ๋ฒ ๋งํนํ๋ฉฐ ํ์ ํ๋ค. (stop-the-world ๋ฐ์ํ๋๋ฐ, ์ด ์ง์์๊ฐ์ ์ค์ด๊ธฐ ์ํด ๋ฉํฐ์ค๋ ๋๋ก ๊ฒ์ฆ ์์ ์ ์ํํ๋ค.)
- Concurrent Sweep : stop-the-world ์์ด ์งํ๋๋ค.ย ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ค.
์์ ๊ฐ์ด stop-the-world์ ๋ฐ์ ์๊ฐ์ ์ต์ํ์ผ๋ก ํ๋ค.
- Compacting ํ์ง ์๋๋ค.
- Java9 ์ด์์ default GC ์ด๋ค.
- ํ์ฌ GC ์ค stop-the-world์ ์๊ฐ์ด ์ ์ผ ์งง๋ค.
- CMS GC ๋ฅผ ๊ฐ์ ํ์ฌ ๋ง๋ GC๋ก ์์์ ์ดํด๋ณธ GC์๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
- Heap์ Region ์ด๋ผ๋ ์ผ์ ํ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ ์ฒด Heap์ ๋ํด์ ํ์ํ์ง ์๊ณ ๋ถ๋ถ์ ์ผ๋ก Region ๋จ์๋ก ํ์ํ์ฌ, ๊ฐ๊ฐ์ Region์๋ง GC๊ฐ ๋ฐ์ํ๋ค.
- Young ์์ญ๊ณผ Old ์์ญ์ด ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋์ด์์ง ์๊ณ , ํด๋น ์์ญ์ ๊ฐ์ฒด๋ค์ Region ์ด๋ผ๋ ๊ตฌ์ญ์ ํ ๋นํ๋ค.
๊ฐ ์ง์ญ์ ์ญํ ๊ณผ ํจ๊ป ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถ(Eden ์์ญ์ธ์ง, Survivor ์์ญ์ธ์ง, Old ์์ญ์ธ์ง)ํ์ฌ, ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
- ๊ฐ์ ํ์ฌ ๋ง๋ GC๋ก ์์์ ์ดํด๋ณธ GC์๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
1.ย ์๋ก์ด ๊ฐ์ฒด๊ฐ Eden ์์ญ์ ํ ๋น๋๋ค.
2.ย Eden ์์ญ์ด ๊ฝ์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์๋๋ค.
3.ย Mark ๊ณผ์ ์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ Survivor0 ์์ญ์ผ๋ก ๋ณต์ฌํ๊ณ , Eden ์์ญ์ ์๋ ๋ฐ์ดํฐ๋ค์ ์ญ์ ํ๋ค.
4.ย ๊ทธ ๋ค์ Minor GC๊ฐ ์ผ์ด๋ฌ์ ๋๋, Eden์์ญ๊ณผ Survivor0 ์์ญ์ ๋ชจ๋ markํ๊ณ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ Survivor1 ์์ญ์ผ๋ก ๋ณต์ฌํ๊ณ ,ย Eden ์์ญ๊ณผ, Survivor0 ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
5.ย ํน์ age์ ๋๋ฌํ ๊ฐ์ฒด๋ค์ Old generation ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค. Young generation์์ Old generation์ผ๋ก ์ฎ๊ฒจ์ง๋ ํ์์ promotion ์ด๋ผํ๋ค.
- ๋ธ๋ก๊ทธ ๊ธ์ ๋ณด๋ค๋ณด๋ฉด Major GC (Full GC) ์ด๋ฐ์์ผ๋ก ๋์ผํ๊ฒ ์จ๋์ ๊ธ์ด ๋ง์๋ฐ, ์๊ฐํด๋ดค์๋ ์ด์ ๋ ๋ชจ๋ Old ์์ญ์์ ๋ฐ์ํ๋ GC ์ค๋ช ์์ ๋ณด์ฌ์ง๋๋ฐ, ๋๊ฐ GC ๋ชจ๋ Old ์์ญ์์ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ธ๊ฒ ๊ฐ๋ค. ๊ฐ ํน์ง์ ์์ ๋ค์ ์ ๋ฆฌํ ๋ด์ฉ์ ์ฐธ๊ณ ํ๋ฉด ๋ ๊ฒ๊ฐ๋ค.
- ๋ฉ๋ชจ๋ฆฌ์ ์ธ๋ถ ๋จํธํ ๋ฐ์์ ๋ฐฉ์งํ๋ค. ์ธ๋ถ ๋จํธํ๋, ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ ํด์ ๋๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋จ์ง๋ง ํํธํ๋์ด์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋์ ๋๊ฐ์ Survivor ๋ผ๋ฆฌ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉฐ ์ด๋ฅผ ๋ฐฉ์งํ๋ค.
- JVM์ Heap ์์ญ์ ์ค๊ณํ ๋ ์๊ฐ 2๊ฐ์ง ์ ์ ์กฐ๊ฑด์ผ๋ก ์ค๊ณ๋์๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋๋ฌผ๊ฒ ์กด์ฌํ๋ค.
๊ฐ์ฒด๋ ์ผํ์ฑ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ ๋จ์์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ young, old ์์ญ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ค๊ณํ์๋ค. ๋ฐ๋ผ์ ์์ฃผ ๋ฐ์ํ๋ MinorGC, Old ์์ญ์ด ๊ฐ๋ ์ฐฐ๋ ๋ฐ์ํ์ฌ ๋น๊ต์ ์ ๊ฒ ๋ฐ์ํ๋ Major GC๋ก ๋๋ ์ ธ์ ๋ฐ์ํ๋ค.
https://steemit.com/kr/@parkjp/java-garbage-collection-gc
https://spurdev.tistory.com/10
https://lemonlemon.tistory.com/175
https://mangkyu.tistory.com/118
https://jonny-cho.github.io/java/2021/06/01/garbage-collection/
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kbh3983&logNo=220967456151