0%

Java引用

强引用

image-20200726150541800

1
2
3
4
5
6
7
public static void main(String[] args) {
Object obj1=new Object();
Object obj2=obj1;
obj1=null;
System.gc();
System.out.println(obj2);
}

软引用

image-20200726152650937

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
public class SoftReferenceDemo {

/**
* 内存够用就不回收,内存不够就回收
*/
public static void softRefMemoryEnough(){
Object o1=new Object();
SoftReference<Object> softReference=new SoftReference<Object>(o1);
System.out.println(o1);
System.out.println(softReference.get());
o1=null;
System.gc();
System.out.println(o1);
System.out.println(softReference.get());

}

/**
* 故意产生oom,new一个大内存数组,设置堆内存大小小一点
* -Xms5m -Xmx5m
*/
public static void softRefMemoryNotEnough(){
Object o1=new Object();
SoftReference<Object> softReference=new SoftReference<Object>(o1);
System.out.println(o1);
System.out.println(softReference.get());
o1=null;

try {
byte[] bytes=new byte[30*1024*1024];
}catch (Exception e) {
e.printStackTrace();
}finally
{
System.out.println(o1);
System.out.println(softReference.get());
}

}

public static void main(String[] args) {
//softRefMemoryEnough();
softRefMemoryNotEnough();
}
}

弱引用

image-20200726153240887

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class WeekReferenceDemo {

public static void main(String[] args) {
Object o1=new Object();
WeakReference<Object> weakReference=new WeakReference<>(o1);
System.out.println(o1);
System.out.println(weakReference.get());
System.out.println("==================");
o1=null;
System.gc();
System.out.println(o1);
System.out.println(weakReference.get());
}
}

软引用和弱引用英语场景

image-20200726153702788

WeakHashMap

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
public class WeakHashMapDemo {

public static void main(String[] args) {
myHashMap();
System.out.println("==============================");
myWeakHashMap();
}



private static void myHashMap() {
Map<Integer,String> hashMap=new HashMap<>();
Integer a=new Integer(1);
hashMap.put(a,"HashMap");
System.out.println(hashMap);

a=null;
System.gc();
System.out.println(hashMap);
System.out.println(hashMap);

}

private static void myWeakHashMap() {
Map<Integer,String> hashMap=new WeakHashMap<>();
Integer a=new Integer(1);
hashMap.put(a,"HashMap");
System.out.println(hashMap);

a=null;
System.out.println(hashMap);
System.gc();
System.out.println(hashMap);

}
}

image-20200726155639718

虚引用

image-20200726155743858

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class PhantomReferenceDemo {

public static void main(String[] args) throws InterruptedException {
Object o1=new Object();
ReferenceQueue<Object> referenceQueue=new ReferenceQueue<>();
PhantomReference<Object> phantomReference=new PhantomReference<>(o1,referenceQueue);

System.out.println(o1);
System.out.println(phantomReference.get());
System.out.println(referenceQueue.poll());

System.out.println("====================");
o1=null;
System.gc();
Thread.sleep(500);

System.out.println(o1);
System.out.println(phantomReference.get());
System.out.println(referenceQueue.poll());
}
}

引用队列

image-20200726161111815

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ReferenceQueueDemo {
public static void main(String[] args) throws InterruptedException {
Object o1=new Object();
ReferenceQueue<Object> referenceQueue=new ReferenceQueue<>();
WeakReference<Object> weakReference=new WeakReference<>(o1,referenceQueue);

System.out.println(o1);
System.out.println(weakReference.get());
System.out.println(referenceQueue.poll());

System.out.println("====================");
o1=null;
System.gc();
Thread.sleep(500);

System.out.println(o1);
System.out.println(weakReference.get());
System.out.println(referenceQueue.poll());

}
}

总结

image-20200726161334988