java之软引用

一、java中的四种引用简介
1、强引用:创建对象的引用,GC抛出OOM也不回收内存
2、软引用:在OOM之前回收内存
3、弱引用:在GC发现之后释放内存
4、虚引用(幽灵引用):使用后就释放
二、软引用的使用
1、用途:软引用是主要用于内存敏感的高速缓存,在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内溢出。
2、引用的选择机制:heap中对象有强可及对象、软可及对象、弱可及对象、虚可及对象和不可到达对象。应用的强弱顺序是强、软、弱、和虚。对于对象是属于哪种可及的对象,由他的最强的引用决定。
public class SoftRefrenceDemo2 {
	public static void main(String[] args) {
		String abc=new String("abc");  //1   
		SoftReference<String> abcSoftRef=new SoftReference<String>(abc);  //2   
		WeakReference<String> abcWeakRef = new WeakReference<String>(abc); //3   
		abc=null; //4   只有将对象设置为null,才可以创建软引用对象
		abcSoftRef.clear();//5
	}
}
下面是创建软用的demo:
public class SoftRefrenceDemo {
	public static void main(String[] args) {// 是否可以创建一个软引用对象A?
		A obj = new A();
		SoftReference<A> sf = new SoftReference<A>(obj);
		// obj = null;// 2、只有将obj设置为null才可以实现软引用对象的创建 ?
		if(sf!=null) {
			obj = sf.get();
		} else {
			obj = new A();
			sf = new SoftReference<A>(obj);
		}
	}
}


class A {
	
}
3、浏览器实现后退功能:当按浏览器上的后退键时是从缓存中取出数据还是重新构建呢?看下面两种实现策略及问题
(1)如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建
(2)如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出
  所以使用软引用来实现浏览器的缓存可以解决上面的两个问题。
public class SoftRefrenceDemo3 {// js里面有一个goBack()?


	public static void main(String[] args) {
		Browser prev = new Browser(); // 获取页面进行浏览
		SoftReference<Browser> sr = new SoftReference<Browser>(prev); // 浏览完毕后置为软引用
		if (sr != null) {
			prev = (Browser) sr.get(); // 还没有被回收器回收,直接获取
		} else {
			prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了
			sr = new SoftReference<Browser>(prev); // 重新构建
		}
	}
}


class Browser {
	
}
三、弱引用的demo
public class WeakRefrenceDemo {
	
	// 当GC遇到弱可及的对象时,会及时回收该对象
	public static void main(String[] args) {
		String abc=new String("abc");    
		WeakReference<String> abcWeakRef = new WeakReference<String>(abc);    
		abc=null;    
		System.out.println("before gc: "+abcWeakRef.get());    
		System.gc();    
		System.out.println("after gc: "+abcWeakRef.get());  
	}

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。