-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathCacheLeak.java
More file actions
63 lines (52 loc) ยท 3.07 KB
/
Copy pathCacheLeak.java
File metadata and controls
63 lines (52 loc) ยท 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package Chapter2.Day7;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
public class CacheLeak {
/**
* ๊ฐํ ์ฐธ์กฐ (Strong Reference)
* โ Integer prime = 1; ์ ๊ฐ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฐธ์กฐ ์ ํ์ด๋ค.
* prime ๋ณ์ ๋ ๊ฐ์ด 1 ์ธ Integer ๊ฐ์ฒด์ ๋ํ ๊ฐํ ์ฐธ์กฐ ๋ฅผ๊ฐ์ง๋ค.
* ์ด ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ GC ๋์์ด ๋์ง์๋๋ค.
*
* ๋ถ๋๋ฌ์ด ์ฐธ์กฐ (Soft Reference)
* โ SoftReference<Integer> soft = new SoftReference<Integer>(prime); ์ ๊ฐ์ด SoftReference Class ๋ฅผ ์ด์ฉํ์ฌ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
* ๋ง์ฝ prime == null ์ํ๊ฐ ๋์ด ๋์ด์ ์๋ณธ(์ต์ด ์์ฑ ์์ ์ ์ด์ฉ ๋์์ด ๋์๋ Strong Reference) ์ ์๊ณ ๋์์ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ SoftReference๋ง ์กด์ฌํ ๊ฒฝ์ฐ GC๋์์ผ๋ก ๋ค์ด๊ฐ๋๋ก JVM์ ๋์ํ๋ค.
* ๋ค๋ง WeakReference ์์ ์ฐจ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ์ง ์์ผ๋ฉด ๊ตณ์ด GC ํ์ง ์๋ ์ ์ด๋ค. ๋๋ฌธ์ ์กฐ๊ธ์ ์๊ฒฉํ์ง ์์ Cache Library ๋ค์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ์๋ค.
*
* ์ฝํ ์ฐธ์กฐ (Weak Reference)
* โ WeakReference<Integer> soft = new WeakReference<Integer>(prime); ์ ๊ฐ์ด WeakReference Class๋ฅผ ์ด์ฉํ์ฌ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
* prime == null ๋๋ฉด (ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๊ฐ WeakReference ๋ฟ์ผ ๊ฒฝ์ฐ) GC ๋์์ด ๋๋ค. ์์ ์ด์ผ๊ธฐ ํ ๋ด์ฉ๊ณผ ๊ฐ์ด SoftReference์ ์ฐจ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ์ง ์๋๋ผ๋ GC ๋์์ด ๋๋ค๋ ๊ฒ์ด๋ค.
* ๋ค์ GC๊ฐ ๋ฐ์ํ๋ ์์ ์ ๋ฌด์กฐ๊ฑด ์์ด์ง๋ค.
*/
/**
* ์บ์๋ ๋ณดํต Map ์ผ๋ก ๊ตฌํํ๋ค.
*
* ์บ์๋ ์์ ๋ฐ์ดํฐ์ธ ๋งํผ, ์ธ๋ชจ๊ฐ ์์ด์ง๋ฉด ์ญ์ ๋์ด์ผ ํ๋ค.
*
* ํ์ง๋ง HashMap() ์ผ๋ก ๊ตฌํํ๊ฒ ๋๋ฉด, Map ์ ์บ์๊ฐ์ด ์ฌ์ฉ๋์ง ์๋๋ผ๋ Map ์ด๋ผ๋ ์ปฌ๋ ์
์ด ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์ญ์ ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ค.
*
* WeakHashMap() ์ ์บ์์ ํค๊ฐ์ ๊ฐํ ์ฐธ์กฐ ์์ WeakReference ๋ก ๊ฐ์ธ๋ ํํ์ด๊ธฐ ๋๋ฌธ์, ํด๋น ์บ์๊ฐ ์ฌ์ฉํ์ง ์๊ฒ ๋๋ฉด GC์ ๋์์ด ๋์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๋ค.
*/
/**
* ์ฝ๋ฐฑ์ด ๋ญ์ง ์ ๋ชจ๋ฅด์ง๋ง ์ฝ๋ฐฑ ๋ํ ์บ์์ ๊ฐ์ด WeakHashMap() ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ํ๋ค.
*/
public static void main(String[] args) {
Map<Integer, String> map1 = new WeakHashMap<>();
Map<Integer, String> map2 = new HashMap<>();
Integer key1 = 1000;
Integer key2 = 2000;
Integer key3 = 1000;
Integer key4 = 2000;
map1.put(key1, "test a");
map1.put(key2, "test b");
map2.put(key3, "test a");
map2.put(key4, "test b");
key1 = null; // ์ฝํ ์ฐธ์กฐ
key3 = null; // ๊ฐํ ์ฐธ์กฐ
System.gc(); //๊ฐ์ Garbage Collection
map1.entrySet().stream().forEach(el -> System.out.println(el));
System.out.println();
map2.entrySet().stream().forEach(el -> System.out.println(el));
}
}