缓存淘汰策略:
FIFO:先入先出策略
LFU:最少使用策略
LRU:最近最少使用策略
 
链表的数据结构:
可以看到,数组需要连续的内存空间,当内存空间充足但不连续时,也会申请失败触发GC,链表则可以是零散的。
常见的链表结构有:单链表,双向链表,循环链表等。
以单链表为例
每个节点除了存储数据以外,还要存储下一个节点地址,我们称之为后继指针。
头结点记录链表的基地址,尾节点的后继指针指向的是空地址null
循环链表:
双向链表:
双向循环链表:
 
双向链表插入,删除操作的时间复杂度是O(1)
单链表插入,删除操作的时间复杂度是O(n)
链表随机访问的时间复杂度是O(n)
 
注意:
单纯删除的时间复杂度是O(1),但往往删除前需要根据下标查找,时间复杂度为O(n)
针对删除操作与插入操作,由于单链表没有记录前驱节点位置,所以在删除与插入时,需要重新遍历链表,而双向链表则不需要。
java语言中,LinkedHashMap使用的就是双向链表。双向链表虽然比较耗费内存空间,但是性能更好,这是一种空间换时间的设计思想。
 
数组与链表各有利弊,数组对于缓存十分友好,且简单易用,缺点是数组是定长的,而容器如ArrayList,虽然支持动态扩容,但在扩容的时候需要重新分配空间且拷贝数据,十分损耗性能与内存。链表则会损耗更多的内存空间,并且会造成内存碎片,在java语言中,使用不当可能导致频繁的GC。
实际使用过程,应当根据场景选择使用数组还是链表。
 
使用链表实现LRU缓存淘汰算法:
使用单向链表存储缓存数据
缓存读取一个数据以后,遍历单向链表,有两种情况:
1.链表中已经存在,删除该数据,并且存储在链表头部
2.链表中不存在,又分为两种情况
    链表未满,直接插入到链表头部
    链表已满,删除尾部数据,将该数据存在链表头部
 
“数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。” 这里的CPU缓存机制指的是什么?为什么就数组更好了?
 
CPU在从内存读取数据的时候,会先把读取到的数据加载到CPU的缓存中。而CPU每次从内存读取数据并不是只读取那个特定要访问的地址,而是读取一个数据块(这个大小我不太确定)并保存到CPU缓存中,然后下次访问内存数据的时候就会先从CPU缓存开始查找,如果找到就不需要再从内存中取。这样就实现了比内存访问速度更快的机制,也就是CPU缓存存在的意义:为了弥补内存访问速度过慢与CPU执行速度快之间的差异而引入。
对于数组来说,存储空间是连续的,所以在加载某个下标的时候可以把以后的几个下标元素也加载到CPU缓存这样执行速度会快于存储空间不连续的链表存储。
Cache Line 是 Cache 与 DRAM 同步的最小单位. 典型的虚拟内存页面大小为 4KB,而典型的 Cache line 通常的大小为 32 或 64 字节
 
 

最新文章

  1. java多线程--同步屏障CyclicBarrier的使用
  2. 重启nginx
  3. 【HDU4612】 双连通分量求桥
  4. 【Effective Java】2、构造参数过多的时候
  5. uva729
  6. Qt之QuaZIP(zip压缩/解压缩)
  7. insertion Sort List (链表的插入排序) leecode java
  8. iOS socket原理及连接过程详解
  9. sql必知必会(第四版) 学习笔记一
  10. [转载] 树莓派读取温湿度传感器DHT11
  11. thinkphp 默认首页 更改
  12. CF 472 div1 D. Contact ATC
  13. Ajax设置自定义请求头的两种方法
  14. Spring如何加载log4j配置文件
  15. python设计模式第十九天【职责链模式】
  16. VB调用C# dll
  17. windwos下基于exp的提权
  18. C# 中的集合(Array/ArrayList/List<T>/HashTable/Dictionary)
  19. vs2013安装及opencv3.0的配置
  20. linux命令学习之:curl

热门文章

  1. WebGL2系列之多采样渲染缓冲对象
  2. 『开发技巧』Keras自定义对象(层、评价函数与损失)
  3. 【朝花夕拾】Android自定义View篇之(十)TouchSlop及VelocityTracker
  4. ~~在python中踩过的坑以及问题~~(不断更新)
  5. py+selenium运行时报错Can not connect to the Service IEDriverServer.exe
  6. Jmeter(1):使用TCP取样器与socket接口进行简单通信
  7. django中ORM的model对象和querryset 简单解析
  8. 在安装Openstack的keystone认证服务时,出现The request you have made requires authentication. (HTTP 401) (Request-ID: req-f94bebba-f0c5-4a92-85问题的处理
  9. python列表、元组、字典练习题
  10. Python解释器安装教程和环境变量配置