java WeakReference

在Java 1.2中就引入了java.lang.ref这个包,WeakReference就属于这个包。WeakReference是干嘛的呢,一言弊之,它是和Java中的垃圾回收相关的。如果一个对象只有WeakReference引用它,那么这个对象就可能被垃圾回收器回收。

在什么场合下应用WeakReference呢?

有时我们会碰到一些不能继承的类,如final class, 或者通过Factory创建的对象,它对外只暴露一个接口,我们无法知道它的具体实现类,自然也无法继承它。假如我们要使用一个Widget类,因为某种 缘故,我们无法继承该类来加入某个功能。但是,我们必须将每个Widget对象和某个序列号关联,而Widget本身没有serial number这个属性,这时该怎么做呢?

你也许已经想到,用HashMap!对,像这样:
1.serialNumberMap.put(widget, widgetSerialNumber);

这看起来工作的很好。但是,有个问题:当我们不再需要某个Widget的serial number信息,此时应该从HashMap中将这个Entry移除,如果我们忘记了怎么办?因为HashMap中持有对这个对象的引用,这个对象永远不 会被垃圾回收器回收,这就造成了内存泄漏!这意味着我们需要像没有垃圾回收功能的语言一样,手动管理内存!但是我们用的是Java.....

另一个很常见的问题是缓存。如果使用强引用,那么我们缓存的对象就会一直滞留在内存中,不会被回收,除非我们手动的将其从缓存中移除。此外,这还需要我们决定何时从缓存中移除对象,又一个手动管理内存的问题!

此时,WeakReference就显示出它的价值了。如何创建一个WeakReference呢?很简单:
1.WeakReference<widget> weakWidget = newWeakReference<widget>(widget);
2.Widget w = weakWidget.get();

要注意的是,当调用weakReference.get()可能返回null(意味着指向的对象已经被回收)。其实,对于Widget serial number这个问题,最简单的方法是使用WeakHashMap,它的使用和普通的HashMap完全一样,不同点在于,WeakHashMap的key被实现为一种WeakReference(注意,是key而不是value),当key对象被回收后,WeakHashMap会自动将对应的entry移除。更精确的说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的回收。

Java中有四种类型的引用,按照强弱关系依次为:Strong Reference>Soft Reference>WeakReference> Phantom Reference。

其中,我们平常用的就是Strong Reference,而Phantom Reference很少用到,因此这里不去研究了,那么什么是Soft Reference呢?

Soft Reference和weak reference的区别是:一旦gc发现对象是weak reference可达就会把它放到ReferenceQueue中,然后等下次gc时回收它;当对象是Soft reference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,当实在没辙了才回收它。像cache系统,最适合用Soft reference。让gc来替我们决定什么时候回收对象以及回收哪些对象。
在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间.
或者换句话说, 一个对象被回收, 必须满足两个条件:
(1)没有任何引用指向它
(2)GC被运行.

创建一个弱引用

 1 public class Test {
 2
 3     public static void main(String[] args) throws  Exception {
 4         Car car=new Car("宾利","银白色");
 5         WeakReference<Car> weakCar=new WeakReference<Car>(car);
 6         int i=0;
 7         while (true){
 8             Thread.sleep(5000L);
 9             if(weakCar.get()!=null){
10                 i++;
11                 System.out.println(car.getRed()+car.getName()+i+"次");
12
13             }else{
14                 System.out.println("对象为空,已经被gc回收了!"+weakCar.get());
15                 break;
16             }
17             Thread.sleep(5000L);
18         }
19
20     }
21
22     static class Car{
23         private String name;
24
25         private String red;
26
27         public Car(String name,String red){
28             this.name=name;
29             this.red=red;
30         }
31
32         public String getName() {
33             return name;
34         }
35
36         public void setName(String name) {
37             this.name = name;
38         }
39
40         public String getRed() {
41             return red;
42         }
43
44         public void setRed(String red) {
45             this.red = red;
46         }
47     }
48 }

弱引用这种使用比较多的情况是运用在缓存系统中.

参考:http://blog.sina.com.cn/s/blog_4a4f9fb50100u908.html

这篇文章的例子很详细..

O(∩_∩)O哈哈~

时间: 2024-10-12 13:04:53

java WeakReference的相关文章

Java WeakReference的理解与使用

前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他. 无疑, 在interviewer眼中, 对于weak referen

【Java】Java垃圾回收机制

Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象

Java垃圾回收机制_(转载)

Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象

【转载】Java垃圾回收机制

原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都 交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后, 采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的

Android深入浅出之 AudioTrack分析

Android深入浅出之Audio 第一部分 AudioTrack分析 一 目的 本文的目的是通过从Audio系统来分析Android的代码,包括Android自定义的那套机制和一些常见类的使用,比如Thread,MemoryBase等. 分析的流程是: l         先从API层对应的某个类开始,用户层先要有一个简单的使用流程. l         根据这个流程,一步步进入到JNI,服务层.在此过程中,碰到不熟悉或者第一次见到的类或者方法,都会解释.也就是深度优先的方法. 1.1 分析工

[深入理解Android卷一全文-第七章]深入理解Audio系统

由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. 第7章  深入理解Audio系统 本章主要内容 ·  具体分析AudioTrack. ·  具体分析AudioFlinger. ·  具体分析AudioPolicyService. 本章涉及的源代码文件名称及位置 以下是本章分析的源代码文件名称及其位置. ·  AudioTrack.java framewor

JVM之垃圾回收

说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为"垃圾"?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象是"

Guava Cache的实现与源码分析

一.概述 1.内存缓存 2.核心数据结构 二.具体实现 0.一览众山小 1.CacheBuilder 构建器 2.LocalCache 1)初始化 2)put 3)get 4)清理软/弱引用 一.概述 1.内存缓存 可看作一个jdk7的concurrentHashMap,核心功能get,put 但是比一般的map多了一些功能,如: * ??过限失效(根据不同的维度失效,读后N秒,写后N秒,最大size,最大weight) * 自动刷新 * 支持软引用和弱引用 * 监听删除 2.核心数据结构 和j

Guava Cache 实现与源码分析

目录 Guava Cache 一.概述 1.内存缓存 2.核心数据结构 二.具体实现 0.一览众山小 1.CacheBuilder 构建器 2.LocalCache Guava Cache 一.概述 1.内存缓存 可看作一个jdk7的concurrentHashMap,核心功能get,put 但是比一般的map多了一些功能,如: ??过限失效(根据不同的维度失效,读后N秒,写后N秒,最大size,最大weight) 自动刷新 支持软引用和弱引用 监听删除 2.核心数据结构 和jdk7的HashM