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简单的使用,首先定义一个实体类:

  1. public class Car
  2. {
  3. private double price;
  4. private String color;
  5.  
  6. public Car(double price, String color)
  7. {
  8. this.price = price;
  9. this.color = color;
  10. }
  11.  
  12. public double getPrice()
  13. {
  14. return price;
  15. }
  16.  
  17. public String getColor()
  18. {
  19. return color;
  20. }
  21.  
  22. public String toString()
  23. {
  24. return "This car is a " + this.color + " car, costs $" + price;
  25. }
  26. }

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

  1. public class WeakReferenceCar extends WeakReference<Car>
  2. {
  3. public WeakReferenceCar(Car car)
  4. {
  5. super(car);
  6. }
  7. }
  8. public class WeakReferenceCar extends WeakReference<Car>
  9. {
  10. public WeakReferenceCar(Car car)
  11. {
  12. super(car);
  13. }
  14. }

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

  1. public static void main(String[] args)
  2. {
  3. Car car = new Car(2000.0, "red");
  4. WeakReferenceCar wrc = new WeakReferenceCar(car);
  5. wrc.setStr("111");
  6. int i = 0;
  7. while (true)
  8. {
  9. if (wrc.get() != null)
  10. {
  11. i++;
  12. System.out.println("WeakReferenceCar's Car is alive for " + i + ", loop - " + wrc);
  13. }
  14. else
  15. {
  16. System.out.println("WeakReferenceCar's Car has bean collected");
  17. break;
  18. }
  19. }
  20. }

看一下运行结果:

  1. WeakReferenceCar's Car is alive for 22880, loop - com.xrq.test14.WeakReferenceCar@5d888759
  2. WeakReferenceCar's Car is alive for 22881, loop - com.xrq.test14.WeakReferenceCar@5d888759
  3. WeakReferenceCar's Car is alive for 22882, loop - com.xrq.test14.WeakReferenceCar@5d888759
  4. WeakReferenceCar's Car is alive for 22883, loop - com.xrq.test14.WeakReferenceCar@5d888759
  5. WeakReferenceCar's Car is alive for 22884, loop - com.xrq.test14.WeakReferenceCar@5d888759
  6. [GC [PSYoungGen: 16400K->256K(18688K)] 16400K->256K(61440K), 0.0002863 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  7. WeakReferenceCar's Car is alive for 22885, loop - com.xrq.test14.WeakReferenceCar@5d888759
  8. WeakReferenceCar's Car has bean collected
  9. Heap
  10. PSYoungGen total 18688K, used 899K [0x0000000034180000, 0x0000000035650000, 0x0000000048f80000)
  11. eden space 16064K, 4% used [0x0000000034180000,0x0000000034220c30,0x0000000035130000)
  12. from space 2624K, 9% used [0x00000000353c0000,0x0000000035400000,0x0000000035650000)
  13. to space 2624K, 0% used [0x0000000035130000,0x0000000035130000,0x00000000353c0000)
  14. PSOldGen total 42752K, used 0K [0x000000000a580000, 0x000000000cf40000, 0x0000000034180000)
  15. object space 42752K, 0% used [0x000000000a580000,0x000000000a580000,0x000000000cf40000)
  16. PSPermGen total 21248K, used 3016K [0x0000000005180000, 0x0000000006640000, 0x000000000a580000)
  17. 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弱引用的更多相关文章

  1. Android中的WeakReference 弱引用

    WeakReference 弱引用 定义:弱引用,与强引用(我们常见的引用方式)相对:特点是:GC在回收时会忽略掉弱引用对象(忽略掉这种引用关系),即:就算弱引用指向了某个对象,但只要该对象没有被强引 ...

  2. C#WeakReference弱引用

    原文:C#WeakReference弱引用 弱引用:在引用对象的同时,允许垃圾回收该对象. .NET中提供了WeakReference对象来实现这个功能. 对于那些创建便宜但耗费大量内存的对象,即希望 ...

  3. android WeakReference(弱引用 防止内存泄漏)与SoftReference(软引用 实现缓存机制(cache))

    在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...

  4. WeakReference 弱引用

    弱引用是使用WeakReference类创建的.因为对象可能在任意时刻被回收,所以在引用该对象前必须确认它存在. class MainEntryPoint { static void Main() { ...

  5. java中的强引用(Strong reference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)

    之前在看深入理解Java虚拟机一书中第一次接触相关名词,但是并不理解,只知道Object obj = new Object()类似这种操作的时候,obj就是强引用.强引用不会被gc回收直到gc roo ...

  6. Java学习之强引用,弱引用,软引用 与 JVM

    1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象.  java对象的引用包括  强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...

  7. 关于Java的软引用及弱引用

    概念介绍   1   Reference      描述一个对象的引用.其内部维持一个queue引用,用于跟踪对象的回收情况,当对象被回收时将当前reference引用入队   2   SoftRef ...

  8. Java基础 之软引用、弱引用、虚引用 ·[转载]

    Java基础 之软引用.弱引用.虚引用 ·[转载] 2011-11-24 14:43:41 Java基础 之软引用.弱引用.虚引用 浏览(509)|评论(1)   交流分类:Java|笔记分类: Ja ...

  9. java 中的三种引用,强引用,软引用,弱引用

    StrongReference   前引用,不会被系统GC回收,系统宁愿跑出OOM异常也不会回收强引用 SoftReference  软引用,在系统内存不足的时候,会被GC回收 WeakReferen ...

随机推荐

  1. 关于delphi点击webbrowser中任意一点的问题

    关于delphi点击webbrowser中任意一点的问题 有时候我们需要delphi载入webbrowser1打开网页的时候 需要点击某一个点的位置 可能是坐标 可能是按钮 可能是其他的控件应该如何来 ...

  2. checkbox全选

    jquery代码如下(在jquery1.10.2下验证通过): <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...

  3. 数据仓储之DLL层接口设计

    一.接口设计 1.1. IBaseRepository.cs public interface IBaseRepository<T> { T Add(T entity); bool Upd ...

  4. arch linux 安装 之 ---GPT--引导篇

    新入一二手X240 ,直接格式化,装archLinux. 一.引导程序安装--------------- 1.首先搞清楚什么是UEFI Under UEFI下的引导顺序 System switched ...

  5. bibnernate(2)

    2. 实例代码 新建一个java工程,假设取名为HibernateHelloWorld.在src下新那一个package,可取名为com.sun.hibernate.model 2.1 类代码 新建一 ...

  6. Map中的entry

    是java中的一个对象,一般可以通过map.entrySet()得到.1,entrySet实现了Set接口,里面存放的是键值对.一个K对应一个V.2,用来遍历map的一种方法.Set<Map.E ...

  7. Lessons Learned 1(敏捷项目中的变更影响分析)

    问题/现象: 业务信息流转的某些环节,会向相关人员发送通知邮件,邮件中附带有链接,供相关人员进入察看或处理业务.客户要求邮件中的链接,需要进行限制,只有特定人员才能进入处理或察看.总管想了想,应道没问 ...

  8. 易学PHP——PHP基础知识

    PHP 语言标记 因为 PHP 是兼容当时的主流语言,所以 PHP 有四种标记方式: <?php PHP 代码 ?>.这是 PHP 最为正宗的语言标记,称为标准风格标记.XML 风格标记等 ...

  9. Python解决八皇后问题

    最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...

  10. 我与solr(四)--solrJ

    SolrJ索引库: solr提供的一个客户端操作框架,在文件/solr6.2/dist下面可以找到该jar包solrj.jar以及相关jar包,可以使用maven添加. java使用solrJ如下: ...