弱参考
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReference.html
原理:weak reference与垃圾回收有关。通常,具有一个或多个 reference 的对象将不符合垃圾回收条件。
为weak reference时,上述原则不适用。如果一个对象对其他对象只有弱引用,那么它就可以进行垃圾回收了。
让我们看看下面的例子:我们有一个 Map 与 Objects 其中 Key 是引用一个对象。
import java.util.HashMap;
public class Test {
public static void main(String args[]) {
HashMap<Employee, EmployeeVal> aMap = new
HashMap<Employee, EmployeeVal>();
Employee emp = new Employee("Vinoth");
EmployeeVal val = new EmployeeVal("Programmer");
aMap.put(emp, val);
emp = null;
System.gc();
System.out.println("Size of Map" + aMap.size());
}
}
现在,在程序执行期间,我们制作了emp = null。持有密钥的Map 在这里没有意义,因为它是null。在上述情况下,对象没有被垃圾回收。
WeakHashMap
WeakHashMap 是在无法从Map 中检索条目时删除条目 (key-to-value mappings) 的位置。
让我用 WeakHashMap
来展示上面的例子
import java.util.WeakHashMap;
public class Test {
public static void main(String args[]) {
WeakHashMap<Employee, EmployeeVal> aMap =
new WeakHashMap<Employee, EmployeeVal>();
Employee emp = new Employee("Vinoth");
EmployeeVal val = new EmployeeVal("Programmer");
aMap.put(emp, val);
emp = null;
System.gc();
int count = 0;
while (0 != aMap.size()) {
++count;
System.gc();
}
System.out.println("Took " + count
+ " calls to System.gc() to result in weakHashMap size of : "
+ aMap.size());
}
}
输出: 采用20 calls to System.gc() 得到aMap size 的:0。
WeakHashMap 只有对键的弱引用,没有像其他 Map 类那样的强引用。尽管您使用了WeakHashMap,但当值或键被强引用时,您必须注意某些情况。这可以通过将对象包装在 WeakReference 中来避免。
import java.lang.ref.WeakReference;
import java.util.HashMap;
public class Test {
public static void main(String args[]) {
HashMap<Employee, EmployeeVal> map =
new HashMap<Employee, EmployeeVal>();
WeakReference<HashMap<Employee, EmployeeVal>> aMap =
new WeakReference<HashMap<Employee, EmployeeVal>>(
map);
map = null;
while (null != aMap.get()) {
aMap.get().put(new Employee("Vinoth"),
new EmployeeVal("Programmer"));
System.out.println("Size of aMap " + aMap.get().size());
System.gc();
}
System.out.println("Its garbage collected");
}
}
软引用。
Soft Reference 比弱引用稍强。软引用允许垃圾收集,但只有在没有其他选项时才请求垃圾收集器清除它。
垃圾收集器不会像处理弱可达对象那样积极地收集软可达对象——相反,它只会在它真的“需要”内存时才收集软可达对象。软引用是对垃圾收集器说的一种方式,“只要内存不太紧张,我想保留这个对象。但是如果内存变得非常紧张,继续收集它,我会处理接着就,随即。”垃圾收集器需要清除所有软引用才能抛出OutOfMemoryError。