说说WeakReference弱引用

摘要:
所以Java中引入了弱引用WeakReference。WeakReference弱引用示例下面演示一下WeakReference简单的使用,首先定义一个实体类:publicclassCar{privatedoubleprice;privateStringcolor;publicCar{this.price=price;this.color=color;}publicdoublegetPrice(){returnprice;}publicStringgetColor(){returncolor;}publicStringtoString(){return"Thiscarisa"+this.color+"car,costs$"+price;}}一般使用WeakReference的时候都会定义一个类继承自WeakReference,在这个类中再定义一些别的属性,这里就不定义别的属性了:publicclassWeakReferenceCarextendsWeakReference{publicWeakReferenceCar{super;}}publicclassWeakReferenceCarextendsWeakReference{publicWeakReferenceCar{super;}}main函数调用一下,当然为了更清楚地看到GC的效果,设置虚拟机参数"-XX:+PrintGCDetails":publicstaticvoidmain{Carcar=newCar;WeakReferenceCarwrc=newWeakReferenceCar;wrc.setStr;inti=0;while{if(wrc.get()!=null){i++;System.out.println;}else{System.out.println;break;}}}看一下运行结果:WeakReferenceCar'sCarisalivefor22880,loop-com.xrq.test14.WeakReferenceCar@5d888759WeakReferenceCar'sCarisalivefor22881,loop-com.xrq.test14.WeakReferenceCar@5d888759WeakReferenceCar'sCarisalivefor22882,loop-com.xrq.test14.WeakReferenceCar@5d888759WeakReferenceCar'sCarisalivefor22883,loop-com.xrq.test14.WeakReferenceCar@5d888759WeakReferenceCar'sCarisalivefor22884,loop-com.xrq.test14.WeakReferenceCar@5d888759[GC[PSYoungGen:16400K-˃256K]16400K-˃256K,0.0002863secs][Times:user=0.00sys=0.00,real=0.00secs]WeakReferenceCar'sCarisalivefor22885,loop-com.xrq.test14.WeakReferenceCar@5d888759WeakReferenceCar'sCarhasbeancollectedHeapPSYoungGentotal18688K,used899K[0x0000000034180000,0x0000000035650000,0x0000000048f80000)edenspace16064K,4%used[0x0000000034180000,0x0000000034220c30,0x0000000035130000)fromspace2624K,9%used[0x00000000353c0000,0x0000000035400000,0x0000000035650000)tospace2624K,0%used[0x0000000035130000,0x0000000035130000,0x00000000353c0000)PSOldGentotal42752K,used0K[0x000000000a580000,0x000000000cf40000,0x0000000034180000)objectspace42752K,0%used[0x000000000a580000,0x000000000a580000,0x000000000cf40000)PSPermGentotal21248K,used3016K[0x0000000005180000,0x0000000006640000,0x000000000a580000)objectspace21248K,14%used[0x0000000005180000,0x0000000005472318,0x0000000006640000)看到22884次循环之后,WeakReferenceCar关联的对象Car被回收掉了,注意是弱引用关联的对象car被回收,而不是弱引用本身wrc被回收。

WeakReference弱引用概述

http://www.cnblogs.com/xrq730/p/4836700.html,关于Java的四种引用状态具体请参看此文

Java里一个对象obj被创建时,被放在堆里。当GC运行的时候,发现没有任何引用指向obj,那么就会回收obj对象的堆内存空间。

但是现实的情况时,写代码的时候,往往通过把所有指向某个对象的引用置空来保证这个对象在下次GC运行的时候被回收:

Object obj = new Object();

obj = null;

这种方式说可以吧,也不是不可以,但是对于程序员来说,这是一件繁琐而且未被自动回收理念的。手动置空不应该需要程序员来做的,因为对于一个简单的对象而言,当调用它的方法执行完毕,引用会自动从栈中弹出,这样下一次GC的时候就会自动回收这块内存了。

但是有例外。比如说缓存,由于缓存对象是程序需要的,那么只要程序正在运行,缓存中的引用是不会被GC的,随着缓存中的引用越来越多,GC无法回收的对象也越来越多,无法被自动回收。当这些对象需要被回收时,回收这些对象的任务只有交给程序员了,然而这却违背了GC的本质----自动回收。

所以Java中引入了弱引用WeakReference。

WeakReference弱引用示例

下面演示一下WeakReference简单的使用,首先定义一个实体类:

public classCar
{
    private doubleprice;
    privateString    color;
    public Car(doubleprice, String color)
    {
        this.price =price;
        this.color =color;
    }
    public doublegetPrice()
    {
        returnprice;
    }
    publicString getColor()
    {
        returncolor;
    }
    publicString toString()
    {
        return "This car is a " + this.color + " car, costs $" +price;
    }
}

一般使用WeakReference的时候都会定义一个类继承自WeakReference,在这个类中再定义一些别的属性,这里就不定义别的属性了:

public class WeakReferenceCar extends WeakReference<Car>
{
    publicWeakReferenceCar(Car car)
    {
        super(car);
    }
}
public class WeakReferenceCar extends WeakReference<Car>
{
    publicWeakReferenceCar(Car car)
    {
        super(car);
    }
}

main函数调用一下,当然为了更清楚地看到GC的效果,设置虚拟机参数"-XX:+PrintGCDetails":

public static voidmain(String[] args)
    {
        Car car = new Car(2000.0, "red");
        WeakReferenceCar wrc = newWeakReferenceCar(car);
        wrc.setStr("111");
        int i = 0;
        while (true)
        {
            if (wrc.get() != null)
            {
                i++;
                System.out.println("WeakReferenceCar's Car is alive for " + i + ", loop - " +wrc);
            }
            else
            {
                System.out.println("WeakReferenceCar's Car has bean collected");
                break;
            }
        }
    }

