- 简单来说就是 Object obj = null 清理对象
- 复杂来说
- 1. Reference
- 2.PhantomReference
- 3. FinalReference(private 级、想操作可以com.google.common.base.internal包下的Finalizer )
- 4. SoftReference
- 5. WeakReference
- 代码的实际应用
内容范围:
这个抽象类,是引用对象的抽象基类。定义了所有引用对象共同的操作,引用对象与垃圾收集器密切配合实现,所以该类可能不会被直接子类化。 public abstract class Reference{...}
内部结构:
在收集者确定其指示物可能被回收之后排入队列的Phantom引用对象。 幻像(虚)引用最常用于以比Java完成机制可能更灵活的方式安排事先清理操作。 如果垃圾收集器在某个时间点确定幻像引用的引用是phantom reachable ,那么在那个时间或稍后的时间,它将引入引用。 为了确保可回收对象保持原样,可能无法检索幻像引用的引用:虚幻引用的get方法始终返回null 。 与软弱引用不同,幻像引用在垃圾收集器排入队列时不会自动清除。 通过幻影引用可访问的对象将一直保持到所有这样的引用被清除或者自身变得不可访问。 public class PhantomReferenceextends Reference {...}
内部结构:
Package-private; must be in same package as the Reference class 最终引用,用于实现终结 class FinalReferenceextends Reference {} 此 final 子类 final class Finalizer extends FinalReference
内部结构:
4. SoftReference软引用对象,由垃圾收集器根据内存需求自行清除。 软引用通常用于实现内存敏感缓存。 假设垃圾收集器在某个时间点确定对象是softly reachable 。 那时候,它可能会选择原子地清除对该对象的所有软引用,以及对任何其他可轻松访问的对象的所有软引用,该对象可以通过一个强引用链来访问该对象。 在同一时间或稍后的时间,它将排入在引用队列中注册的新清除的软引用。 在虚拟机抛出OutOfMemoryError之前,所有软引用对象可以保证被清除。 否则,在清除软引用的时间或者对一组对不同对象的引用将被清除的顺序没有约束。 但是,鼓励虚拟机实现偏离清除最近创建或最近使用的软引用。 此类的直接实例可用于实现简单的缓存; 此类或派生子类也可用于较大的数据结构以实现更复杂的高速缓存。 只要软引用的指示是强有力的,即实际使用中,软参考将不会被清除。 因此,复杂的缓存可以例如阻止其最近使用的条目被丢弃,通过保持对这些条目的强烈的指示,使剩余的条目由垃圾收集器判断丢弃。 public class SoftReferenceextends Reference {...}
内部结构:
弱参考对象,不会阻止其指定对象的最终确定,最终确定,然后被回收。 弱引用最常用于实现规范化映射。 假设垃圾收集器在某个时间点确定对象是weakly reachable 。 那时,它将原子地清除对该对象的所有弱引用,以及所有弱引用到任何其他弱可触及的对象,通过一连串强软引用可以从该对象到达该对象。 同时,它将声明所有以前弱可触及的对象都是可以确定的。 在同一时间或稍后的时间,它将排列在引用队列中注册的新清除的弱引用。 public class WeakReferenceextends Reference {...}
内部结构:
这里就直接贴个测试代码,看大家领悟了…
// todo 这个是list集合中运用,可用于定时跑一些大数据量的数据操作
ArrayList objects = new ArrayList<>(3);
ArrayList> objects2 = new ArrayList<>(4);
WeakReference> aWeakReference = new WeakReference<>(objects);
objects2.add(aWeakReference.get());
System.out.println("------------ ^ -------------");
objects2.stream().forEach(System.out::println);
A a = new A();
A a1 = new A();
A a2= new A();
objects.add( a);
objects.add( a1);
objects.add( a2);
System.out.println("------------ ^ -------------");
objects.forEach(System.out::println);
System.out.println("-------------------------");
objects2.forEach(it -> {
it.forEach(System.out::println);
});
System.out.println("-------------------------");
aWeakReference.get().forEach(System.out::println);
System.out.println("-------------------------");
System.out.println("------------ clean -------------");
objects.clear();
System.gc();;
objects.forEach(System.out::println);
System.out.println("-------------------------");
objects2.forEach(it -> {
it.forEach(System.out::println);
});
System.out.println("-------------------------");
aWeakReference.get().forEach(System.out::println);
System.out.println("-------------------------");
// todo 上面同下,再来个Map、 List组合应用 HashMapobjects = new HashMap (3); ArrayList > objects2 = new ArrayList<>(4); WeakReference > aWeakReference = new WeakReference<>(objects); objects2.add(aWeakReference.get()); objects2.stream().forEach(item -> { item.forEach((k, v) -> System.out.println(k + " : " + v)); }); System.out.println("------------ ^ -------------"); A a = new A(); A a1 = new A(); A a2= new A(); objects.put(1, a); objects.put(2, a1); objects.put(3, a2); objects.forEach((k, v) -> System.out.println(k + " : " + v)); System.out.println("-------------------------"); objects2.stream().forEach(item -> { item.forEach((k, v) -> System.out.println(k + " : " + v)); }); System.out.println("-------------------------"); aWeakReference.get().forEach((k, v) -> System.out.println(k + " : " + v)); System.out.println("-------------------------"); System.out.println("------------ clean -------------"); objects.clear(); System.gc();; objects.forEach((k, v) -> System.out.println(k + " : " + v)); System.out.println("-------------------------"); objects2.stream().forEach(item -> { item.forEach((k, v) -> System.out.println(k + " : " + v)); }); System.out.println("-------------------------"); aWeakReference.get().forEach((k, v) -> System.out.println(k + " : " + v)); System.out.println("-------------------------");
这一行,争渡争渡



