1.存储结构

WeakHashMap 的 Entry 继承自 WeakReference。

被 WeakReference 关联的对象在下一次垃圾回收时会被回收。

WeakHashMap 主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收。

private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>

2.ConcurrentCache

Tomcat 中的 ConcurrentCache 使用了 WeakHashMap 来实现缓存功能。

ConcurrentCache 采取的是分代缓存:

  • 经常使用的对象放入 eden 中,eden 使用 ConcurrentHashMap 实现,不用担心会被回收(伊甸园) ;
  • 不常用的对象放入 longterm,longterm 使用 WeakHashMap 实现,这些老对象会被垃圾收集器回收。

当调用 get() 方法时,会先从 eden 区获取,

  • 如果没有找到的话再到 longterm获取,
  • 当从 longterm 获取到就把对象放入 eden 中,从而保证经常被访问的节点不容易被回收。

当调用 put() 方法时,

  • 如果 eden 的大小超过了 size,那么就将 eden 中的所有对象都放入 longterm 中,利用虚拟机回收掉一部分不经常使用的对象。
public final class ConcurrentCache<K, V> {private final int size;private final Map<K, V> eden;private final Map<K, V> longterm;public ConcurrentCache(int size) {this.size = size;this.eden = new ConcurrentHashMap<>(size);this.longterm = new WeakHashMap<>(size);} public V get(K k) {V v = this.eden.get(k);if (v == null) {v = this.longterm.get(k);if (v != null)this.eden.put(k, v);} return v;} public void put(K k, V v) {if (this.eden.size() >= size) {this.longterm.putAll(this.eden);this.eden.clear();} this.eden.put(k, v);}
}

WeekHashMap相关推荐

  1. Java Threads 多线程10分钟参考手册

    1         同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通常把这 ...

  2. 什么是WeakHashMap--转

    原文地址:http://laravel.iteye.com/blog/2303244 Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用 ...

  3. 浅谈WeakHashMap

    Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用时需要注意些什么?弱引用和强引用对Java GC有什么不同影响?本文将给出清晰而简洁的 ...

  4. Java修炼之道--集合框架

    原作地址:https://github.com/frank-lam/2019_campus_apply 前言 Java集合框架 (Java Collections Framework, JCF) 也称 ...

  5. JAVA开发面试常问问题总结3

    Java集合类 Java的集合类都位于java.util包中,Java集合中存放的是对象的引用,而非对象本身. Java集合主要分为三种类型: 1.Set(集):集合中的对象不按特定方式排序,并且没有 ...

  6. Java由浅入深,考试or面试专用(自我整理)

    关于java中堆内存与栈内存的详细分析 一.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 二.堆内存 1.什么是堆内存? 堆内存是Java内存中的一种,它的作用是用于存储Java ...

  7. java常见的面试题

                                           JAVA面试题及答案 转自:java-咖啡屋并做了一些修改和完善 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一 ...

  8. 秋招Android常见笔试题合集--Binrry(冰蕊)

    阅文集团笔试题 单选题 数组初始化 给定如下代码:int x[4]={0};int y[4]={1};数组x和y的值为: {0,0,0,0},{1,0,0,0} 十进制30转换成十六进制数是: 1E ...

  9. java面试一些问题汇总

    1.cap理论: 一致,可用,分区容错 2.web2.0: 以分享为特征的实时网络,用户在互联网上拥有自己的数据,并且在不同的网站上使用 3.分布式事务: 事务:原子,一致,隔离,持久 # 开启事务 ...

最新文章

  1. php把excel变成数组,PHP excel读取excel文件转换为数组
  2. [转]PHP--优化PHP代码建议
  3. SecureCRT通过密钥进行SSH登录
  4. 怎么查看python是32位还是64位的
  5. 让Windows XP系统快上几倍的三个绝招
  6. 720 智能硬件与 LeanCloud 云端的默契协作
  7. 艰困之道中学到的经验教训
  8. mysql随机姓名_mysql 随机生成姓名函数,及模拟大量测试数据
  9. 咖啡品牌“三顿半”完成千万级Pre-A轮融资,峰瑞资本投资...
  10. 如何对系统日志中事件 ID 9、事件 ID 11 和事件 ID 15 错误消息进行故障排除
  11. 论文阅读笔记 | 三维目标检测——AVOD算法
  12. 移动端关于手机横屏时样式修改
  13. java两周期的正选函数,在 Java 中如何计算双曲正弦,余弦和正切?
  14. leopard 全部搞定状态截图
  15. android hook方法替换,Android Hook入门教程
  16. NLP(自然语言处理) - Tricks Dataset 集合
  17. html5 webgl stl,新闻|Babylon.js|Babylon.js教程|Babylon.js开发|Babylon.js制作|webgl|three.js|html53D可视化开发...
  18. 什么是IDC?IDC基础知识
  19. 我眼中的匈牙利命名法
  20. J2EE是什么?和JavaEE的是什么关系?

热门文章

  1. nginx: [emerg] getpwnam(nginx) failed in /usr/local/nginx/conf/nginx.conf:2
  2. markdown grammar
  3. SimpleDateFormat和DateFormat类不是线程安全的。
  4. Httpwatch 工具介绍
  5. [2897]F SDUTOJ
  6. ul 、ol li 继承原有样式的问题
  7. 文件复制软件绿化之dos命令
  8. “ShardingCore”是如何针对分表下的分页进行优化的
  9. HBase 2.X版本的元数据修复及一种数据迁移方式
  10. linux kernl网址