- 此程序t1线程未检查到 软引用进入引用队列
package du.zhen.proptype.T3;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Test5 {
@Override
protected void finalize() throws Throwable {
System.out.println(this.hashCode()+"即将被回收..");
}
@Override
public String toString() {
return this.hashCode()+"";
}
public static void main(String[] args) throws InterruptedException {
//WeakReference a = new WeakReference(new Date());
ReferenceQueue queue = new ReferenceQueue();
Thread t1 = new Thread(()->{
try {
System.out.println("监听开始。。。");
while (true){
Reference remove = queue.remove();
if (remove!=null)
System.out.println(remove.get()+"==========队列========"+remove.hashCode());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
// 软引用 垃圾回收时被加入队列中
SoftReference a1 = new SoftReference(new Test5(), queue);
SoftReference a2 = new SoftReference(new Test5(), queue);
SoftReference a3 = new SoftReference(new Test5(), queue);
SoftReference a4 = new SoftReference(new Test5(), queue);
SoftReference a5 = new SoftReference(new Test5(), queue);
// 制造内存溢出 OOM
List list = new ArrayList();
try {
while (true){
list.add(new Date());
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
- 此程序t1线程检查到 软引用进入引用队列
package du.zhen.proptype.T3;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Test5 {
@Override
protected void finalize() throws Throwable {
System.out.println(this.hashCode()+"即将被回收..");
}
@Override
public String toString() {
return this.hashCode()+"";
}
public static void main(String[] args) throws InterruptedException {
//WeakReference a = new WeakReference(new Date());
ReferenceQueue queue = new ReferenceQueue();
Thread t1 = new Thread(()->{
try {
System.out.println("监听开始。。。");
while (true){
Reference remove = queue.remove();
if (remove!=null)
System.out.println(remove.get()+"==========队列========"+remove.hashCode());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
// 软引用 垃圾回收时被加入队列中
SoftReference a1 = new SoftReference(new Test5(), queue);
SoftReference a2 = new SoftReference(new Test5(), queue);
SoftReference a3 = new SoftReference(new Test5(), queue);
SoftReference a4 = new SoftReference(new Test5(), queue);
SoftReference a5 = new SoftReference(new Test5(), queue);
// 制造内存溢出 OOM
List list = new ArrayList();
try {
while (true){
list.add(new Date());
}
} catch (Throwable e) {
e.printStackTrace();
}
//相较于前一段程序 只添加了这里的输出语句
System.out.println("验证 "+a1.get()+" "+a1.hashCode());
System.out.println("验证 "+a2.get()+" "+a2.hashCode());
System.out.println("验证 "+a3.get()+" "+a3.hashCode());
System.out.println("验证 "+a4.get()+" "+a4.hashCode());
System.out.println("验证 "+a5.get()+" "+a5.hashCode());
}
}