java中四种引用强、软、弱、虚介绍,以及用到的场景

今天学习了java中四种引用:强、软、弱、虚引用,并介绍它们用到的场景

 

Q:介绍一下java中四种引用强、软、弱、虚介绍,以及用到的场景?

 

A:在jdk1.2之前版本中,若一个对象不能被任何变量引用,那么程序就无法使用这个对象,也就是说只有对象处于可触及状态下,程序才可以访问它,在jdk1.2之后,引入了四种引用类型,4种级别从高到第的顺序为:强引用、软引用、弱引用以及虚引用。

 

1. 强引用:所谓强引用就是像这种 Object obj=new Object(); 创建对象的方式就是强引用,对于任何对象来说只要还有强引用指向它,那么即使内存不够用,抛出OutOfMemoryError使程序异常终止,也不会回收该对象来解决内存不足的问题

强引用有以下几个特征:

  1. 强引用可以直接操作对象。
  2. 强引用所指向的对象在任何时候都不会被系统回收。
  3. 强引用可能导致内存泄漏。至于强引用的使用场景就是我们常见的new对象进行操作。

 

2.软引用:软引用(SoftReference)在强度上弱于强引用,通过SoftReference来实现。可以让对象避免一些垃圾收集,只有在内存不足时,才会试图回收软引用指向的对象。JVM会在进行OOM之前进行对软引用的回收,软引用可以和引用队列(ReferenceQueue)联合使用。当软引用被GC回收之后,该引用就会被加入到引用队列中,可以通过引用队列的poll操作来检查你所关心的对象是否被GC回收。

软引用有以下几点特征:

  1. 软引用可以使用get()方法取得对象的强引用来访问对象。
  2. 软引用所指向的对象按照内存的使用情况来绝对是否进行回收。
  3. 软引用可以避免内存不足时所导致的异常。

软引用的使用场景:比如用来实现内存敏感的缓存,如果有空闲空间就可以保留缓存,当内存不足时则可以清理缓存。这样就保证在使用缓存的同时不会耗尽内存。例如在你浏览一个网页时一个后退键,它是否会重新构建网页呢。

有两种解决方法:

  1. 将网页信息存储在内存中,这种方法会很耗费内存并且会有可能造成OOM。
  2. 将网页信息重新构建,这种方式效率会很低,每次后退都要重建网页。  这时就可以使用软引用,读取一个网页将它赋给一个软引用,当内存充足时,每次后退直接访问该软引用对象即可得到该网页;当内存不足时,则可以清除掉它,来避免OOM

 

3.弱引用:弱引用(WeakReference)在强度上弱于软引用。通过WeakReference来实现。它的作用是引用一个对象,但并不印象GC对该对象的回收。如果使用一个强引用的话,只要该引用存在,被引用的对象是不会被回收的。但是弱引用并没有这个问题。在垃圾收集器进行回收时,如果一个对象上的所有引用都是弱引用,则该对象会被GC回收掉,弱引用也可以和引用队列(ReferenceQueue)联用,如果一个弱引用对象被回收掉,则该引用会被加入引用队列中,也可以通过引用队列的poll()操作来检查你所关心的对象是否被GC回收掉。

弱引用有以下几个特点:              1.可以使用弱引用的get方法来获取该对象的强引用来对象该对象进行操作。            2.一旦该对象要被GC回收,无论内存是否够用该对象都会被GC回收掉。                  弱引用使用场景:当你想引用一个对象的时候,但是这个对象它有自己的生命周期,而你不想介入这个对象的生命周期,这时候就可以使用弱引用,这个引用不会在该对象被GC时的判断中产生任何附加性印象。                      用一个形象的例子来描述弱引用,就好比如‘城管’和‘小贩’,‘城管’就好比如GC,‘小贩‘就好比如弱引用,当城管遇到小贩,小贩肯定会被驱逐。

 

4.虚引用:虚引用(PhantomReference)在强度上弱于软引用,通过PhantomReference来实现,顾名思义虚引用就是‘形同虚设’,与其他引用不同虚引用并不会对对象产生任何的印象,甚至它不能通过get来获取对象的引用。如果一个对象仅持有虚引用,那么它就和没用任何引用一样,在任何时候都可能被垃圾收集器回收掉。            至于虚引用的使用场景:虚引用必须和引用队列联用,虚引用虽然不能提供它所引用对象的任何东西,     但是它不同于上面几种引用的地方是:上面几种引用只有在被GC回收掉之后才会被加入到引用队列,而虚引用却不同,当它所引用的对象调用了finalize方法时,就会被加入到引用队列中,何为finalize方法,该方法在对象被第一次GC时被调用,并且只会被调用一次。但是调用之后并不是立即就会被回收掉的,只是加入到了GC的回收队列中等待GC最终回收。因此程序可以通过判断引用队列中是否加入了虚引用,来了解被引用对象是否要被垃圾回收掉。如果程序发现某个虚引用已经被加入到引用队列中了,那么就可以在所引用的对象被回收之前采取一些程序行动。总而言之,可以用来跟踪对象被垃圾回收的过程,当一个虚引用关联的对象被GC回收之前,会收到一个通知。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值