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());
	}

}

时间: 2024-11-10 01:12:30

java之软引用的相关文章

闲来无事,用Java的软引用写了一个山寨的缓存

闲来无事,用Java的软引用写了一个山寨的缓存 博客分类: java基础 众所周知java中的引用分为 StrongReference.SoftReference.WeakReference.PhantomReference.这几种引用有不同那个的 使用场景,平时我们用的最频繁的也就是StrongReference也就是说形如之这样的引用: Object obj = new Object(); 这种引用就是所谓的强引用,如果此对象没有引用指向它,并且活着的线程无法访问到它(针对垃圾孤岛而言),那

android Listview 软引用SoftReference异步加载图片

首先说一下,android系统加载大量图片系统内存溢出的3中解决方法: (1)从网络或本地加载图片的时候,只加载缩略图.这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以图片失真比较严重,对于对图片质量要求很高的应用,可以采用下面的方法 /** *按照图片路径加载 *@param path图片资源的存放路径 *@param scalSize缩小的倍数 *@return */ public static Bitmap loadResBitmap(String path

java对象的强引用,软引用,弱引用和虚引用

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题.一般都是new出来的. Object o=new

Java之强引用、 软引用、 弱引用、虚引用

1.强引用   平时我们编程的时候例如:Object object=new Object():那object就是一个强引用了.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题. 2.软引用(SoftReference)   如果一个对象只具有软引用,那就类似于可有可物的生活用品.如果内存空间足够,垃圾回收器就不会回收它,如果

Java 强引用、 软引用、 弱引用、虚引用

 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用.下图为对象应用类层次. ⑴强引用(StrongReference)   强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内

java中虚引用PhantomReference与弱引用WeakReference(软引用SoftReference)的差别

之前的这篇博客介绍了java中4种引用的差别和使用场景,在最后的总结中提到: "软引用和弱引用差别不大,JVM都是先把SoftReference和WeakReference中的referent字段值设置成null,之后加入到引用队列:而虚引用则不同,如果某个堆中的对象,只有虚引用,那么JVM会将PhantomReference加入到引用队列中,JVM不会自动将referent字段值设置成null".这段总结写的比较仓促,也没有给出实际的例子加以佐证.本文主要是重申下这几种引用的差别,并

Java 强引用,软引用,弱引用

1.强引用 public void handleMessage(Message msg) { case FAIL: GoplayException mException = new GoplayException(); setVideoUrlFailReason(mException); mListener.onFailed(mException); break; } protected void setVideoUrlFailReason(GoplayException mResult) {

关于java内存泄露的总结--引用的类型:强引用,弱引用,软引用

今天面试了一家公司的java开发方面的实习生,被问到一个问题:如何处理java中的内存泄露问题,保证java的虚拟机内存不会被爆掉,当时其实觉得面试官的问题有点泛,所以也没有很好领会他的意思,答案也不是很准确,后来回去查了下资料,大概明白面试官要问的东西是什么(尴尬,才反应过来),然后,也特地简单总结下java内存溢出的相关内容,以备之后复习. 一.什么情况下会java内存泄露? java不是有GC吗?为毛还会内存泄露?之前我也一直以为,java有垃圾回收器在,估计内存泄露的情况一般不会发生吧?

[转]Java 的强引用、弱引用、软引用、虚引用

1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮助垃圾收集器回收此对象 显式地设置o为null,或超出对象的生命周期范围,则gc认为该对象不