在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 WeakReference相关推荐

  1. java面试加分_不只是给面试加分 -- Java WeakReference的理解与使用

    前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak refere ...

  2. 【Java】Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  3. 6种java垃圾回收算法_Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  4. java对于垃圾回收机制[GC垃圾回收机制] 为什么有GC还会有内存溢出呢?

    java垃圾回收机制 来源于书本和工作中的总结. 内存泄露 如果分配出去的内存得不到释放,及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这就是内存泄露 GC机制 java内存分配和回收 都是j ...

  5. java内存 海子_Java垃圾回收机制 - 海 子

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  6. Java的垃圾回收机制是什么?

    说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理. 顾名 ...

  7. Java语言垃圾回收机制是什么_Java垃圾回收机制简述

    Java垃圾回收机制简述 发布时间:2020-08-22 19:50:29 来源:脚本之家 阅读:64 作者:海子 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它 ...

  8. JDK动态代理源码解析

    分析版本jdk1.8 在分析jdk动态代理之前,先来了解java WeakReference弱引用的使用.运行期创建目标对象的代理非常耗时,使用缓存来存储生成的代理类显得尤为重要.jdk动态代理使用弱 ...

  9. JVM——内存管理和垃圾回收

    1.  何为GC Java与C语言相比的一个优势是,可以通过自己的JVM自动分配和回收内存空间.垃圾回收机制是由垃圾收集器Garbage Collection来实现的,GC是后台一个低优先级的守护进程 ...

最新文章

  1. 第九章 组合模型在信贷风控中的应用
  2. C#中小数点后保留两位小数,四舍五入的函数及使用方法
  3. MySql中关于某列中相同数值连续出现次数的统计
  4. java引用类型_Java引用类型
  5. 蓝桥杯 ALGO-105 算法训练 黑色星期五
  6. 移动端网页开发注意点
  7. chrome插件开发入门-保姆级攻略
  8. 关于主机的思维导图_思维导图可以整理哪些东西?
  9. Python+Tensorflow+CNN实现车牌识别
  10. u盘芯片 测试软件,U盘芯片检测工具(Chip Genius)
  11. linux测坏道脚本,linux测试硬盘坏道
  12. Windows手动蓝屏触发方法
  13. onlyoffice 回调传参数_onlyoffice服务在线编辑文档保存解析
  14. 合唱队形(线性DP)
  15. 读《灵魂只能独行》乱摘
  16. FreeMarker 模板生成 PDF电子凭证/图片
  17. 对标测评YD云电脑和天翼云电脑公众版
  18. 从零开始前端学习[38]:html5中的弹性布局一(移动端响应式实现各种布局,极其重要)
  19. 在共享主机上使用Screen for Human Beings:Byobu
  20. 内存控制器与SDRAM_内存接口概念

热门文章

  1. 安卓实现数值或者其他内容选择器的一种实现方式
  2. 扫雷-单机游戏-微信小游戏项目开发入门
  3. 蓝桥杯【算法训练】Python 实现
  4. Android类似360,QQ管家那样的悬浮窗 for android3
  5. 初学者前端培训机构需要注意什么
  6. OCR技术 之 Layout Analysis
  7. 软件测试第一步:编写测试用例
  8. 杰里之配置 DAC 单声道输出,立体声音乐没有合并输出【篇】
  9. Alist百度网盘大文件需要权限解决
  10. c++语言中ifndef和endif的用法