分代垃圾回收和mySQL的Buffer Pool

分代垃圾回收

分代垃圾回收是通过对象不同的年龄,来使用不同的垃圾回收方式。
大多数对象都是朝生夕死的,所以使用复制算法只需要复制很少的存活的对象,而对于老年代的对象,本身就是不容易被回收的,如果用复制算法反而需要复制大多数对象,所以老年代适合标记清除或者标记整理算法。

buffer pool

buffer pool是InnoDB用来缓存页的一片连续内存。
buffer pool的大小是有限的,InnoDB采用的是LRU算法来挺高缓存命中率。但是有两种情况:

  1. InnoDB提供了一个预读的服务,会提前加载其他还没访问到的页进buffer pool。如果之后访问到了这些页,那会极大提高加载速度,但是没读到就会浪费buffer pool的空间。
  2. 当进行全表扫描的相关语句时,可能会把整个buffer pool更新一遍,可能会顶掉别的常访问的页。

总结就是

  1. 加载到Buffer Pool中的页不一定被用到。
  2. 如果非常多的使用频率偏低的页被同时加载到Buffer Pool时,可能会把那些使用频率非常高的页从Buffer Pool中淘汰掉。

为了防止上面的情况,InnoDB把LRU链表分成两部分:

  • 一部分存储使用频率非常高的缓存页,所以这一部分链表也叫做热数据,或者称young区域

  • 另一部分存储使用频率不是很高的缓存页,所以这一部分链表也叫做冷数据,或者称old区域

做了这个划分之后,

  • 预加载的数据会被放到old区的头部,不会影响young区。
  • 全表扫描时,首次加载会放在old区,如果后续被访问到,会被放到young区。

总结

Buffer Pool的LRU链表也是一种分代的想法。很多技术的实现都有相似的地方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值