Java内存储器管理SoftReference 和 WeakReference

Java内存管理SoftReference 和 WeakReference

今天在看工程源码的时候看到了SoftReference这个类。

用来缓存我们软件的一些图片,好奇。就看了看这个类的作用。

 

首先这篇文章要讲的是两个内存管理相关的类WeakReference和SoftReference。

 

首相SoftReference的用处是增强一个引用常驻在内存的能力。也就是说一个引用比如A a=new A();

此时如果你把a=null;那么在不久之后的某个时间点,java虚拟机的内存回收机制就会把这个引用所占用的内存释放掉。

 

如果有时候,我们想让一个引用常驻内存而不是被回收,则可以用到softreference,比如上文的a引用。

用:SoftReference sr=new SoftReference(a);

 

这段代码就可以让a引用常驻内存,不会被回收。那可能就有疑问了,如果空引用也不回收那么内存很容易就溢出了。但是softreference可以保证 在抛出OutOfMemory异常之前会让虚拟机回收那些已经为空的引用,防止异常的发生。这就是softreference大概的用处。

 

概括起来就是:用于实现一些常用资源的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory异常。

 

weakReference一般用来防止内存泄漏,要保证内存被VM回收 

 

WeakReference,暂时我所了解的用处是当你想知道被设置为空的引用什么时候被回收时可以用到WeakReference。在代码上与SoftReference的用法是一样的。下面试一段简单的Demo代码

 

 

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class Test {
	
	public static void main(String[] args) throws InterruptedException
	{
		A a=new A();
		a.test();
		
		WeakReference wr=new WeakReference(a);
		//SoftReference sr=new SoftReference(a);
		a=null;
		while(true)
		{
		if(sr.get()!=null)
		{
			System.out.println("还没有被清楚");
		}else
		{
			System.out.println("已经被清除了");
			break;
		}
		
	}
	}
}


class A{
	public void test()
	{
		System.out.println("I am A");
	}
}