โ๏ธ ์ด์ ์๊ฐ์ Garbage Collector์ ๋ํด ๊ณต๋ถํ๋ฉด์ Strong, Weak, Soft, Phantom Reference ์ ๋ํด ์ ๊น ์ค์ณ ์ง๋๊ฐ๋ค.
์ด๋, ํด๋น ๋ถ๋ถ์ ๋ํด ์์ธํ ๊ณต๋ถํ์ง ๋ชปํ๊ณ , ๋ฉํ ๋๊ป์ static์ผ๋ก ์ ์ธ๋ ๋ณ์๋ค์ ์ด๋ป๊ฒ GC ์ฒ๋ฆฌ๊ฐ ๋๋์ง, ์ด๋ป๊ฒ ์ด๊ธฐํ ํ ์ ์๋์ง ์ง๋ฌธํด์ฃผ์ จ๋ค.
๊ทธ๋์ ์ด๋ฒ ์๊ฐ์๋ GC๋ฅผ ์ํํ ๋, ์์ 4 ๊ฐ์ง๊ฐ ์ด๋ค ๊ฒ์ธ์ง ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์!
java.lang.ref
Java์์๋ ๊ฐ์ฒด์ ์ฐธ์กฐ์ ๋ํ ์ ํ์ 4๊ฐ์ง๋ก ๋๋์ด ๊ตฌ๋ถํ๊ณ , ๊ฐ๊ฐ์ ์ํ์ ๋ฐ๋ผ GC๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋ฆฌํด์ผ ํ ์ง ์ํ ์ง๋ฅผ ํ๋จํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ํด๋น ํจํค์ง์์ ์ ๊ณตํ๋ ํด๋์ค๋ฅผ ํตํด GC ์ํ์ ์ด๋์ ๋ ๊ด์ฌ ํ ์ ์๋ค.
์ด์ ์ Garbage Collector์ ๋ํด ๊ณต๋ถํ๋ฉด์ Reachablilty์ ๋ํด ๊ณต๋ถํ๋๋ฐ, ๋ค์ ์ง๊ณ ๋์ด๊ฐ์.
Heap ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ๊ฐ์ฒด๋ Reachableํ ๊ฐ์ฒด์ Un-Reachableํ ๊ฐ์ฒด๋ก ๋๋๋ฉฐ, GC๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ด์ฉํด Reachableํ ๊ฐ์ฒด์ธ์ง Un-Reachableํ ๊ฐ์ฒด์ธ์ง ํ์ธํ๊ณ (Mark), Rechableํ ๊ฐ์ฒด๋ ๋จ๊ฒจ๋๊ณ (Sweep) ๋๋จธ์ง ๊ฐ์ฒด๋ค์ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ๋ฆฌํ๋ค. (๋ ๊น์ด ๋ค์ด๊ฐ๋ฉด Heap ๋ฉ๋ชจ๋ฆฌ๋ Young Generation, Old Generation์ผ๋ก ๋๋๊ณ , Young Generation์ ๋๋ค์ Eden, Survive 1/2 ์์ญ์ผ๋ก ๋๋๋ค.)
๊ทธ๋ ๋ค๋ฉด GC๋ ์ด๋ค ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด๊ฐ Reachable ํ์ง Un-Reachable ํ์ง ํ์ธํ๊ณ Mark ๊ณผ์ ์ ์ํํ ๊น? ๊ทธ ๊ธฐ์ค์ด ๋ฐ๋ก Strong, Weak, Soft, Phantom Reachable์ด๋ค.
Strong Reference
์ผ๋ฐ์ ์ผ๋ก new ์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด Strong Reference ์ฐธ์กฐ๊ฐ ์ผ์ด๋๋ค. ์ฆ, ํด๋น ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ์ฐธ์กฐํ๊ฑฐ๋, Heap ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
ํ์ง๋ง ๋ง์ฝ A ๊ฐ์ฒด๊ฐ Root Set ๊ฐ์ฒด์ธ B ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง๋ง A ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ณณ์ด ์๋ค๋ฉด GC์ ์ํด A ๊ฐ์ฒด๋ Un-Reachable๋ก ๋งํฌ๋์ด ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋ฆฌ๋๋ค.
Weak Reference
public class RefTest {
public static void main(String[] args) {
WeakReference<RefTest> weak = new WeakReference<>(new RefTest());
RefTest ref = weak.get();
}
}
์์ ์ฝ๋๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. java.lang.ref์์ ์ ๊ณตํ๋ ํด๋์ค ์ค ํ๋๋ก, ์ฐธ์กฐํ๊ณ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์บก์ํํด์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ Weak Reference๋ ์๋กญ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ฉด Strongly Reachable ํ ๊ฐ์ฒด์ด๋ฉฐ, ๋ง์ฝ ํด๋น ์ฝ๋์ ๋ง์ง๋ง ์ค์ ref ๋ณ์๋ฅผ null๋ก ์ด๊ธฐํํ๋ฉด Weak Reference๋ Weakly Reachableํ ๊ฐ์ฒด๋ก ๋ฐ๋๋ค.
GC๋ Weakly Reachableํ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ ๋ Weak Reference์ ์ํด ์บก์ํ ๋ ๊ฐ์ฒด๋ฅผ null๋ก ์ค์ ํ๋ฉด์, Un-Reachable ๊ฐ์ฒด ๋ฟ๋ง ์๋๋ผ Weakly Reachable ๊ฐ์ฒด๋ ์ฐ๋ ๊ธฐ๋ก ๊ฐ์ฃผํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ค.
Root Set์ผ๋ก ๋ถํฐ ์ฐธ์กฐ ์ฌ์ฌ์ด ์กด์ฌํจ์๋ ๋ถ๊ตฌํ๊ณ GC๊ฐ ๋์ํ๋ฏ๋ก ์ด๋ ์ฐธ์กฐ๋ ๊ฐ๋ฅํ์ง๋ง ์ธ์ ๋ ์ ํจํ์ง ์๋ LRU ์บ์์ ๊ฐ์ ์์ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๊ตฌํ ํ ์ ์๋ค.
์ฆ, Weak Reference๋ ๋์์ด ๋ ๊ฐ์ฒด๋ฅผ ์บก์ํํ๊ณ GC๊ฐ Weak Reference๋ฅผ Strongly Reachable ๊ฐ์ฒด๋ก ์ธ์ํ๊ฒ ํ์ฌ, ์บก์ํ๋ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ๋ฆฌ๋๋ ๋์ ์ ์บก์ํ๋ ๊ฐ์ฒด๊ฐ ํ์ํ ๋ Weak Reference ๊ฐ์ฒด๋ฅผ ํตํด ์บก์ํ๋ ๊ฐ์ฒด๋ฅผ ํธ์ถ ํ ์ ์๋ค๋ ์ ์์ ์ ์ฉํ๋ค.
Soft Reference
Softly Reachable ํ ๊ฐ์ฒด, Strongly Reachable์ด ์๋๋ฉด์ Weak Reachable์ด๋ Phantom Reachable ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง ์๊ณ ์ค์ง Soft Reference ๊ฐ์ฒด๋ง ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
ํด๋น ๊ฐ์ฒด๋ ํน๋ณํ ์กฐ๊ฑด์ ์ํด GC์ ๊ด๋ฆฌ๋๋๋ฐ, Heap ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ํด๋น ๊ฐ์ฒด์ ์ฐธ์กฐ ๋น๋์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋๋ค. ๋๋ฌธ์ Soft Reference๋ Weak Reference์ ๋นํด ๋นํด ๋น๊ต์ ์ค๋ซ๋์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ค.
Phantom Reference
Phantom Reference๋ Soft Reference, Weak Reference๊ฐ finalize() ๋ ํ์ GC์ ์ํด ์ฒ๋ฆฌ๋๋๋ฐ, ์ด ๋ Soft Reference์ Soft Reference๊ฐ finalize() ๋์๋์ง ์๊ธฐ ์ํด์๋ ReferenceQueue๋ฅผ ์์์ผ ํ๋ค.
ReferenceQueue
Strongly, Weakly, Softly, Phantomly Reachable ๊ฐ์ฒด๊ฐ finalize() ๋์๋์ง ํ์ธํ์ฌ ๊ฐ์ฒด๋ค์ด GC์ ์ํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์๋๊ธฐ ์ ๊ด๋ จ ๊ฐ์ฒด์ ๋ํ ํ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํ๋ค. Weakly, Softly Reachable ๊ฐ์ฒด๋ GC์ ์ํด null๋ก ์ค์ ๋๋ฉด ReferenceQueue์ ์ํด์ enqueue()๋๋ค. ์ด ๋, poll() ํน์ remove() ๋ฉ์๋๋ฅผ ์ด์ฉํด ํด๋น ๊ฐ์ฒด๋ค์ด ํ์๋์๋์ง ํ์ธ ํ ์ ์๊ณ , ์ด์ ๋ํ ํ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
PhantomReference<ReferenceTest> phantom = new PhantomReference<>(new ReferenceTest(), new ReferenceQueue<>());
Phantom Reference๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ๋ฌด์กฐ๊ฑด ReferenceQueue๋ฅผ ์ธ์๋ก ๋ฐ์์ผ ์์ฑ ๊ฐ๋ฅํ๋ฐ, Phantom Reference์ get()๋ ํญ์ null์ ๋ฐํํ๊ธฐ์ ์บก์ํ๋ ๊ฐ์ฒด๊ฐ Phantomly Reachable ๊ฐ์ฒด๋ก ์ ํด์ง๋ฉด ํด๋น ๊ฐ์ฒด๋ ์ฌ์ฉ ํ ์ ์๊ฒ๋๋ค. Phantomly Reachable ๊ฐ์ฒด๋ก ํ๋ช ๋ ์บก์ํ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ GC๊ฐ null๋ก ์ค์ ํ์ง ์์ผ๋ฉด์ ํด๋น ๊ฐ์ฒด์ ๋ํด ํ์ฒ๋ฆฌ๋ฅผ ์ฒ๋ฆฌ ํ ์ ์๋ค. ๋๋ฌธ์ Phantomly Reachable ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ ๋ณ๋๋ก clear() ๋ฉ์๋๋ก ๋ฉ๋ชจ๋ฆฌ ํ์ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
๐คฏ ๋๋ฌด ์ด๋ ต๋ค.
ํด๋น ๋ถ๋ถ์ ๋ช ๋ฒ์ ์ฝ์ด๋ณด์๋ ์ดํดํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ค์ ๋ค. ํนํ๋ Phantom.. ์ด๊ฑธ ์ดํดํด์ผ ๊ณ ์๊ฐ ๋ ์ ์๋๊ฑฐ๊ฒ ์ง..?
์ด๋ฒ ์๊ฐ์ ํตํด ๊ฐ๋ฐ์๊ฐ ์ด๋์ ๋ GC์ ๊ด์ฌ ํ ์ ์๊ฒ ๋๋ฉด์ ์บ์๋ฅผ ๊ตฌํํ๋ค๋์ง ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ๊ฐ์ฒด์ ๋ํ ํ์ฒ๋ฆฌ๋ฅผ ์ํ ํ ์ ์๋ค๋์ง ํ๋ ๊ฒ๋ค์ ์๊ฒ ๋์๋ค.
๋ญ๊ฐ ์์ ๋ค๋ฅธ ์ธ์ ์ด์ผ๊ธฐ๊ฐ์ง๋ง!
์ฐธ๊ณ ์ฌ์ดํธ
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
F013 - Generic (0) | 2021.05.26 |
---|---|
F012 - Annotation (0) | 2021.05.24 |
F010 - System.out.println(), Logger (0) | 2021.05.19 |
F009 - Inheritance, Composition (0) | 2021.05.18 |
F008 - Garbage Collector (2) | 2021.05.16 |