์ถ์ฒ
ChatGPT
์๋ฐ์ ์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ(reachability) ๊ฐ๋ ์ Garbage Collection(GC) ๋งค์ปค๋์ฆ์ ํต์ฌ์ผ๋ก, ์๋ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๊ฐ์ฒด๊ฐ ์ฌ์ ํ "์ฌ์ฉ ์ค"์ธ์ง, ์๋๋ฉด "๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ํ"์ธ์ง ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ค์ํ ๊ธฐ์ค์ด๋ค. ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ฒด๊ฐ ์ฌ์ ํ ํ๋ก๊ทธ๋จ์ ์คํ ๊ฒฝ๋ก ๋ด์์ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋์ง๋ฅผ ๋ํ๋ธ๋ค.
1. ์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ์ด๋ผ?
์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ(reachability)์ ํน์ ๊ฐ์ฒด๊ฐ ํ๋ก๊ทธ๋จ์ ์ด๋ค ๋ถ๋ถ์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ๋ ์ด๋ค. ์๋ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ํ๋ก๊ทธ๋จ ๋ด์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๋๋ฌ ๊ฐ๋ฅ์ฑ ๋ถ์(reachability analysis)์ ์ํํ๋ฉฐ, ์ด ๋ถ์์ ๋ฐ๋ผ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
2. ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ์ ํ
์๋ฐ์์๋ ์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ๋ฐ๋ผ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ฌ๋ฌ ๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์๋ค.
2.1 ๊ฐํ ์ฐธ์กฐ Strongly Reachable
์ ์
๊ฐ์ฒด๊ฐ ๊ฐํ ์ฐธ์กฐ(strong reference)์ ์ํด ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด๋ ๊ฐํ๊ฒ ๋๋ฌ ๊ฐ๋ฅํ ์ํ์ด๋ค.
์ค๋ช
๋ง์ฝ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ ๊ฒฝ๋ก(reference chain)๊ฐ ์กด์ฌํ๋ฉฐ, ๊ทธ ๊ฐ์ฒด๋ ๊ฐํ๊ฒ ๋๋ฌ ๊ฐ๋ฅํ ์ํ์ด๋ค.
์์
๋ก์ปฌ ๋ณ์๋ ํด๋์ค ํ๋๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ผ๋ฉด, ์ด ๊ฐ์ฒด๋ ๊ฐํ๊ฒ ๋๋ฌ ๊ฐ๋ฅํ ์ํ์ด๋ค.
Object obj = new Object(); // 'obj'๋ ๊ฐํ ์ฐธ์กฐ, 'new Object()'๋ ๊ฐํ๊ฒ ๋๋ฌ ๊ฐ๋ฅ
2.2 ์ฝํ ์ฐธ์กฐ Weakly Reachable
์ ์
๊ฐ์ฒด๊ฐ ์ฝํ ์ฐธ์กฐ(weak reference)์ ์ํด์๋ง ์ ๊ทผ ๊ฐ๋ฅํ ๋, ํด๋น ๊ฐ์ฒด๋ ์ฝํ๊ฒ ๋๋ฌ ๊ฐ๋ฅํ ์ํ์ด๋ค.
์ค๋ช
์ฝํ ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ ์ฝํ ์ฐธ์กฐ์๋ง ์์กดํ๋ ๊ฒฝ์ฐ, GC๋ ๊ฐ์ฒด๋ฅผ ์๊ฑฐ ๋์์ผ๋ก ๊ฐ์ฃผํ๋ค.
์์
WeakReference๋ก ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ ์ฝํ๊ฒ ๋๋ฌ ๊ฐ๋ฅํ๋ฉฐ, ๋ค๋ฅธ ๊ฐํ ์ฐธ์กฐ๊ฐ ์์ ๋ GC์ ๋์์ด ๋๋ค.
WeakReference<Object> weakRef = new WeakReference<>(new Object());
// weakRef๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๋ ์ฝํ๊ฒ ๋๋ฌ ๊ฐ๋ฅ
2.3 ์ ๋ น ์ฐธ์กฐ Phantomly Reachable
์ ์
๊ฐ์ฒด๊ฐ ์ ๋ น ์ฐธ์กฐ(phantom reference)๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด๋ ์ ๋ น ๋๋ฌ ๊ฐ๋ฅ ์ํ์ด๋ค.
์ค๋ช
์ ๋ น ์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ํ๋ ํ์๋ ์์กดํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๊ธฐ ์ ์ ์ถ๊ฐ ์์ ์ด ์ํ๋ ์ ์๋๋ก ํ๋ค. ์ ๋ น ์ฐธ์กฐ๋ ์ผ๋ฐ์ ์ผ๋ก GC ์ดํ ์ ๋ฆฌ(clean-up) ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
์์
PhantomReference๋ก ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ ReferenceQueue์ ๋ค์ด๊ฐ์, ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ ๋ก ํด์ ๋๊ธฐ ์ ์ ์ต์ข ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), refQueue);
// phantomRef๋ ์ ๋ น ์ฐธ์กฐ๋ก, ๊ฐ์ฒด๋ ์ ๋ น ๋๋ฌ ๊ฐ๋ฅ ์ํ
2.4 ์ข ๋จ ์ฐธ์กฐ Finally Reachable
์ ์
๊ฐ์ฒด๊ฐ ์ข ๋จ ์ฐธ์กฐ(finally reference)๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ด๋ค.
์ค๋ช
๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋์ง๋ ์์ง๋ง, finalize() ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ ์ํ์ด๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ finalize() ๋ฉ์๋๊ฐ ํธ์ถ๋ ํ์๋ ํ์๋์ง ์์ผ๋ฉฐ ๋ค์ GC์์ ์ ๊ฑฐ๋๋ค.
์์
๊ฐ์ฒด๊ฐ ์ข ๋จ ๋๋ฌ ๊ฐ๋ฅ ์ํ์ ๋๋ฌํ๋ฉด, GC๋ ๊ฐ์ฒด์ finalize() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ ๋ฆฌ ์์ ์ ์ํํ ์ ์๋ค.
class MyClass {
@Override
protected void finalize() throws Throwable {
System.out.println("Finalize called!");
}
}
MyClass obj = new MyClass();
obj = null; // ์ด์ ๊ฐ์ฒด๋ ๊ฐํ๊ฒ ๋๋ฌ ๊ฐ๋ฅํ์ง ์์, ์ข
๋จ ๋๋ฌ ๊ฐ๋ฅ ์ํ๋ก ์ ํ๋ ์ ์์
3. ์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ ๋ถ์ ๊ณผ์
์๋ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋๋ฌ ๊ฐ๋ฅ์ฑ ๋ถ์์ ํตํด ๊ฐ์ฒด๊ฐ ์ฌ์ ํ ์ฌ์ฉ ์ค์ธ์ง ์๋๋ฉด ์์ง ๋์์ธ์ง ๊ฒฐ์ ํ๋ค. ์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
1. ๋ฃจํธ ์งํฉ(Root Set) ์๋ณ
๋ฃจํธ ์งํฉ์ ๊ฐ์ฒด ๋๋ฌ ๊ฐ๋ฅ์ฑ ๋ถ์์ ์์ ์ง์ ์ผ๋ก, ํ๋ก๊ทธ๋จ์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฃจํธ ์งํฉ์๋ ๋ค์์ด ํฌํจ๋๋ค.
- ์คํ(stack) ๋ณ์ : ํ์ฌ ๋ฉ์๋ ํธ์ถ ์คํ์ ์๋ ๋ชจ๋ ์ง์ญ ๋ณ์์ ๋งค๊ฐ๋ณ์
- ์ ์ ๋ณ์(static fields) : ํด๋์ค ๋ก๋์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ชจ๋ ์ ์ ํ๋
- JNI ์ฐธ์กฐ : Java Native Interface๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด
2. ๊ฐ์ฒด ๊ทธ๋ํ ํ์
๋ฃจํธ ์งํฉ์์ ์์ํด ๋ชจ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ, ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ค.
๊ฐ ๊ฐ์ฒด๊ฐ ๋๋ฌ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ์ํด, GC๋ ์ฐธ์กฐ ๊ทธ๋ํ(reference graph)๋ฅผ ํ์ฉํด ๊ฐ์ฒด ๊ฐ์ ์ฐ๊ฒฐ์ ์ถ์ ํ๋ค.
3. ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ ์๋ณ
์ฐธ์กฐ ๊ทธ๋ํ๋ฅผ ํตํด ๋๋ฌํ ์ ์๋(unreachable) ์ํ๋ก ํ๋ช ๋ ๊ฐ์ฒด๋ค์ ๋ ์ด์ ํ๋ก๊ทธ๋จ์ ์ํด ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ์ธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์์ด ๋๋ค.
4. ์ํ ์ฐธ์กฐ์ Garbage Collection
์๋ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ๊ธฐ๋ฐํด ๊ฐ์ฒด๋ฅผ ์์งํ๊ธฐ ๋๋ฌธ์, ์ํ ์ฐธ์กฐ(circular reference)๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋ฐ์ํ์ง ์๋๋ค. ์ํ ์ฐธ์กฐ๋ ๋ ๊ฐ ์ด์์ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ค.
์ํ ์ฐธ์กฐ์ ์
class A {
B b;
}
class B {
A a;
}
A a = new A();
B b = new B();
a.b = b;
b.a = a;
a = null; // a๊ฐ ์ฐธ์กฐํ๋ A ๊ฐ์ฒด๋ ๋ ์ด์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๋ฐ์ง ์์
b = null; // b๊ฐ ์ฐธ์กฐํ๋ B ๊ฐ์ฒด๋ ๋ ์ด์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๋ฐ์ง ์์
์ ์์ ์์ A ๊ฐ์ฒด์ B ๊ฐ์ฒด๋ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์์ง๋ง, a์ b ๋ณ์๊ฐ ๋ชจ๋ null๋ก ์ค์ ๋๋ฉด ๋ ์ด์ ๊ฐํ์ฐธ์กฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค. GC๋ ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด๋, ์ธ๋ถ์์ ๋๋ฌํ ์ ์๋ค๋ ์ ์ ํ์ธํ๊ณ ์์ง ๋์์ ํฌํจ์ํจ๋ค.
5. ๊ฒฐ๋ก
์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ(reachability)์ ์๋ฐ์ GC๊ฐ ๊ฐ์ฒด๋ฅผ ์์งํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์ค์ํ ๊ธฐ์ค์ด๋ค. ๋๋ฌ ๊ฐ๋ฅ์ฑ ๋ถ์์ ํตํด ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๊ณ , ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ค. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋๋จธ๋ ์ฌ์ ํ ๋ถํ์ํ ์ฐธ์กฐ๋ฅผ ์ต์ํํ๊ณ , ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์ใ ๋ฅด ๋ ๋ช ์์ ์ผ๋ก ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ๋ ๋ฑ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ ๊ฒฝ ์จ์ผ ํ๋ค. GC๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์ฌ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ๊ณผ ๊ฒฐํฉํด ์ฌ์ฉํด์ผ ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.