引用及其相关

引用

    每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”。在 Java 中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(reference)。

//创建一个引用,引用可以独立存在,并不一定需要与一个对象关联
String s;
//通过将这个叫“引用”的标识符指向某个对象,之后便可以通过这个引用来实现操作对象了。
s = "abc";

    Java 中的垃圾回收机制在判断是否回收某个对象的时候,都需要依据“引用”这个概念。在不同垃圾回收算法中,对引用的判断方式有所不同。

  • 引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加1,当引用失效时,计数器就减1,当计数器为0时,则认为该对象可以被回收了。
  • 可达性分析算法:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。

强引用(StrongReference)

    最常见的引用方式,例如:String s = “a”,变量s就是字符串"a"的强引用,只要强引用存在,垃圾回收器就不会回收这个对象。

软引用(SoftReference)

    如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。这种特性常常被用来实现缓存技术。
    在软引用没有被回收的时候SoftReference类所提供的get()方法返回对象的强引用,一旦垃圾线程回收该Java对象之后,get()方法将返回null。

弱引用(WeakReference)

    具有弱引用的对象拥有短暂的生命周期。当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。
    WeakReference类只有构造方法。

虚引用(PhantomReference)

    顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。
    虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。
    PhantomReference类的get方法永远返回null。

引用队列(ReferenceQueue)

    引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值