在Java内存区域中,我们知道栈帧中的局部变量表中存在一个reference类型数据,它存储了对象引用。通过reference,虚拟机可以在Heap中找到对象实例。
一、引用类
java.lang.ref
提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。
1.状态描述:
每个引用类都有四种相应的状态描述,分别为Active、Pending、Enqueued、Inactive,jvm可以通过引用引用状态进行查询,定位和处理。
关于这四种状态的详细信息可以查看源码中的解释,这里就不贴出来了。
2.引用类型
众所周知,Java有四种引用类型,分别为 强引用、软引用、弱引用、虚引用。每种类型从强到弱都有各自的可到达性。对于不同的引用类型,垃圾回收会选择不同的策略和时机回收对象。除了强引用外,其他的三种用例都需要在代码中显式的创建。
2.1 强引用(FinalReference)
new出来的对象都是强引用,强引用并没有具体的引用类,判定对象是否是强引用实际上由以下几点决定:
- 强引用可以直接访问目标对象。
- 强引用所指向的对象在任何时候都不会被系统回收。
- 强引用可能导致内存泄漏。
重写Object 中的finalize 方法,可以生成一个Finalizer 引用类,并将其add 进ReferenceQueue 的队列中,但是貌似并没有什么实际的意义。 |
2.5 对象可达性
从最强到最弱,不同的可到达性级别反映了对象的生命周期。在操作上,可将它们定义如下:
- 如果某一线程可以不必遍历所有引用对象而直接到达一个对象,则该对象是强可到达对象。
- 如果一个对象不是强可到达对象,但通过遍历某一软引用可以到达它,则该对象是软可到达对象。
- 如果一个对象既不是强可到达对象,也不是软可到达对象,但通过遍历弱引用可以到达它,则该对象是弱可到达对象。当清除对某一弱可到达对象的弱引用时,便可以终止此对象了。
- 如果一个对象既不是强可到达对象,也不是软可到达对象或弱可到达对象,它已经终止,并且某个虚引用在引用它,则该对象是虚可到达对象。
- 最后,当不能以上述任何方法到达某一对象时,该对象是不可到达 对象,因此可以回收此对象。
对象可达性原则:
- 单一路径中,以最弱的引用为准
- 多路径中,以最强的引用为准
这两条原则对于我们去分析引用链的依据。
二、参考资料
[1]. https://www.cnblogs.com/fordreamxin/p/5396785.html
[2]. https://www.jianshu.com/p/f86d3a43eec5
[3]. https://blog.youkuaiyun.com/myjcxd/article/details/68943044
[4]. https://blog.youkuaiyun.com/androidstar_cn/article/details/54710652
[5].http://tool.oschina.net/apidocs/apidoc?api=jdk-zh