Java中的引用有哪些


java中提供了4个级别的引用:`强引用`、`软引用`、`弱引用`、`虚引用`
除了强引用外,其他三种引用都可以在`java.lang.ref`包中找到他们。

 

从上面的图中可以看到,程序员可以在开发中直接使用他们,其中`FinalReference`意味着最终引用,它用以实现对象的`finalize`方法。

强引用就是程序使用的一般的引用类型,强引用的对象是可以触及的,不会被回收。相对的,软引用、弱引用、虚引用的对象是软可触及、弱可触及、虚可触及,在一定的条件下,都是可以回收的。

# 强引用
1.强引用的例子

    StringBuffer str=new StringBuffer("frank");
假设以上代码是在函数体内运行的,那么局部变量`str`将会被分配到栈上,而对象`StringBuffer`实例将会被分配到堆上。局部变量`str`指向`StringBuffer`实例所在的堆空间,通过`str`可以操作该实例,那么`str`就是`StringBuffer`实例的强引用。
 image

2.软引用---可被回收的引用

/*这个程序描述的是软引----可以被回收的引用*/
package com.frank.java.jvm.p71;

import java.lang.ref.SoftReference;

public class Reference {
    public static class User{
	private int id;
	private String name;
	public void SetID(int self)
	{
	    id=self;
	}
	public int GetID()
	{
	    return id;
	}
	public void SetName(String self)
	{
	    name=self;
	}
	public String GetName()
	{
	    return name;
	}
	public User(int id,String name)
	{
	    this.id=id;
	    this.name=name;
	}
	public String toString()
	{
	    return "User ID="+id+", and User name is '"+name+"'";
	}
    }
    public static void main(String[] args) {

	User u=new User(22, "frank");//u变量是强引用,
	SoftReference< User> userSoftRef=new SoftReference<Reference.User>(u);//通过强引用u创建软引用
	u=null;//去除强引用
	System.out.println(userSoftRef.get());//从软引用中重新获得强引用对象
	//get方法 是获取对象的引用
	System.gc();//进行垃圾回收
	System.out.println("After GC:");
	System.out.println(userSoftRef.get());//清理垃圾之后,从软引用中重新获得强引用对象
	
	try {
	    byte[] b=new byte[1024*890*7];//分配一块较大的内存
	} catch (Exception ex) {
	    ;
	}		
	System.gc();
	System.out.println("After GC:");
	System.out.println(userSoftRef.get());//再次从软引用中重新获得强引用对象
    }
}

Java中的引用有哪些_第1张图片

3.弱引用---发现即回收

弱引用是一种比软引用较弱的引用类型。系统在GC时,只要发现弱引用,不管系统堆空间使用情况如何,都会讲对象进行回收,但是由于垃圾回收器的线程通常优先级很低,因此并不一定能很快的发现持有弱引用的对象。在这种情况下,弱应用对象可以保存较长的时间,一旦一个弱引用对象被垃圾回收器回收,便会加入到一个注册的引用队列中去。弱引用使用java.lang.WeakReference

package com.frank.java.jvm.p71;

import java.lang.ref.WeakReference;

public class WeakReferenceTest {
    public static class User{
  	private int id;
  	private String name;
  	public void SetID(int self)
  	{
  	    id=self;
  	}
  	public int GetID()
  	{
  	    return id;
  	}
  	public void SetName(String self)
  	{
  	    name=self;
  	}
  	public String GetName()
  	{
  	    return name;
  	}
  	public User(int id,String name)
  	{
  	    this.id=id;
  	    this.name=name;
  	}
  	public String toString()
  	{
  	    return "User ID="+id+", and User name is '"+name+"'";
  	}
      }
    public static void main(String[] args) {
	User u=new User(22, "frank");
	WeakReference<User> userWeakRef=new WeakReference<User>(u);//创建弱引用
	u=null;//清楚强引用
	System.out.println(userWeakRef.get());//获取引用对象
	System.gc();
	//不管当前内存空间足够与否,都会回收它的垃圾
	System.out.println("After GC:");
	System.out.println(userWeakRef.get());//再次获取强引用对象
    }
}
Java中的引用有哪些_第2张图片

软引用和弱引用都非常适合保存那些可有可无的缓存数据。

4.虚引用---后面补上

你可能感兴趣的:(Java中的引用有哪些)