JAVA WeakReference

分类: JAVA 2012-08-28 16:08 305人阅读 评论(0) 收藏 举报

在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来替我们决定什么时候回收对象以及回收哪些对象。

最新文章

  1. Xcode编译WebApps找不到js的错误解决办法&lt;转&gt;
  2. client/offset/srooll位置与关系
  3. Boostrap学习心得
  4. js奇葩错误 字符串传递问题
  5. C#自动实现的属性
  6. html不同文档类型支持的元素标签
  7. apache增加php版本
  8. LinkCode 整数排序II
  9. ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
  10. .net Core 2.0应用程序发布到IIS上注意事项
  11. webpack-dev-server的执行逻辑
  12. Nginx服务器中配置非80端口的端口转发方法详解
  13. Linux磁盘空间满了的排查与解决思路
  14. lfs(systemv版本)学习笔记-第3页
  15. Oracle使用——oracle用户相关操作
  16. Ruby on Rails 生成指定版本的 Rails 项目
  17. mysql中innodb和myisam的区别
  18. session和cookie的联系
  19. weblogic连接池问题总结(转载)
  20. tomcat 修改根路径

热门文章

  1. Ubuntu apache
  2. Codeforces 494E. Sharti
  3. 【原创】MapReduce实战(一)
  4. 来谈谈你对CSS盒模型的认识?
  5. 51Nod1601 完全图的最小生成树计数
  6. js原生获取css属性
  7. php接收post过来的json数据
  8. 【Markdown】Markdown 使用MathJax引擎 书写Latex 数学公式
  9. Android 高速录像(1)
  10. C++中long是什么类型