什么叫引用?
引用就是一个存放地址的空间,该地址是实际对象在内存中的地址。
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否引用链可
达,判定对象是否存活都和“引用”离不开关系。
提供四种引用的目的
- 可以让程序员通过代码的方式决定某些对象的生命周期。
- 有利于JVM进行垃圾回收。
四种引用
强引用
指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系,在强引用中,只要这种关系存在,垃圾回收器就永远不会回收被引用的对象。
注意:强引用在任何时候都不会被jvm回收,即使抛出OutOfMemoryError。
eg: Object object= new Object();
软引用
指用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。
一个对象只具有软引用,如果内存空间足够,那垃圾回收器就不会回收它;但是如果内存空间不足,就会回收这些对象的内存。
弱引用
弱引用也是用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
举例:
public class Main {
public static void main(String[] args) {
WeakReference<Student> reference=new WeakReference<Student>(new Student("千千",20));
System.out.println(reference.get());
System.gc();//通知jvm回收资源
//需要判断它是否已经被回收,如果reference.get()为null,就是已经被回收了
System.out.println(reference.get());
}
}
class Student{
public String name;
public int age;
public Student(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "[name:"+name+",age:"+age+"]";
}
}
注:gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收,并不会保证一定会被回收
输出:
此时,第二次输出为null,表示已经被回收,表明当jvm进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
虚引用
虚引用是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。
虚引用必须和引用队列一起使用
ReferenceQueue queue = new ReferenceQueue ()
PhantomReference pr = new PhantomReference (object, queue);
例子:
public static void main(String[] args) {
ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("回收"), queue);
//回收 pr.get()
System.out.println(pr.get()); //输出为:null
}
浅谈,浅了解~