๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)
java์ Garbage Collection(GC) ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก, ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ช
์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ๋ค๋ฃจ์ง ์๊ณ ๋ ํจ์จ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก JVM์ GC๊ฐ ๋์ํ๋ค. C์ C++์์ free()
๋ delete()
์ ๊ฐ์ ํจ์๋ฅผ ํตํด ๋ช
์์ ์ผ๋ก ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ์ด์ผ ํ์ง๋ง, ์๋ฐ์์ GC๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋์ ์ํํด ์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํด ์ค๋ค.
โฝํ์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด ์ค
โฝ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๊ฐ๋ฐ์๋ง ์ง์คํ ์ ์์
โพ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ์์ ์ ์ ํํ ์ ์ ์์
โพGC๊ฐ ๋์ํ๋ ๋์ JVM์ ๋ค๋ฅธ ๋์๋ค์ด ์ค๋จ๋จ (์ค๋ฒํค๋ ๋ฐ์)
๐ก ๊ฐ๋น์ง (Garbage)
์ง์ญํ๋ฉด "์ฐ๋ ๊ธฐ", "ํ๊ธฐ๋ฌผ"์ ๋ปํ๋ฉฐ ํ๋ก๊ทธ๋๋ฐ์์ ๋ ์ด์ ํ์ํ์ง ์์ (๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ด์ผ ํ๋) ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฐ ์ธ๋ชจ์๋ ๊ฐ์ฒด๋ค์ ๋ ์ด์ ํ๋ก๊ทธ๋จ ์์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ฐธ์กฐ๊ฐ ์์ด ์ฌ์ฉ๋์ง ์๋ ์ํ๋ค.
๐ก๊ฐ๋น์ง ์ปฌ๋ ์
ํ ์์ญ์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์ค ํ์ ์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก JVM์ด ์ ๊ฑฐํด ์ฃผ๋ ํ๋ก์ธ์ค๋ก, Java๋ฟ๋ง ์๋๋ผ Python, JS, Go์ธ์ด, ๋ธ๋ผ์ฐ์ ๋ฑ์์ ์ฐ์
๊ฐ๋น์ง (Garbage)
GC์ ๋์์ด ๋๋ "Garbage"๊ฐ ๋ฐ์๋๋ ๊ฒฝ์ฐ๋ถํฐ ์ดํด๋ณด์. ํ ์์ญ์ ์กด์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์ค, ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด ๋ ์ด์ ์ฌ์ฉํ ์ ์์ด์ง ๊ฐ์ฒด๊ฐ GC์ ์ฒ๋ฆฌ ๋์์ด ๋๋๋ฐ, ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ๋ณ์์ null ์ด ๋ค์ด๊ฐ ์ฐ๊ฒฐ์ด ๋๊ธฐ๊ฑฐ๋ ์ฐธ์กฐ ๋ณ์๊ฐ ์กด์ฌํ๋ ๋ฉ์๋๊ฐ ์๋ฉธ๋์ด ๋ณ์๊ฐ ์ฌ๋ผ์ก์ ๋ ๋ฐ์๋๋ค.
์์์ ๋งํ ์ฐธ์กฐ ๊ด๊ณ ๋ง๊ณ ๋, ๋ฉ์๋ ์์ญ(ํด๋์ค ์์ญ)์ ์ ์ ๋ณ์์ ์ํ ์ฐธ์กฐ๋ ํ ๋ด์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํ ์ฐธ์กฐ ๋ฑ ์ฌ๋ฌ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ผ๋ฉฐ, ์ด์ฐ ๋๋ ํน์ ๊ฐ์ฒด์ ๋ํ ์ ํจํ ์ฐธ์กฐ๊ฐ ์์ ๋ ๊ฐ๋น์ง๊ฐ ๋ฐ์ํ๋ค!
๐กReachable
ํน์ ๊ฐ์ฒด์ ์ ํจํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ
๐กUnreachable
ํน์ ๊ฐ์ฒด์ ์ ํจํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ (Garbage)
[์ฐธ์กฐํ๋ ๋ณ์์ ์ฐ๊ฒฐ์ด ๋๊ฒผ์ ๋]
public class GarbageExample1 {
public static void main(String[] args) {
// ๊ฐ์ฒด ์์ฑ
MyClass obj1 = new MyClass("Object 1");
MyClass obj2 = new MyClass("Object 2");
// obj1์ ๋ ์ด์ ์ฐธ์กฐํ์ง ์์
obj1 = null;
}
}
[์ฐธ์กฐํ๋ ๋ณ์๊ฐ ์๋ฉธ๋์์ ๋]
public class GarbageExample2 {
public static void main(String[] args) {
// ๋ฉ์๋ ํธ์ถ
testMethod();
// testMethod()์ ๋ก์ปฌ ๋ณ์(obj)๊ฐ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋ ์ญ์ ๋๋ฉฐ ๊ฐ๋น์ง ๋ฐ์
}
static void testMethod() {
MyClass obj = new MyClass("Object 1");
}
}
JVM ํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
GC๋ JVM์ ํ ์์ญ์ ์กด์ฌํ๋ Unreachableํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์์ผ๋ก ๋์ํ๋ค๊ณ ํ๋๋ฐ, Young
๊ณผ Old
์์ญ์ผ๋ก ๋๋๋ ํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ฐ๋ผ GC๊ฐ ๋์ํ๋ ๊ณผ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํด ๋จผ์ ์ดํด๋ณด์.
Java ํ๋ก๊ทธ๋จ์ด ์์๋๋ฉด JVM์ด ์ด์์ฒด์ (OS)์์ ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ฐ์ ธ์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฉ๋์ ๋ง๊ฒ ๋ฉ์๋ ์์ญ(ํด๋์ค ์์ญ)
, ํ ์์ญ
, ์คํ ์์ญ
, PC ๋ ์ง์คํฐ
, ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ
๋ฑ์ผ๋ก ๋๋๋๋ฐ ๊ทธ์ค GC์ ํ๋ ๋ฒ์์ธ ํ ์์ญ์ ๊ฐ์ฒด์ ์ธ์คํด์ค๊ฐ ๋์ ์ผ๋ก ์์ฑ๋์ด ์ ์ฅ๋๋ ์์ญ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฃผ์ ๊ณต๊ฐ์ ๋งจ ์๋๋ถํฐ ํ ๋น๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ปค์ง๋ ๋ฐฉํฅ(์๋ก)์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
ํ ์์ญ์ ๊ฐ์ฒด์ ์๋ช
์ฃผ๊ธฐ์ ๋ฐ๋ผ ์์ ๊ทธ๋ฆผ์ฒ๋ผ Young Generation
๊ณผ Old Generation
์ผ๋ก ๋๋๋ฉฐ Young Generation
์ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ค์ด ํ ๋น๋๊ณ ์ผ์ ์๊ฐ ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ด๋ํ๋ ๊ณต๊ฐ์ด๋ค. ๋ฐ๋ฉด Old Generation
์ Young Generation
์์ ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ด๋ํ์ฌ ์ ์ฅ๋๋ ๊ณณ์ผ๋ก ์ฅ๊ธฐ๊ฐ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ค์ด ์์นํ๋ค. ์ด๋ ๊ฒ ํ ์์ญ ์์์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ตฌ๋ถํ๋ ์ด์ ๋ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ Unreachableํ ์ํ๊ฐ ๋๊ณ , ์ค๋๋ ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ์ ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ด์ ๊ฐ์ด ์ค๊ณ๋์๋ค.
Young Generation
๐น์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ค์ด ํ ๋น๋๋ ์์ญ
๐นEden ์์ญ๊ณผ ๋ ๊ฐ์ Survivor ์์ญ์ผ๋ก ๋๋จ
๐น์ด๊ธฐ์ ๊ฐ์ฒด ์์ฑ ์ Eden ์์ญ์ ํ ๋น
๐น์ผ๋ถ ๊ฐ์ฒด๋ค์ด Survivor ์์ญ์ผ๋ก ์ด๋
๐น์ฃผ๊ธฐ์ ์ผ๋ก ์ด์๋จ์ ๊ฐ์ฒด๋ค์ Old Generation ์์ญ์ผ๋ก ์ด๋
๐นMinor GC๊ฐ ๋์ํ๋ ์์ญ
Eden
- new
ํค์๋๋ฅผ ํตํด ์๋ก ์์ฑ๋ ๊ฐ์ฒด ์ ์ฅ
- ์ ๊ธฐ์ ์ธ GC ์์
์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค Survivor ์์ญ ์ค ํ๋๋ก ์ด๋
Survivor 0 / Survivor 1
- ์ต์ 1๋ฒ ์ด์ GC์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์กด์ฌ
- ํ๋์ Survivor ์์ญ์ด ๊ฐ๋ ์ฐจ๋ฉด ๊ทธ์ค ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ด๋ ์ํด
- ๊ฐ๋ ์ฐผ๋ Survivor ์์ญ์ ์๋ฌด ๋ฐ์ดํฐ ์๊ฒ ๋จ
- Survivor 0
๋๋ Survivor 1
๋ ์ค ํ๋๋ ๊ผญ ๋น์ด ์์ด์ผ ํจ! (์์ ๊ณผ์ ๋๋ฌธ์)
- ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค ๊ณ์ ์ด์๋จ์ ์๋ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋
Old Generation
๐นYoung Generation์์ ์ผ์ ์ฃผ๊ธฐ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ค ์กด์ฌ
๐น์ค๋๋ ๊ฐ์ฒด๋ค์ด ์์นํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๋ ๋ณต์กํจ
๐นMajor GC๊ฐ ๋์ํ๋ ์์ญ
Permanent Generation (java8๋ถํฐ ์ฌ๋ผ์ง)
๐นJava8 ๋ฒ์ ์ด์ ์ ์กด์ฌํ๋ ์์ญ
๐น๋ํดํธ๋ก ์ ํ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์
๐นํด๋์ค ๋ก๋์ ์ํด ๋ก๋๋ ํด๋์ค๋ค์ด ์ ์ฅ
๐นPerm Generation์ ๋ฉ์๋ ์์ญ์ด๋ผ๊ณ ๋ ํ๋ค
(๊ทธ๋์ Perm ์์ญ์ด "ํ ์์ญ์ด๋ ์๋๋"์ ๋ํด ๋ง์ด ์ข ์๋ ๊ฒ ๊ฐ๋ค)
๐นJava8 ๋ฒ์ ์ดํ์ Metaspace๋ก ๋ณ๊ฒฝ
โช๏ธ ๋ ์ ์ฐํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํฌ๊ธฐ ๋์ ์ผ๋ก ์กฐ์
โช๏ธ Metaspace๋ Heap์ด ์๋ Native memory* ์์ญ์ ์์นํ๋ค (๋ ์ด์ ํ ์์ญ X)
โช๏ธ JVM์ ๊ด๋ฆฌ๋์ง ์๊ณ OS ๋ ๋ฒจ์์ ๊ด๋ฆฌ๋จ
๐ก Method Area vs Perm Generation (Metaspace)
ํ ๋ฉ๋ชจ๋ฆฌ ์์ ์์๋ค๋ Perm Generation๊ณผ java8 ๋ฒ์ ์ดํ์ ์๊ธด Metaspace๊ฐ ํด๋์ค ๋ก๋๋ก๋ถํฐ ์ ๊ณต๋ฐ์ ํด๋์ค ์ ๋ณด, ๋ฉ์๋ ๋ฉํ ๋ฐ์ดํฐ ๋ฑ์ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ํํ ์๊ณ ์๋ JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ค Method ์์ญ(ํด๋์ค ์์ญ)๊ณผ ๋ค๋ฅธ ์ ์ด ๋ญ์ง..?๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
Method Area๋ ์ค๋ผํด, ์๋ง์กด, Azul ๋ฑ JVM ๋ฒค๋(๊ณต๊ธ์ ์ฒด)๋ง๋ค ๋ค๋ฅด๊ฒ ๊ตฌํ๋์ด ์๋๋ฐ ์ค๋ผํด์ Hotspot JVM์ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด Method Area๊ฐ JDK7๊น์ง๋ Perm Generation์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ณ , JDK8๋ถํฐ๋ Metaspace๋ก ๋ถ๋ฆฌ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค. ๊ฒฐ๊ตญ Method Area์ Perm Generation, Metaspace๋ ๊ฐ์ ๋ง์ด๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ ์๋ฐ ๋ฒ์ ์ ๋ฐ๋ผ ๊ตฌํ๋์ด ์๋ ๋ด์ฉ์ด ๋ค๋ฅด๋ค.
๐กNative memory area
ํ ์์ญ ๋ฐ๊นฅ์ ๊ณต๊ฐ์ ์๋ฏธํ๋ ๊ฒ์ผ๋ก ์ฝ๊ฒ ์์คํ
์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. Java8 ๋ฒ์ ์ด์ ์
Permenent Generation
์์ญ์ JVM์ด ๋ณ๋์ ํ ์์ญ์ ์ค์ ํด ์ค ๊ด๋ฆฌ๋์์ง๋ง, Java8 ๋ฒ์ ์ดํMetaspace
๋ก ๋ณ๊ฒฝ๋๋ฉด์ JVM์ด ์๋ ์ด์์ฒด์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌ๋๋ค.
์ด๋ฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ์ด์ ๋ Perm ์์ญ์ JVM์ ์ํด ํฌ๊ธฐ๊ฐ ๊ฐ์ ๋์๋ ์์ญ์ผ๋ก, ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋์ด ์ด์์ฒด์ ๊ฐ JVM์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋ฒ ํ ๋นํ ์ดํ์๋ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํน์ง์ ๊ฐ์ง๊ณ ์์๋ค. ๋ฐ๋ผ์ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๋ฉด OutOfMemoryError
๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Java8 ๋ฒ์ ์ดํ๋ถํฐ ์ด์์ฒด์ ์์ ์ ๊ณตํ๋ Native memory์ Metaspace๋ผ๋ ๊ณต๊ฐ์ ๋ง๋ค์ด ํฌ๊ธฐ๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์๊ฒ ์ค๊ณํ ๊ฒ์ด๋ค. ํ์์ ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์์ผ ๊ณต๊ฐ์ ํ๋ณดํ๊ฒ ๋๋ฏ๋ก OutOfMemeroError
์ ๋ฐ์ํ๋ฅ ์ ์ค์ผ ์ ์๋ค.
๋ฉ์๋ ์์ญ์ด Java8๋ถํฐ ๋ณ๊ฒฝ๋๋ฉด์ ๊ธฐ์กด์ Perm ์์ญ์ ์กด์ฌํ๋ Static Object๋ ํ ์์ญ์ผ๋ก ์ฎ๊ฒจ์ ธ GC์ ๋์์ด ์ต๋ํ ๋ ์ ์๋๋ก ํ๋ค.
โJava8 ์ด์
โJava8 ์ดํ
๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ ๋ฐฉ์
๊ฐ๋น์ง ์ปฌ๋ ์
์ ํ ์์ญ์ Young Generation
์์ ๋์ํ๋ Minor GC์ Old Generation
์ ๋์ํ๋ Major GC๋ก ๊ตฌ๋ถํ ์ ์๊ณ , ์ธ๋ถ ๋์ ๋ฐฉ์๋ ๋ค๋ฅด๋ค. ํ์ง๋ง ๋ GC์์ ๋ชจ๋ ๊ณตํต์ ์ผ๋ก ๋์ํ๋ ๋จ๊ณ๊ฐ ์กด์ฌํ๋๋ฐ, Minor GC์ Major GC๋ฅผ ๋ณด๊ธฐ ์ ์ ์ดํด๋ณด์.
1. Stop The World (STW)
GC๋ฅผ ์คํํ๊ธฐ ์ํด JVM์ด ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํ์ ์ค๋จํ๋ ๋จ๊ณ์ด๋ค. GC๊ฐ ์คํ๋ ๋ GC๋ฅผ ์คํํ๋ ์ฐ๋ ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฐ๋ ๋๋ค์ ์์ ์ด ์ค๋จ๋๊ณ , GC๊ฐ ์์ ์ ์๋ฃํ๋ฉด ๋ค๋ฅธ ์ฐ๋ ๋๋ค์ ์์ ์ด ๋ค์ ์งํ๋๋ค.
๋ฐ๋ผ์ ๋น๋ฒํ๊ฒ GC๋ฅผ ์คํํ ์, ํด๋น ๋จ๊ณ(STW)๋ก ์ธํด ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ๋ณดํต GC ์ต์ ํ ์์ ์ธ GCํ๋์ ์ด ์๊ฐ์ ๋จ์ถ์ํค๊ธฐ ์ํ ๊ณ ๋ฏผ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
2. Mark and Sweep
STW ๋จ๊ณ์์ ๋ชจ๋ ์์
์ด ์ค๋จ๋๋ฉด, GC๋ ์คํ์ ๋ชจ๋ ๋ณ์ ๋๋ Reachable ๊ฐ์ฒด๋ฅผ ์ค์บํ๋ฉฐ ๊ฐ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋์ง ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋๋ฐ, ์ด ๊ณผ์ ์ Mark๋ผ๊ณ ํ๋ค. ์ดํ Mark๋์ง ์์ ๊ฐ์ฒด๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ Sweep ๊ณผ์ ์ด ์งํ๋๋ค. Sweep ๊ณผ์ ํ ๋ถ์ฐ๋์ด ์๋ ๊ฐ์ฒด๋ค์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์๋ก ๋ชจ์ผ๋ Compact ๊ณผ์ ์ ํตํด GC ๋์์ด ๋ง๋ฌด๋ฆฌ๋๋ค.
๐นMark: ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์๋ณ
๐นSweep: ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์์
๐นCompact: ๋ถ์ฐ๋ ๊ฐ์ฒด๋ค์ ์์ ์ฃผ์๋ก ๋ชจ์ผ๋ ์์
(์์ถ ์์
)
Minor GC ๋์ ๋ฐฉ์
ํ์ Young ์์ญ ์ค Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด Minor GC๊ฐ ๋์ํ๋ค. ๋น๊ต์ ์งง๊ฒ ์ด์๋จ๋ ๊ฐ์ฒด๋ค์ด ์กด์ฌํ๋ Young ์์ญ์์ ์๋๋๋ GC๋ฅผ Minor GC๋ผ๊ณ ํ๋ฉฐ Old ์์ญ์ ๋นํด ์๋์ ์ผ๋ก ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์๋๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ๊ฑฐํ๋๋ฐ ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. Minor GC๋ ์๋๋๋ฉด Eden ์์ญ๊ณผ ํจ๊ป Survivor ๊ณต๊ฐ๋ ๊ฒ์ฌํด Reachableํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ Survivor ๊ณต๊ฐ์ผ๋ก ์ด๋์ํจ๋ค. ์ด๋ Minor GC ๋์ ํ ์ด์๋จ์(Reachableํ) ๊ฐ์ฒด๋ค์ age ๊ฐ์ด ํ๋์ฉ ์ฆ๊ฐ๋๋ฉฐ age๊ฐ์ด ํน์ ์๊ณ๊ฐ์ ๋๋ฌํ๋ฉด Old ์์ญ์ผ๋ก ์ด๋๋๋ค.
๐ก age
GC๋ก๋ถํฐ ๊ฐ์ฒด๊ฐ ์ด์๋จ์ ํ์๋ฅผ ์๋ฏธํ๋ ๊ฐ์ด๋ฉฐ, Object Header์ ๊ธฐ๋ก๋๋ค.
age๊ฐ์ด ์๊ณ๊ฐ์ ๋ค๋ค๋ฅด๋ฉด Old ์์ญ์ผ๋ก ์ด๋(Promotion) ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
1. ์ฒ์ ์์ฑ๋ ๊ฐ์ฒด๋ Young Generation
์ Eden
๊ณต๊ฐ์ ์์น
2. ๊ฐ์ฒด๊ฐ ๊ณ์ Eden
์์ญ์ ์์ฌ ๊ฝ ์ฐจ๊ฒ ๋๋ฉด Minor GC ์คํ
3. Mark ๋์์ ํตํด Reachable ๊ฐ์ฒด๋ฅผ ํ์
4. Eden
์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor
์์ญ์ผ๋ก ์ด๋
5. Sweep ๋์์ ํตํด Eden
์์ญ์์ Mark๋์ง ์์ ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ํด์
6. ์ด์๋จ์ ๋ชจ๋ ๊ฐ์ฒด age ๊ฐ +1
1. ๋ Eden
์์ญ์ ์๋ก์ด ๊ฐ์ฒด๋ค๋ก ๊ฐ๋ ์ฐจ๋ฉด Minor GC ๋ฐ์ํ๊ณ Mark ๋์ ์คํ
2. Mark๋ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ๋น์ด์๋ ๋ค๋ฅธ Survivor
์์ญ์ผ๋ก ์ด๋ํ๊ณ Eden
์์ญ๊ณผ Survivor 0
์์ญ์ Sweep
3. ์ด์๋จ์ ๊ฐ์ฒด๋ค age๊ฐ +1
4. ์์ ๊ณผ์ ๋ฐ๋ณต
Major GC ๋์ ๋ฐฉ์
Old ์์ญ์ Young ์์ญ ์ค ๊ธธ๊ฒ (ํน์ age ๋งํผ) ์ด์๋จ์ ๋ฉ๋ชจ๋ฆฌ๋ค์ด ์กด์ฌํ๋ ๊ณณ์ด๋ค. ์ฒ์์ Young์์ ์์ฑ๋ ๋ฉ๋ชจ๋ฆฌ๋ค์ด Minor GC ๊ณผ์ ์ค ์ ๊ฑฐ๋์ง ์๊ณ age์ ์๊ณ๊ฐ์ ๋๋ฌํ๋ฉด์ Old ์์ญ์ผ๋ก ์ด๋ํ ๊ฐ์ฒด๋ค์ด๋ค. ์ด๋ฅผ Promotion์ด๋ผ๊ณ ํ๋ฉฐ, Promotion์ผ๋ก ์ธํด Old ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค ์ฐจ๋ฉด Major GC์ด ๋ฐ์ํ๊ฒ ๋๋ค. (๊ทธ๋ฆผ์์ age ์๊ณ๊ฐ์ 8๋ก ์ค์ )
Promotion: Young ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ age๊ฐ ์๊ณ๊ฐ์ด ๋์ด Old ์์ญ์ผ๋ก ๋์ด์ด
Major GC ๋์: Mark, Sweep, Compact ๊ณผ์ ๊ฑฐ์ณ ๋ฉ๋ชจ๋ฆฌ ํด์
๐
๐GC ๋์ ๊ณผ์ ๊ทธ๋ฆผ ์ฐธ๊ณ
'๐ Language > ๐ Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP is A PIE) (0) | 2023.06.29 |
---|---|
[Java] Scanner ํด๋์ค / nextInt(), next(), nextLine() (0) | 2022.08.03 |
[Java] Arrays ๊ด๋ จ (0) | 2022.05.26 |
[Java] length, length(), size() (0) | 2022.05.21 |
[Java] ๋ด๊ฐ ๋ณด๋ ์๋ฐ ๋์ ๋์ .. (0) | 2022.05.06 |