Java WeakReference 和 SoftReference
来源:互联网 发布:淘宝一口价可以改吗 编辑:程序博客网 时间:2024/04/30 19:00
在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 =
new
WeakReference<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 WeakReference 和 SoftReference
- Java WeakReference 和 SoftReference
- Java WeakReference 和 SoftReference .
- Java WeakReference 和 SoftReference
- Java中的SoftReference 和 WeakReference
- Java中的WeakReference 和 SoftReference
- Java的WeakReference和SoftReference
- Java中的 WeakReference 和 SoftReference
- Java中的SoftReference,WeakReference和PhantomReference
- java WeakReference和SoftReference的区别
- Java内存管理SoftReference 和 WeakReference
- Java引用之WeakReference和SoftReference
- (Core-JAVA) WeakReference & SoftReference
- Java WeakReference与SoftReference
- Java WeakReference SoftReference
- SoftReference、WeakReference 和 PhantomReference
- WeakReference 和 SoftReference
- SoftReference 和 WeakReference
- 单线程做比较耗CPU的进度条显示
- .NET4.0并行计算技术基础(2)
- 关于ubuntu10.04触摸板不能禁用和gedit文本编辑器中文乱码问题的一个解决方案
- c#数据库连接字符串集合
- /etc/security/limits.conf
- Java WeakReference 和 SoftReference
- 在fodera 14上搭建vsftp服务器
- 惰性求值与形式化的一些联系
- AAC音频格式
- FTP 命令
- 一个靠摆地摊为生的女博客
- 急求 pocketbuilder2.5
- js之自定义对象/URI编码
- 将linux烧写到s3c6410核心板上 --2011-3-23