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 手动实现置空