}
class People{
public String name;
public int age;
public People(String name,int age) {
thisname=name;
thisage=age;
}
@Override
public String toString() {
return "[name:"+name+",age:"+age+"]";
}
}
输出结果:
[name:zhouqian,age:20]
null
第二个输出结果是null,这说明只要JVM进行垃圾回收,被弱引用关联的对象必定会被回收掉。不过要注意的是,这里所说的
被弱引用关联的对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象(软引用
也是如此)。
比如:将代码做一点小更改:
package yinyong;
import javalangrefWeakReference;
public class test {
public static void main(String[] args) {
People people=new People("zhouqian",20);
WeakReference<People>reference=new WeakReference<People>(people);//<span style="color:#FF0000;">关联强引用</span>
Systemoutprintln(referenceget());
Systemgc();
Systemoutprintln(referenceget());
}
}
class People{
public String name;
public int age;
public People(String name,int age) {
thisname=name;
thisage=age;
}
@Override
public String toString() {
return "[name:"+name+",age:"+age+"]";
}
}//结果发生了很大的变化
[name:zhouqian,age:20]
[name:zhouqian,age:20]
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到
与之关联的引用队列中。
4.虚引用(虚引用(PhantomReference))
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如
果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引
用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃
圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
import javalangrefPhantomReference;
import javalangrefReferenceQueue;
public class Main {
public static void main(String[] args) {
ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
Systemoutprintln(prget());
}
}
软引用和弱引用软引用和弱引用
对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既