JAVA WeakReference
在Java 1.2中就引入了java.lang.ref这个包,WeakReference就属于这个包。WeakReference是干嘛的呢,一言弊之,它是和Java中的垃圾回收相关的。如果一个对象只有WeakReference引用它,那么这个对象就可能被垃圾回收器回收。
在什么场合下应用WeakReference呢?
有时我们会碰到一些不能继承的类,如final class, 或者通过Factory创建的对象,它对外只暴露一个接口,我们无法知道它的具体实现类,自然也无法继承它。假如我们要使用一个Widget类,因为某种 缘故,我们无法继承该类来加入某个功能。但是,我们必须将每个Widget对象和某个序列号关联,而Widget本身没有serial number这个属性,这时该怎么做呢?
你也许已经想到,用HashMap!对,像这样:
这看起来工作的很好。但是,有个问题:当我们不再需要某个Widget的serial number信息,此时应该从HashMap中将这个Entry移除,如果我们忘记了怎么办?因为HashMap中持有对这个对象的引用,这个对象永远不 会被垃圾回收器回收,这就造成了内存泄漏!这意味着我们需要像没有垃圾回收功能的语言一样,手动管理内存!但是我们用的是Java.....
另一个很常见的问题是缓存。如果使用强引用,那么我们缓存的对象就会一直滞留在内存中,不会被回收,除非我们手动的将其从缓存中移除。此外,这还需要我们决定何时从缓存中移除对象,又一个手动管理内存的问题!
此时,WeakReference就显示出它的价值了。如何创建一个WeakReference呢?很简单:
要注意的是,当调用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相关推荐
- java面试加分_不只是给面试加分 -- Java WeakReference的理解与使用
前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak refere ...
- 【Java】Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- 6种java垃圾回收算法_Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- java对于垃圾回收机制[GC垃圾回收机制] 为什么有GC还会有内存溢出呢?
java垃圾回收机制 来源于书本和工作中的总结. 内存泄露 如果分配出去的内存得不到释放,及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这就是内存泄露 GC机制 java内存分配和回收 都是j ...
- java内存 海子_Java垃圾回收机制 - 海 子
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- Java的垃圾回收机制是什么?
说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理. 顾名 ...
- Java语言垃圾回收机制是什么_Java垃圾回收机制简述
Java垃圾回收机制简述 发布时间:2020-08-22 19:50:29 来源:脚本之家 阅读:64 作者:海子 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它 ...
- JDK动态代理源码解析
分析版本jdk1.8 在分析jdk动态代理之前,先来了解java WeakReference弱引用的使用.运行期创建目标对象的代理非常耗时,使用缓存来存储生成的代理类显得尤为重要.jdk动态代理使用弱 ...
- JVM——内存管理和垃圾回收
1. 何为GC Java与C语言相比的一个优势是,可以通过自己的JVM自动分配和回收内存空间.垃圾回收机制是由垃圾收集器Garbage Collection来实现的,GC是后台一个低优先级的守护进程 ...
最新文章
- 第九章 组合模型在信贷风控中的应用
- C#中小数点后保留两位小数,四舍五入的函数及使用方法
- MySql中关于某列中相同数值连续出现次数的统计
- java引用类型_Java引用类型
- 蓝桥杯 ALGO-105 算法训练 黑色星期五
- 移动端网页开发注意点
- chrome插件开发入门-保姆级攻略
- 关于主机的思维导图_思维导图可以整理哪些东西?
- Python+Tensorflow+CNN实现车牌识别
- u盘芯片 测试软件,U盘芯片检测工具(Chip Genius)
- linux测坏道脚本,linux测试硬盘坏道
- Windows手动蓝屏触发方法
- onlyoffice 回调传参数_onlyoffice服务在线编辑文档保存解析
- 合唱队形(线性DP)
- 读《灵魂只能独行》乱摘
- FreeMarker 模板生成 PDF电子凭证/图片
- 对标测评YD云电脑和天翼云电脑公众版
- 从零开始前端学习[38]:html5中的弹性布局一(移动端响应式实现各种布局,极其重要)
- 在共享主机上使用Screen for Human Beings:Byobu
- 内存控制器与SDRAM_内存接口概念