0.强引用和弱引用
⑴强引用(StrongReference)
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
⑵软引用(SoftReference)
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。
1. Java中的SoftReference
即对象的软引用。如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。使用软引用能防止内存泄露,增强程序的健壮性。
SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之后,get()方法将返回null。
2.Eoe源码中使用SoftwareReference的核心代码:
import java.lang.ref.SoftReference;
private static LinkedHashMap<String, SoftReference<String>>RequestCache = new LinkedHashMap<String, SoftReference<String>>(
20);
private static void putStringForSoftReference(String requestUrl,
String result) {
SoftReference<String> referece = newSoftReference<String>(result);
RequestCache.put(requestUrl, referece);
}
private static String getStringFromSoftReference(String requestUrl) {
if (RequestCache.containsKey(requestUrl)) {
SoftReference<String> reference = RequestCache.get(requestUrl);
String result = (String) reference.get();
if (result != null && !result.equals("")) {
return result;
}
}
return "";
}
3.例子
import java.lang.ref.SoftReference;
import java.util.HashMap;
/*
* java.lang.ref
类 SoftReference<T>
java.lang.Object
java.lang.ref.Reference<T>
java.lang.ref.SoftReference<T>
Constructor Method:
SoftReference(T referent)
创建引用给定对象的新的软引用。
* */
public class SoftReferenceDemo {
public static void main(String []args){
HashMap<String,SoftReference<People>> hm = new HashMap<String,SoftReference<People>>();
People people1 = new People("China","zhangshan");
People people2 = new People("America","Tom");
for(int i = 0 ; i<50000; i++);
SoftReference<People> sr1 = new SoftReference<People>(people1);
SoftReference<People> sr2 = new SoftReference<People>(people2);
hm.put("1", sr1);
hm.put("2", sr2);
//get Object from SoftReference
if(hm.containsKey("1")){
SoftReference<People> pr = hm.get("1");
People p = pr.get();//返回Java对象的强引用
/*SoftReference类所提供的get()方法返回Java对象的强引用。
* 另外,一旦垃圾线程回收该Java对象之后,get()方法将返回null
* */
if(p != null){//
System.out.println("country:" + p.getCountry());
System.out.println("name:" + p.getName());
}else{
System.out.println("This People Object has be recycled!");
}
}
}
public static class People{
private String country;
private String name;
public People(String country,String name){
this.country = country;
this.name = name;
}
public void finalize(){
System.out.println(name + "is recycled...");
}
public void setCountry(String str){
this.country = str;
}
public void setName(String str){
this.name = str;
}
public String getCountry(){
return this.country;
}
public String getName(){
return this.name;
}
}
}
运行结果:
country:China
name:zhangshan