讲一讲强引用,软引用,弱引用,幻想引用(基本全部来自于即刻时间java核心面试精讲)
不同的引用类型,主要体现的是对象的不同可达性状态和对垃圾回收的影响。
1、强引用
就是我们普通的对象引用,如何还有一个强引用指向这个对象,就意味着这个对象还活着,垃圾收集器不会碰这种对象。对于一个普通对象只要超过了引用的作用域,或者强行将强引用赋值为null,就意味着可以被垃圾搜集了。
2、软引用
软引用是相对强引用弱化一点的引用,可以让对象豁免一些垃圾收集,只有当jvm认为内存不足时才会试图会收软引用对象。jvm会确保在抛出OutofMemory之前清理软引用对象。软引用通常来实现内存敏感的缓存,如果有空闲内存就保存缓存,内存不足时就清理掉。
3、弱引用
弱引用并不能使对象豁免垃圾回收,仅仅提供一种访问弱引用对象下的途径,可以用来构建没有特定约束的关系。
4、幻想引用
幻想引用并不能通过它来访问对象,幻想引用提供了对象被finalize后,做某些事的机制。比如利用幻想引用监控对象的创建与销毁。
二.、对象的可达性状态
1.强可达
就是当一个对象可以有一个或多个线程可以不通过各种引用访问到的情况。比如,我们新创建一个对象,那么创建它的线程对它就是强可达。
2软可达
就是当我们只能通过软引用才能访问到对象的状态
3弱可达
类似前面提到的,就是无法通过强引用或者软引用访问,只能通过弱引用访问时的状态。这是十分临近 finalize 状态的时机,当弱引用被清除的时候,就符合 finalize 的条件了。
4幻想可达
上面流程图已经很直观了,就是没有强、软、弱引用关联,并且 finalize 过了,只有幻象引用指向这个对象的时候。
5不可达
三具体的引用知识可以看看这篇文章https://blog.csdn.net/androidstar_cn/article/details/54710652