Java对象引用类型
强引用
软引用
弱引用
虚引用
强引用
根对象直接引用的对象就被称为强引用。
常见的根对象包括Universe相关对象,本地方法创建的全局对象,方法栈中的对象等等
软引用&弱引用
-
相同点
都是没有被根对象直接引用的对象;都可以和引用队列联合使用,当软/弱引用所引用的对象被垃圾回收时,JVM就会把这个弱引用加入到与之关联的引用队列中 -
不同点
垃圾回收时,如果没有强引用直接引用的话,弱引用会直接被垃圾回收;软引用在内存不足时会被回收 -
常用场景
比如某些数组申请内存过大,如果不回收的话会始终占用大量内存资源,那么就可以使用软引用&弱引用,在内存过大时自动回收,等到在需要的时候再开辟内存
API:
软引用:SoftReference
弱引用:WeakReference
引用队列:ReferenceQueue
虚引用
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。
程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。