Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 0db96f3

Browse filesBrowse files
committed
添加软引用、虚引用test
1 parent a75678d commit 0db96f3
Copy full SHA for 0db96f3

File tree

Expand file treeCollapse file tree

3 files changed

+105
-1
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

3 files changed

+105
-1
lines changed
Open diff view settings
Collapse file
+35Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.learnjava.reference;
2+
3+
import java.lang.ref.PhantomReference;
4+
import java.lang.ref.Reference;
5+
import java.lang.ref.ReferenceQueue;
6+
7+
public class PhantomRefTest {
8+
9+
public static void main(String[] args) throws InterruptedException {
10+
ReferenceQueue referenceQueue = new ReferenceQueue();
11+
12+
// 10mb
13+
byte[] buffer = new byte[1024 * 1024 * 10];
14+
15+
PhantomReference phantomReference = new PhantomReference(buffer, referenceQueue);
16+
17+
// 字节数组对象,失去了强引用
18+
buffer = null;
19+
20+
Reference ref0 = referenceQueue.poll();
21+
22+
System.out.println("gc 执行之前, refQueue中是否有数据?" + (ref0 != null ? "有" : "没有"));
23+
System.out.println("gc 执行之前, ref引用的对象:" + phantomReference.get());
24+
25+
System.gc();
26+
// 确保gc程序执行
27+
Thread.sleep(1000);
28+
29+
System.out.println("gc 执行之后, ref引用的对象:" + phantomReference.get());
30+
31+
Reference ref = referenceQueue.poll();
32+
System.out.println("gc 执行之后, refQueue中是否有数据?" + (ref != null ? "有" : "没有"));
33+
System.out.println("referenceQueue 中获取的 ref与 weakReference中的是否一致?" + (ref == phantomReference));
34+
}
35+
}
Collapse file
+35Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.learnjava.reference;
2+
3+
import java.lang.ref.Reference;
4+
import java.lang.ref.SoftReference;
5+
import java.util.ArrayList;
6+
import java.util.Iterator;
7+
import java.util.List;
8+
9+
/**
10+
* 软引用
11+
*/
12+
public class SoftReferenceTest {
13+
public static void main(String[] args) throws InterruptedException {
14+
List<Reference> refList = new ArrayList<Reference>();
15+
16+
for (int i = 0; i < 1000; i++) {
17+
// 10mb
18+
byte[] buffer = new byte[1024 * 1024 * 10];
19+
20+
SoftReference softReference = new SoftReference(buffer);
21+
22+
refList.add(softReference);
23+
}
24+
25+
System.gc();
26+
Thread.sleep(1000);
27+
28+
Iterator<Reference> it = refList.iterator();
29+
30+
while (it.hasNext()) {
31+
Reference ref = it.next();
32+
System.out.println("当前ref引用的对象:" + ref.get());
33+
}
34+
}
35+
}
Collapse file

‎JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java‎

Copy file name to clipboardExpand all lines: JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java
+35-1Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,47 @@
11
package com.learnjava.reference;
22

3+
import com.sun.webkit.graphics.Ref;
4+
35
import java.lang.ref.Reference;
46
import java.lang.ref.ReferenceQueue;
57
import java.lang.ref.WeakReference;
8+
import java.util.ArrayList;
9+
import java.util.Iterator;
10+
import java.util.List;
611

12+
/**
13+
* soft软引用 gc堆内存不够时,可能会回收
14+
* weak弱引用 gc时,内存一定会回收不可用对象
15+
* phantom虚引用
16+
*/
717
public class WeakReferenceTest {
818
public static void main(String[] args) throws Exception {
19+
// test01();
920
test02();
1021
}
1122

23+
private static void test01() throws InterruptedException {
24+
List<Reference> refList = new ArrayList<Reference>();
25+
26+
for (int i = 0; i < 1000; i++) {
27+
// 10mb
28+
byte[] buffer = new byte[1024 * 1024 * 10];
29+
30+
WeakReference weakReference = new WeakReference(buffer);
31+
32+
refList.add(weakReference);
33+
}
34+
35+
// 将buffer直接全部回收了
36+
System.gc();
37+
Thread.sleep(1000);
38+
Iterator<Reference> iterator = refList.iterator();
39+
while (iterator.hasNext()) {
40+
Reference ref = iterator.next();
41+
System.out.println("当前ref引用的对象:" + ref.get());
42+
}
43+
}
44+
1245
private static void test02() throws InterruptedException {
1346
ReferenceQueue refQueue = new ReferenceQueue();
1447

@@ -26,9 +59,10 @@ private static void test02() throws InterruptedException {
2659
// 确保gc程序执行
2760
Thread.sleep(1000);
2861

29-
System.out.println("gc 执行之前, ref引用的对象:" + weakReference.get());
62+
System.out.println("gc 执行之后, ref引用的对象:" + weakReference.get());
3063

3164
Reference ref = refQueue.poll();
65+
System.out.println("gc 执行之后, refQueue中是否有数据?" + (ref != null ? "有" : "没有"));
3266
System.out.println("referenceQueue 中获取的 ref与 weakReference中的是否一致?" + (ref == weakReference));
3367
}
3468
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.