Programming/Java

F011 - java.lang.ref

osean 2021. 5. 19. 19:59
โœ๏ธ ์ด์ „ ์‹œ๊ฐ„์— 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์— ๊ด€์—ฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด์„œ ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋˜์ง€ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ์ „ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ›„์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๋˜์ง€ ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ญ”๊ฐ€ ์™„์ „ ๋‹ค๋ฅธ ์„ธ์ƒ ์ด์•ผ๊ธฐ๊ฐ™์ง€๋งŒ!

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

NAVER D2

'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