各种引用

Java 中除了强引用之外,还提供了其它低级别的引用

对象可达状态:

      如果一个对象的引用权重为a,指向这个对象的所有指针链中任意一条指针链的权重不小于a,则称这个对象a可达

                强可达:必然有一条是强引用

      软可达:通过软引用实现,不保证gc回收时置空,jvm保证 OutOfMemery之前回收

      弱可达:通过弱引用实现,gc下次时置空弱引用,回收

      虚可达:无法通过get()方法获取到引用的对象,gc不负责引用置空,需手动实现

          特殊:如果对象中实现了finalize()方法,jvm会为该对象创建FinalReference引用,一般用于保底操作(回收资源等),建议手动提前回收资源。

       当gc扫描时,发现相应的引用时,把引用放入链表中

    ①jvm把引用放到discovered或者pending

② 判断对象无强引用时,如果判断该对象需要回收,把相应引用置空,对象成不可达状态,

把discoved中引用放入pending链表中

③ Reference中线程Reference Handler处理pending链表,

  3.1 如果是Cleaner(PhantomReference子类),直接调用clean()方法

  3.2 把引用放入到自己的ReferenceQueue中。

4  不同级别的引用对自己的队列做不同处理

   4.1  Finalizer(FinalReference) 调用Finalizer()方法,并且调用super.clear()置空引用

  4.2 SoftReference 手动实现置空

  4.3 weakReference 手动实现置空

原文地址:https://www.cnblogs.com/toUpdating/p/9088424.html