WeakHashMap, NOT A CACHE
Overview
Base
- Map的实现
- 基于WeakReference的Entity实现
- 基于Reference和ReferenceQueue实现
- 它的弱引用是键,而不是值
- 它的key会被全自动回收(VM),value值不会,只有当触发put,remove,get方法的时候才会手动回收
JAVA Reference
>>>>here is about java.lang.ref
Detail
包含具体的实现
Key值回收
该动作由VM执行,当没有Strong Reference引用的时候,在下一个回收周期会被回收
Value(Entity)值回收
该动作由put, remove, get方法触发
基于ReferenceQueue监视哪些key已经被回收,随着上述方法的触发以回收过期的元素
private void expungeStaleEntries() {
Entry<K,V> e;
while ( (e = (Entry<K,V>) queue.poll()) != null) {
int h = e.hash;
int i = indexFor(h, table.length);
Entry<K,V> prev = table[i];
Entry<K,V> p = prev;
while (p != null) {
Entry<K,V> next = p.next;
if (p == e) {
//兼容第一个元素
if (prev == e)
table[i] = next;
else
prev.next = next;
//删除值
e.next = null; // Help GC
e.value = null; // " "
size--;
break;
}
//删除关于entity的引用
prev = p;
p = next;
}
}
}
Not a Cache
WeakHashMap并不是一个有用的缓存,至少并不是像大多数人想的或者网上那些奇怪的文章中介绍的那样。
原因包括以下两个:
- 它使用弱引用作为底层的内存管理机制。由此并不能具备缓存特质,我们并不能良好的控制它失效。而且weakReference依赖于虚拟机的实现。
- 它使用weak keys,而不是weak values。所以和大部分人想象的并不一样。
What is it good for
WeakHashMap is mostly useful to keep metadata about objects whose lifecycle you don't control
它适用于保存一些关于你所需要的对象的额外信息,而且这些额外信息你不想控制他们的生命周期
case 1
Lets say you want to associate some extra information to an object that you have a strong reference to.
You put an entry in a WeakHashMap with the object as the key, and the extra information as the map value. Then, as long as you keep a strong
reference to the object, you will be able to check the map to retrieve the extra information. And once you release the object, the map entry
will be cleared and the memory used by the extra information will be released.
假设你有一些强引用的对象,并且他们存在一些额外的信息。我们将这些object当做WeakHashMap的key值,那些额外的信息当做value。
只要我们保持者对于这些对象的强引用,那么我们就可以通过这个weakHashMap来获取关于该对象的额外信息。而一旦我们释放了该对象
(放弃该对象的引用),这个对象相应的额外信息就会被清理
case 2
where you might keep track of what various threads in your system are doing; when the thread dies, the entry will be
removed silently from your map, and you won't keep the Thread from being garbage collected if you're the last reference
to it. You can then iterate over the entries in that map to find out what metadata you have about active threads in your system.
WeakHashMap<Thread, SomeMetaData>
当你需要跟踪在你系统中的各个线程正在干嘛时。当线程死亡时,这个entity就会悄无声息地从map中移除。当然你不能持有这些线程的强引用。
我们这样一来就可以通过遍历这个map来看一看那些线程在我们的系统中仍然活跃,也可以查看他对应的那些额外信息。
Tips
不要再value中保存对key的引用。
reference
- WeakHashMap is not a cache! Understanding WeakReference and SoftReference
- Java's WeakHashMap and caching: Why is it referencing the keys, not the values?
- Is there a SoftHashMap in Java?
- How would you implement an LRU cache in Java 6?
WeakHashMap, NOT A CACHE的更多相关文章
- Java性能提示(全)
http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.htmlComparing the performance of LinkedLi ...
- cglib源码主流程源码-我们到底能走多远系列48
扯淡 祝各位在园里的朋友新年快乐! 辛苦一年,为更好的自己也为更好的世界,很多人要感谢你们,你们也应该有很多人要感谢吧. 看了马斯克的采访视频,又想起兰迪·鲍许的最后一课,时光迁移,唯有梦想可坚持. ...
- Java Reference & ReferenceQueue一览
Overview The java.lang.ref package provides more flexible types of references than are otherwise ava ...
- netty中的Channel、ChannelPipeline
一.Channel与ChannelPipeline关系 每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline.这项关联是永久性 的:Channel 既不能附加另外一个 ...
- 设计模式 - 动态代理原理及模仿JDK Proxy 写一个属于自己的动态代理
本篇文章代码内容较多,讲的可能会有些粗糙,大家可以选择性阅读. 本篇文章的目的是简单的分析动态代理的原理及模仿JDK Proxy手写一个动态代理以及对几种代理做一个总结. 对于代理模式的介绍和讲解,网 ...
- cglib测试例子和源码详解
目录 简介 为什么会有动态代理? 常见的动态代理有哪些? 什么是cglib 使用例子 需求 工程环境 主要步骤 创建项目 引入依赖 编写被代理类 编写MethodInterceptor接口实现类 编写 ...
- jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)
代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...
- 【趣味设计模式系列】之【代理模式3--Cglib动态代理源码解析】
1. 图解 上图主要描述了Cglib动态代理的主要执行过程,下面做详细分析,以下源码使用的Cglib版本为3.2.12. 2. Enhancer源码分析 public Object create() ...
- Springboot中注解@Configuration源码分析
Springboot中注解@Configuration和@Component的区别 1.先说结论,@Configuration注解上面有@Component注解,所以@Component有的功能@Co ...
随机推荐
- html绘制三角形(兼容IE6)
.sanjiao { width:; height:; overflow: hidden; border-width: 10px; border-color: red transparent tran ...
- mysql迁移oracle
有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到Orac ...
- EPANET头文件解读系列4——EPANET2.H
该头文件的功能与系列3中的TOOLKIT.H类似,而且内容也几乎一致,所以也就不再详细介绍.
- springboot---没有配置数据库启动报错
If you want an embedded database please put a supported one on the classpath. If you have database s ...
- linux磁盘分区格式化-fdisk命令工具
本文主要讲述使用fdisk工具对磁盘进行分区和格式化的方法 首先要明确分区是针对磁盘进行的操做,磁盘分区会创建分区表,类似vda,sda的是磁盘,vda1,sda1的是分区 1.查看磁盘分区状态 1. ...
- 在SSH项目中实现分页效果
在实现分页的时候,我使用的是数据库下面的User表,实现的效果是通过分页查询 能够将表中的数据分页显示,点击相关的按钮实现:首页.上一页.下一页.末页的显示 1新建一个dynamic web proj ...
- 0302 IT行业就业与软件工程
阅读以下文章 http://www.thea.cn/news/terminal/9/9389.html http://www.shzhidao.cn/system/2015/09/22/0102610 ...
- mysql学习--基本使用
一旦安装完毕,MySQL 服务器应该自己主动启动. sudo start mysql #手动的话这样启动 sudo stop mysql #手动停止 当你改动了配置文件后,你须要重新启动 mysqld ...
- ETA6093 或 ETA9741 ETA9742 的 TYPE-C 的资料收集
ETA6093 或 ETA9741 ETA9742 的 TYPE-C 的资料收集 因为项目使用. 这个 IC 好玩,但是还是有一些需要注意的. 对我有用的信息. http://www.great-et ...
- Linux之 增加swap空间
引言 :有时候我们会遇到安装os时候,swap分区过小,导致某些大软件无法安装的问题.我们可以在linux下增大swap分区的空间. 以下的操作都要在root用户下执行: 0. 记录原 swap 分区 ...