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 class Car
{private double     price;private String    color;public Car(double price, String color){this.price = price;this.color = color;}public double getPrice(){return price;}public String getColor(){return color;}public String toString(){return "This car is a " + this.color + " car, costs $" + price;}
}

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

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

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

public static void main(String[] args){Car car = new Car(2000.0, "red");WeakReferenceCar wrc = new WeakReferenceCar(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.00 secs]
WeakReferenceCar's Car is alive for 22885, loop - com.xrq.test14.WeakReferenceCar@5d888759
WeakReferenceCar's Car has bean collected
HeapPSYoungGen      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来保存被回收的对象

转载于:https://www.cnblogs.com/xrq730/p/4854705.html

说说WeakReference弱引用相关推荐

  1. WeakReference弱引用

    WeakReference弱引用 什么是弱引用 顾名思义,弱引用,当一个对象仅仅被weak reference(弱引用)指向并且没有其它对象strong reference(强引用)指向,这时GC运行 ...

  2. java中的WeakReference(弱引用)

    java中的weakReference-弱引用 1.介绍 阅读ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc,为了能搞明白Thread ...

  3. Android 弱引用 (WeakReference)的使用

    1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...

  4. 弱引用WeakReference和软引用SoftReference

    在Java1.2中我们可以发现一个java.lang.ref包,在这个包中我们可以发现有关引用的知识,比如WeakReference弱引用和SoftReference强引用. 弱引用(WeakRefe ...

  5. java强引用弱引用_Java 的强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...

  6. java 静态内部类 弱引用_Java基础 强引用、弱引用、软引用、虚引用

    前言 在ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc.Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决 ...

  7. java弱引用怎么手动释放,Java 如何有效地避免OOM:善于利用软引用和弱引用

    前言 想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题. 一.了解 ...

  8. JVM之强引用、软引用、弱引用、虚引用

    JVM之强引用.软引用.弱引用.虚引用 整体架构 强引用Reference 软引用SoftReference 弱引用WeakReference 软引用和弱引用的适用场景 WeakHashMap案例演示 ...

  9. 简单介绍强引用,软引用,弱引用,虚引用

    StrongReference 强引用是使用最普遍的引用,如果一个对象具有强引用,那么垃圾回收器绝不会回收它,如: Object obj = new Object(): // 强引用 当内存空间不足, ...

最新文章

  1. 位运算+取某一位+java_Java位运算小节
  2. win7操作系统在哪显示隐藏文件夹
  3. 又一起“删库”:链家程序员怒删公司 9TB 数据,被判 7 年
  4. java基础----Java的格式化输出
  5. LinuxMint(Ubuntu)安装文泉驿家族黑体字
  6. mysql命令行卡在>>>>>
  7. Java集合中removeIf的使用
  8. javascript系列之执行上下文
  9. linux下线程控制
  10. pandas 使用把dataframe变为series
  11. 错误记录(12):No 'Access-Control-Allow-Origin' header is present on the requested resource.
  12. plsql查询不显示结果_管理NVivo的查询结果
  13. Maven是个什么鬼?,没办法起床排bug...
  14. C# AForge视频录像
  15. H.265视频编码原理总结
  16. jpa mysql lob_Jpa加载Lob字段报Unable to access lob stream异常
  17. imagemagick gif制作
  18. 如何用Excel做动态图表
  19. 飞思卡尔Kinetis系列单片机被锁住后,怎么解锁
  20. 站内信(我的消息)业务在我司的实践

热门文章

  1. 按相反的顺序输出列表的元素python_Python练习实例32 | 如何以相反的顺序来输出列表的值?...
  2. java 强制类型转换_lt;08gt;数据类型转换
  3. php str_replace替换特殊字符
  4. 复习vue笔记第一天
  5. 51单片机c语言教程温度计,单片机课程设计-数字温度计.doc
  6. oracle左连接查询代码,ORACLE连接查询,内外连接
  7. vscode remote ssh_win10 下安装Vscode
  8. python学习知识以及就业方向_Python需要学到什么技术 学完可以从事哪些行业
  9. Oracle RAC 11.2.0.3 节点CRS无法启动报:no network hb 故障解决方法
  10. docker搭建Redis的主从集群