GC(with Java Heap) - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
Heap์ด๋
-
์ธ์คํด์ค์ ๋ฐฐ์ด์ด ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ณต๊ฐ.
-
์์ฑ์ ํ์ํ ์ธ์คํด์ค์ ๋ฐฐ์ด์ ๋ฉํ ์ ๋ณด๋ Heap ๋ด์ Method Area์์ ์ป์ด์จ๋ค.
-
๋ชจ๋ Thread๊ฐ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
-
Garbage Collection์ ๋์์ด ๋๋ ์์ญ.
-
๊ฐ๋ฐ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ณ๋์ ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์๊ณ ์คํ๋ ค ๋ถ์์ฉ๋ง ๋ณ์ ๊ฐ๋ฅ์ฑ์ด ํผ. GC์ ๋งก๊ธฐ๋ ๊ฒ์ด ์ข๋ค
Heap ๊ตฌ์ฑ
Java 8 ์ด์
Java 8 ์ด์ ์๋ Metaspace๋ผ๊ณ ์ง์นญ๋ ์์ญ ๋์ ์ PermGen(Permanat Generation Space)๋ผ๊ณ
๋ถ๋ฆฌ๋ ์์ญ์ด ์กด์ฌํ์๋ค. ์ด ์์ญ์ ํด๋์ค์ ๋ฉํ ์ ๋ณด์ GC์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค, ๊ทธ๋ฆฌ๊ณ
static ๋ณ์๋ค์ '๊ฐ'์ ๊ฐ์ง๊ณ ์๋ ๊ณต๊ฐ์ด๋ค. ์๊ฐํด๋ณด๋ฉด, Method Area์ ์ญํ ์ด ๋์ผํด๋ณด์ธ๋ค.
์ฌ์ค Method Area๋ ๋
ผ๋ฆฌ์ ์ผ๋ก(logicaly) PermGen ์์ ํฌํจ๋๋ค.
๊ทธ๋ฆฌ๊ณ JVM์ ์คํํ ๋, -XX:PermSize : ์ด๊ธฐ Perm size -XX:MaxPermSize : ์ต๋ Perm size
์ด๋ฌํ ์ต์
์ ์ถ๊ฐํ๋ฉด PermGen์ ์ฌ์ด์ฆ๋ฅผ ์ค์ ํ ์ ์๋ค.
(์๋ง Method Area์ ํฌ๊ธฐ๋ ํน์ ํ ๋น์จ๋ก ๊ฐ์ด ์กฐ์ ๋์ง ์์๊น ์ถ๋ค)
๋ํ Heap์ฒ๋ผ PermGen๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- Exception in thread โmainโ: java.lang.OutOfMemoryError: Java heap spac
- Exception in thread โmainโ: java.lang.OutOfMemoryError: PermGen space
Java 8 ์ดํ
PermGen ์์ญ์ด ์ฌ๋ผ์ก๋ค. ๊ทธ๋ฆฌ๊ณ PermGen์ด ๋ด๋นํ๋ ์ญํ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฆฌํ๋ค.
- ์์ ๋ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ(static Object๋ ์์ํ๋ String Object)
- ์์ ๋ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ(class, method ๋ฑ์ ๋ฉํ๋ฐ์ดํฐ)
์์ ๋ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ Heap์ผ๋ก ์ฎ๊ฒจ ์ต๋ํ GC์ ๋์์ด ๋๋๋ก ํ๊ณ
์์ ๋ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ OS๊ฐ Native Memory์์ ์ง์ ๊ด๋ฆฌํ๋๋ก ์์ํ๋ค.
์ด Memory Area๋ฅผ Metaspace๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด ๋ณํ๋ PermGen์์ญ์ size ์ ํ์
์์ ๊ธฐ ์ํ ๊ฒ์ด ๋ชฉ์ ์ด๋ค. Metaspace๊ฐ Native memory์ ์์นํจ์ผ๋ก์จ
๊ฐ๋ฐ์๋ ์์ญ ํ๋ณด์ ์ํ์ ํฌ๊ฒ ์์ํ ํ์๊ฐ ์์ด์ง๊ฒ ๋์๋ค.
Heap์ ์์ธํ ๊ตฌ์ฑ์ ์๋ GC์ ๋์์ ์ดํดํ๋ฉด ๋์ฑ ์ฝ๊ฒ ์ ์ ์๋ค.
Garbage Collection
- ๊ฐ๋ฐ์๋ Heap์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ๊ณ ๋์ด์ ์ฌ์ฉํ์ง ์๋ ์ค๋ธ์ ํธ๋ค์ GC๋ฅผ ๋ด๋นํ๋ ํ๋ก์ธ์ค๊ฐ ์๋์ผ๋ก
๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋๋ก ํ๋ ๊ฒ์ด GC์ ๊ธฐ๋ณธ ๊ฐ๋ .
- Heap์ ์ธ์คํด์ค ์ค Thead์ JVM stack์์ ๋๋ฌํ ์ ์๋ ๊ฒ๋ค(Unreachable)์ด GC์ ๋์.
์ค์ํ๊ฑด, ๋๋ฌํ ์ ์๋ ๊ฒ๋ค์ pick ํ๋ ๊ฒ์ด ์๋๋ผ ๋๋ฌํ ์ ์๋ ๊ฒ๋ค์ pickํ ํ ๋๋จธ์ง๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ค.
์ด ๋ฐฉ์์ Mark and Sweep ์ด๋ผ๊ณ ํ๋ค.
Mark
GC๊ฐ JVM stack์ ๋ชจ๋ ๋ณ์๋ฅผ ์ค์บํ๋ฉด์ ๊ฐ๊ฐ์ด ํ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ค ์ธ์คํด์ค๋ฅผ
์ฐธ์กฐํ๊ณ ์๋์ง ์ฐพ์. ๋ฐ๊ฒฌ๋ ์ธ์คํด์ค ๋ํ ์ด๋ค ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋์ง ์ฐพ์.
์ด ์์
์ด ์ํ๋๋ฉด ๋ชจ๋ ์ค๋ ๋๋ ์ค๋จ๋๋๋ฐ, ์ด๋ฅผ 'stop the world'๋ผ๊ณ ๋ถ๋ฆ
(System.gc() ํธ์ถ์ ๊ฐ๋ณ๊ฒ ๋ณด๋ฉด ์๋ ๊ฒ)
Sweep
Mark๋์ง ์์ ์ธ์คํด์ค๋ค์ ์ ๊ฑฐ
Garbage Collection ์คํ ๊ณผ์ (with Heap Memory)
Young Generation
- Eden
์ธ์คํด์ค๋ค์ด ์ต์ด๋ก ์์ฑ๋๋ ๊ณต๊ฐ. ์ด ์์ญ์ด ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด Reachable ์ธ์คํด์ค๋ค์
Survivor 0 ์ผ๋ก ์ฎ๊ฒจ์ง๋ค. ์ด๋ฅผ MinorGC๋ผ๊ณ ํ๋ค.
๋ฐ๋ฉด Unreachable ์ธ์คํด์ค๋ค์ MinorGC๊ฐ ์คํ๋ ๋ ์ญ์ ๋๋ค.
- Survivor 0
MinorGC๊ฐ ํ๋ฒ ๋ฐ์ํ ๋ค ๋๋ฒ์งธ ๋ฐ์ํ๊ฒ ๋๋ฉด ๊ธฐ์กด์ Survivor 0์ ์์๋ ์ธ์คํด์ค ์ค
Reachable ์ธ์คํด์ค๋ค์ Survivor 1๋ก ์ฎ๊ฒจ์ง๊ณ Unreachable ์ธ์คํด์ค๋ค์ ์ญ์ ๋๋ค.
์ฎ๊ฒจ์ง ๋ ๊ฐ ์ธ์คํด์ค์ด ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ์ age๊ฐ์ด ์ฆ๊ฐํ๋ค.
- Survivor 1
MinorGC๊ฐ ์ธ๋ฒ ์งธ ๋ฐ์ํ๊ฒ ๋๋ฉด Survivor 1์ ์์๋ ์ธ์คํด์ค๋ค์ด ๋ค์ Survivor 0๋ก
์ฎ๊ฒจ์ง๊ณ ์ญ์ ๋๋ค. ์ด๋๋ ๊ฐ age๊ฐ์ด ์ฆ๊ฐํ๋ค. ์ธ์คํด์ค๋ค์ด Survivor 0 <-> Survivor 1 ์ด๋์
๋ฐ๋ณตํ๊ณ , ๊ฐ age๊ฐ๋ค์ด ํน์ ๊ธฐ์ค์ ๋์ด์๋ฉด ๊ทธ ์ธ์คํด์ค๋ค์ Old Generation์ผ๋ก ์ด๋ํ๋ค.
์ด๋ฅผ Promotion ๋จ๊ณ๋ผ๊ณ ํ๋ค.
- Old Generation
Promotion ๋จ๊ณ๊ฐ ๋ฐ๋ณต๋๋ฉด์ Old Generation์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ฉด MajorGC๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค