最近我一直在考虑SoftReference在什么时候会被垃圾回收器回收,最初我以为发生FullGC的时候,软引用就会被清除,最近我发现并不是这样的。
下面就上代码来说明关于软引用被回收的时机:
public class SoftReferenceTest {
public static SoftReference<Student> studentSoftRef = new SoftReference<Student>( new Student(1, "张三"));
public static void main(String[] args) {
Runnable r1=()->{
while(true){
if(studentSoftRef.get()==null){
System.out.println("==="+studentSoftRef.get()+"===");
break;
}else {
System.out.println("==="+studentSoftRef.get()+"===");
}
}
};
Runnable r2=new Runnable() {
@Override
public void run() {
List<String> list=new ArrayList<>();
int index=1;
while(true){
list.add((index++)+"");
}
}
};
new Thread(r1).start();
new Thread(r2).start();
}
public static class Student
{ int id;
String name;
public Student(Integer id, String name)
{
this.id = id; this.name = name;
}
@Override public String toString()
{
return "[id=" + id + ",name=" + name + "]";
}
}
}
在r1中不停地去检验软引用对象是否被清除,在r2中不停地往堆内存中加对象进去,促使该线程发生OOM。
下面就来