java中的引用

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


对象可达状态:

在强引用之外,弱引用可以泛化成多种不同强度的弱指针。     

以引用强度为顺序的回收可以为每种强度级别关联一个正整数。对于给定的整数 a>0,

如果从根出发存在一条指针链可以到达某一对象,且该指针链重点的所有指针强度均不小于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 手动实现置空

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容