引用的几种概念

赞一下!转了:

场景学习理解了一下:

SoftReference:实现非持久化缓存,允许在内存不足时,回收对象,缓存失效、内存复用。

PhantomReference必须要和ReferenceQueue组合使用,当虚引用的对象被回收器触及时,虚引用就会被放入队列,可以用虚引用作为一种通知机制。即编程人员可在引用被回收之前做点什么,感觉这个场景作用就像是Hook的作用。

WeaKReference: 试用于创建便宜但耗费大量内存的对象,在应用程序需要时使用,在需要内存需要GC时回收。


1.引用的基本概念
     1.1、强引用
     当我们使用new 这个关键字创建对象时被创建的对象就是强引用,如Object object = newObject() 这个Object()就是一个强引用了,如果一个对象具有强引用。垃圾回收器就不会去回收有强引用的对象。如当jvm内存不足时,具备强引用的对象,虚拟机宁可会报内存空间不足的异常来终止程序,也不会靠垃圾回收器去回收该对象来解决内存。
     1.2、软引用
    如果一个对象具备软引用,如果内存空间足够,那么垃圾回收器就不会回收它,如果内存空间不足了,就会回收该对象。当然没有被回收之前,该对象依然可以被程序调用。
     1.3、弱引用
     如果一个对象只具有弱引用,只要垃圾回收器在自己的内存空间中线程检测到了,就会立即被回收,对应内存也会被释放掉。相比软引用弱引用的生命周期要比软引用短很多。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存。
     1.4、虚引用
      如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被jvm当作垃圾进行回收。  
2jdk引用级别
     jdk1.2以前是没有这些概念,在jdk1.2以后的版本中才开始引入了引用的四种级别依次是,强引用、软引用、弱引用和虚引用。
    jdk中java.lang.ref.Reference类就是java引用抽象基类,reference定义了引用对象的操作。当然该类是与垃圾回收器配合使用的。
3、引用和队列的使用
     强引用一般是不会和队列一起使用的,这个过滤掉。
    软引用可以和一个引用队列来联合使用,一般软引用可以用来实现内存敏感的高速缓存,如果软引用的所引用的对象被垃圾回收,java虚拟机就会把引用入到与之关联的引用队列中去。
    弱引用和队列使用在一起,如果弱引用被所引用的对象回收了,java虚拟机就会把这个弱引用加入到关联的队列中去;
    虚引用,在java虚拟机回收虚引用时,会把这个虚引用放到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经引用了虚引用,来了解引用对象是否要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么可以在所引用的对象内存前,采取一些逻辑处理。
4jdk中的引用实现类
      代表软引用的类:java.lang.ref.SoftReference
    代表弱引用的类:java.lang.ref.WeakReference
     代表虚引用的类:java.lang.ref.PhantomReference
   他们同时继承了:java.lang.ref.Reference
  引用队列:java.lang.ref.ReferenceQueue,这个引用队列是可以三种引用类型联合使用的,以便跟踪java虚拟机回收所引用对象的活动。 

5、引用例子
   如何实现一个软引用?

   

  执行完这个软引用,那么jvm堆栈区会是什么样呢?

   

      当执行完gc时,软引用内存还很足时,gc不会清除引用的,所以上面程序执行后,内存空间就入这个图,如果当空间不足时,软引用就会自动加载到内存空间中去。

       

如何实现一个弱引用呢?

   

6、综合实例

     

在综合实例这里可以看到,三个引用依次都创建了10次,都包含了一个refobject对象,从打印结果可以明确看出,虚引用基本是形同虚设,它引用的对象随时会被垃圾回收器回收,具有弱引用的对象拥有的稍微长一点的生命周期,但垃圾回收器执行回操作时,依然有可能回被垃圾回收器回收,生命周期长的还是软引用。但在虚拟机内存不足的情况下依然会被回收,所以可出这些引用的方式真的不适合在线上使用,否则在极度容易出现鼓掌而在排查时很难检测出结果。

7、弱引用的WeakHashMap
   弱引用的jar路径java.util.WeakHashMap。它是弱引用为键实现的哈希表的map。在weakHashMap表某个键不正常时,将会自动移出那个不正常的键。如果对持有强引用的key,它就会一直存在。同时它也支持nullkeynullvalue。更精确地说,对于一个给定的key,其映射的存在并不阻止垃圾回收器对该key的回收,这就使该key可以被终止的,key被终止,然后垃圾回收器回收。回收某个key时,其条目从映射中也会被有效地移除,因此,该类的行为与其他的 Map 实现有所不同
     
接下来也看看实例。
     
创建一个key对象

     

      创建一个value对象

      

        测试对象

         

  运行结果看出来整出5的对象持有强引用被保留了下来

    

转自:youtian的分享

你可能感兴趣的:(引用的几种概念)