看一下运行结果:

WeakReferenceCar's Car is alive for 22880, loop - com.xrq.test14.WeakReferenceCar@5d888759
WeakReferenceCar's Car is alive for 22881, loop - com.xrq.test14.WeakReferenceCar@5d888759
WeakReferenceCar's Car is alive for 22882, loop - com.xrq.test14.WeakReferenceCar@5d888759
WeakReferenceCar's Car is alive for 22883, loop - com.xrq.test14.WeakReferenceCar@5d888759
WeakReferenceCar's Car is alive for 22884, loop - com.xrq.test14.WeakReferenceCar@5d888759
[GC [PSYoungGen: 16400K->256K(18688K)] 16400K->256K(61440K), 0.0002863 secs] [Times: user=0.00 sys=0.00, real=0.00secs] 
WeakReferenceCar's Car is alive for 22885, loop - com.xrq.test14.WeakReferenceCar@5d888759
WeakReferenceCar's Car has bean collected
Heap
 PSYoungGen      total 18688K, used 899K [0x0000000034180000, 0x0000000035650000, 0x0000000048f80000)
  eden space 16064K, 4% used [0x0000000034180000,0x0000000034220c30,0x0000000035130000)
  from space 2624K, 9% used [0x00000000353c0000,0x0000000035400000,0x0000000035650000)
  to   space 2624K, 0% used [0x0000000035130000,0x0000000035130000,0x00000000353c0000)
 PSOldGen        total 42752K, used 0K [0x000000000a580000, 0x000000000cf40000, 0x0000000034180000)
  object space 42752K, 0% used [0x000000000a580000,0x000000000a580000,0x000000000cf40000)
 PSPermGen       total 21248K, used 3016K [0x0000000005180000, 0x0000000006640000, 0x000000000a580000)
  object space 21248K, 14% used [0x0000000005180000,0x0000000005472318,0x0000000006640000)

看到22884次循环之后,WeakReferenceCar关联的对象Car被回收掉了,注意是弱引用关联的对象car被回收,而不是弱引用本身wrc被回收。

其他

1、除了弱引用,还有软引用。SoftReference(软引用)和WeakReference的区别在于,假如下次GC的时候,发现内存没有溢出,则不会回收SoftReference关联的对象,但是对于WeakReference,在下一次GC的时候,一定会回收,无论内存是否满。像缓存,其实最适合的个人认为应该是SoftReference,因为缓存里面的数据是运行时会用到的,能不回收就尽量不要去回收它们,而等到内存实在不够的时候再去回收

2、WeakReference的父类Reference中有一个变量queue,是ReferenceQueue类型的。WeakReference中的构造函数中有一个两个参数的构造函数,其中第二个参数就是这个ReferenceQueue,表示在WeakReference指向的对象被回收之后,可以利用ReferenceQueue来保存被回收的对象

免责声明:文章转载自《说说WeakReference弱引用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JdbcTemplate实体映射Android API Levels 详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis实现二级缓存

缓存的作用就是降低数据库的使用率,来减轻数据库的负担。我们平常的操作一般都是查>改,所以数据库的有些查操作是重复的,如果一直使用数据库就会有负担。Mybatis也会做缓存,也会有一级缓存和二级缓存: 一级缓存:是SqlSession级别的缓存,使用HashMap数据结构来用于存储缓存数据的 二级缓存:是mapper级别的缓存,其作用域是mappe...

什么是缓存

缓存是数据交换的缓冲区(Cache):当某一硬件要读取数据时,首先会从缓存中查找需要的数据,如果找到了则直接执行,找不到的话,则从内存中找。(所以,缓存与内存的读取级别相同,优先级优于内存) 缓存的作用就是帮助硬件更快地运行:因为缓存的运行速度比内存快很多。   缓存的硬件原理:缓存通常时候的是RAM(断电即掉的非永久储存) 缓存在使用完成后会将文件送到硬盘...

手把手教学在Springboot中搭建使用Guava cache,包教包会,不会我输一包辣条给你

 guava cache使用简介   概述   缓存是日常开发中经常应用到的一种技术手段,合理的利用缓存可以极大的改善应用程序的性能。   Guava官方对Cache的描述连接   缓存在各种各样的用例中非常有用。例如,当计算或检索值很昂贵时,您应该考虑使用缓存,并且不止一次需要它在某个输入上的值。   缓存ConcurrentMap要小,但不完全相同。最...

手把手教你Smarty缓存技术(转)

大家应该知道缓存机制能能有效的减轻网站的服务器压力,Smarty模板引擎的一大亮点就是为我们提供了非常简单的缓存操作,下面就让我们学习一下。 首先我们要知道Smarty缓存机制分为全局缓存,部分缓存,局部缓存三种,我们一一介绍。 1、全局缓存 顾名思义,全局缓存就是为整个网站的全部页面都生成缓存页面。 首先我们要操作smarty的配置文件,开启缓存,指定缓...

Linux 里Buffer和Cache的定义及使用

Buffer 和 Cache 的介绍 查看内存使用情况 # 注意不同版本的free输出可能会有所不同 $ free total used free shared buff/cache available Mem: 8169348 263524 68753...

iOS图片加载框架-SDWebImage解读

在iOS的图片加载框架中,SDWebImage可谓是占据大半壁江山。它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件。在项目中使用SDWebImage来管理图片加载相关操作可以极大地提高开发效率,让我们更加专注于业务逻辑实现。 SDWebImage 概论 1.提供了一个UIImageView的catego...