《深入理解Java虚拟机》(二):Java对象引用


Java内存区域中,我们知道栈帧中的局部变量表中存在一个reference类型数据,它存储了对象引用。通过reference,虚拟机可以在Heap中找到对象实例。

一、引用类

java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。

这里写图片描述

1.状态描述:

每个引用类都有四种相应的状态描述,分别为Active、Pending、Enqueued、Inactive,jvm可以通过引用引用状态进行查询,定位和处理。

这里写图片描述
关于这四种状态的详细信息可以查看源码中的解释,这里就不贴出来了。

2.引用类型

众所周知,Java有四种引用类型,分别为 强引用、软引用、弱引用、虚引用。每种类型从强到弱都有各自的可到达性。对于不同的引用类型,垃圾回收会选择不同的策略和时机回收对象。除了强引用外,其他的三种用例都需要在代码中显式的创建。

2.1 强引用(FinalReference)

new出来的对象都是强引用,强引用并没有具体的引用类,判定对象是否是强引用实际上由以下几点决定:

  1. 强引用可以直接访问目标对象。
  2. 强引用所指向的对象在任何时候都不会被系统回收。
  3. 强引用可能导致内存泄漏。
思考:
重写Object中的finalize方法,可以生成一个Finalizer引用类,并将其addReferenceQueue的队列中,但是貌似并没有什么实际的意义。
### 2.2 软引用(SoftReference) ```java //reQueue更多的意义是进行监视的作用 ReferenceQueue reQueue =new ReferenceQueue<>(); SoftReference reference = new SoftReference("abc",reQueue); ``` 软引用需要使用引用类`SoftReference`初始化,在内存不足时,GC会先释放`abc`,然后将`reference`放入`queue`中等待回收。 ### 2.3 弱引用(WeakReference) ```java //reQueue更多的意义是进行监视的作用 ReferenceQueue reQueue =new ReferenceQueue<>(); WeakReference reference = new WeakReference("abc",reQueue); ``` 弱引用需要使用引用类`WeakReference`初始化,不管内存是否足够,GC会直接释放`abc`,并且将`reference`放入`queue`等待回收。 ### 2.4 虚引用(PhantomReference) ```java //PhantomReference必须和ReferenceQueue一起使用 ReferenceQueue reQueue =new ReferenceQueue<>(); PhantomReference reference = new PhantomReference("abc",reQueue); ``` 虚引用必须和引用队列(ReferenceQueue)一起使用,不会被GC自动清理,直到所有该对象所有的虚引用都被清除,或者它们都变得不可到达,才会被清理。

2.5 对象可达性

从最强到最弱,不同的可到达性级别反映了对象的生命周期。在操作上,可将它们定义如下:

  • 如果某一线程可以不必遍历所有引用对象而直接到达一个对象,则该对象是强可到达对象。
  • 如果一个对象不是强可到达对象,但通过遍历某一软引用可以到达它,则该对象是软可到达对象。
  • 如果一个对象既不是强可到达对象,也不是软可到达对象,但通过遍历弱引用可以到达它,则该对象是弱可到达对象。当清除对某一弱可到达对象的弱引用时,便可以终止此对象了。
  • 如果一个对象既不是强可到达对象,也不是软可到达对象或弱可到达对象,它已经终止,并且某个虚引用在引用它,则该对象是虚可到达对象。
  • 最后,当不能以上述任何方法到达某一对象时,该对象是不可到达 对象,因此可以回收此对象。

这里写图片描述
对象可达性原则:

  1. 单一路径中,以最弱的引用为准
  2. 多路径中,以最强的引用为准

这两条原则对于我们去分析引用链的依据。

二、参考资料

[1]. https://www.cnblogs.com/fordreamxin/p/5396785.html
[2]. https://www.jianshu.com/p/f86d3a43eec5
[3]. https://blog.csdn.net/myjcxd/article/details/68943044
[4]. https://blog.csdn.net/androidstar_cn/article/details/54710652
[5].http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值