java的引用分为四种,强引用,弱引用,软引用,虚引用。
强引用
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。
for example
Student stu=new Student();
这里的stu就是个强引用,就算内存溢出,jvm也不会回收它,如果我们想要回收它,那么就可以
stu=null;
这样,后面的new student()里的东西就会被JVM回收掉,当然stu这个变量还是存在的。
软引用
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
String s = new String("aa"); // 创建强引用与String对象关联,现在该String对象为强可达状态
SoftReference<String> softRef = new SoftReference<String>(s); // 再创建一个软引用关联该对象
s = null; // 消除强引用,现在只剩下软引用与其关联,该String对象为软可达状态
s = softRef.get(); // 重新关联上强引用
弱引用
在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
String str=new String("abc"); //强引用对象
WeakReference<String> abcWeakRef = new WeakReference<String>(str); //变为弱引用
str=null; //去强引用对象
String abc = abcWeakRef.get(); 再次变为强引用对象
虚引用
与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用一般是用来监测gc垃圾回收机制的,根据虚引用来监测gc是否正常等。