引用

2018-05-29  本文已影响0人  哎呦呦胖子斌

强引用(StrongReference)

        强引用是最常用的引用类型,当使用new关键字去新建一个对象的时候,创建的就是强应用。当一个对象具有强引用,那么垃圾回收器是绝对不会回收和销毁它的,对象的强应用可以在程序中到处传递,很多情况下,会同时有多个引用指向同一个对象。

软引用(SoftReference)

        软引用可以理解成一种稍强的弱引用,区别在于:如果一个对象只具有软引用,若内存空间足够,垃圾回收器就不会回收它,如果内存空间不足,才会回收这些对象的内存。而只具有弱引用的对象拥有更短的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。

         从表面上看,软引用非常适合用于创建缓存,当系统内存不足时,缓存中的内容是可以被释放掉的,但在实践中,使用软引用作为缓存时效率是比较低的,系统并不知道哪些软引用指向的对象应该被回收,哪些应该被保留。

         软引用的声明借助强引用或者匿名对象,使用泛型SoftReference,可以使用get方法获得强引用

弱引用(WeakReference)

        弱引用可以用来实现一些规范化映射,其中Key或者value当它们不再被引用时可以自动被回收。当你想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候就用弱引用。这个引用不会再对象的垃圾回收判断中产生任何附加的影响。

         弱引用的声明借助强引用或者匿名对象,使用泛型WeakReference<T>

虚引用(PlantomReference)

        虚引用和弱引用一样也不会介入引用对象的生命周期,虚引用用来调度一些预验清理动作,提供比java清理机制更灵活的处理方式,虚引用比较特殊,他的get方法总是返回null,所以你得不到他引用的对象。他保存referencequeue中的轨迹,允许你知道对象何时从内存中移除。

         一个只被虚引用持有的对象可能会在任何时候被GC回收,虚引用对对象的生命周期完全没有影响,也无法通过虚引用来获取对象实例,仅仅能在对象被回收时,得到一个系统通知。

         Java的Object类里有个finalize方法,它的工作原理是:一旦垃圾回收器准备好释放掉对象占用的内存空间,将首先调用其finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,但问题在于,虚拟机不能保证finalize何时被调用,因为GC得运行时间是不固定的。

         使用虚引用可以解决这个问题,虚引用主要用来跟踪对象被垃圾回收的活动,主要用来实现比较精细的内存使用控制,比如,我们可以在确定一个Bitmap被回收后,再去申请另外一个Bitmap的内存,通过这种方式可以使得程序所消耗的内存维持在一个相对较低且稳定的水平。

         虚引用PlantomReference的声明借助强引用或者匿名对象,结合泛型ReferenceQueue<T>初始化

上一篇下一篇

猜你喜欢

热点阅读