java 的引用类型

时间:2020-12-01 16:16:15
public class Demo {

public static void main(String[] args) {

/*
* 1.强引用(StrongReference)
* 我们平常用一个变量 接收 新创建的对象 都是强引用 只要对象有一个强引用 垃圾回收机制 绝不会回收这个对象
* 例如 A a = new A();
* 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
*/

String s = new String("abc");
/*
* 2.软引用(SoftReference)
* 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;
* 如果内存空间不足了,就会回收这些对象的内存。
* 只要垃圾回收器没有回收它,该对象就可以被程序使用。
*/

SoftReference<String> softReference = new SoftReference<>(s);

/*
* 3.弱引用 (WeakReference)
* 垃圾回收器一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
*/
WeakReference<String> weakReference = new WeakReference<>(s);

//当 清除强引用和软引用时 new String("abc")这个对象 只被弱引用 所以这个对象被称为弱可及对象
s = null;
softReference.clear(); //清除软引用
//System.gc();

System.out.println("软引用:"+softReference.get());
System.out.println("弱引用:"+weakReference.get());
}
}

这个时候打印的信息是

软引用:null

弱引用:abc


然后把 System.gc()那行注释打开 

这个时候打印的信息是

软引用:null

弱引用:null