分代垃圾回收
分代垃圾回收是通过对象不同的年龄,来使用不同的垃圾回收方式。
大多数对象都是朝生夕死的,所以使用复制算法只需要复制很少的存活的对象,而对于老年代的对象,本身就是不容易被回收的,如果用复制算法反而需要复制大多数对象,所以老年代适合标记清除或者标记整理算法。
buffer pool
buffer pool是InnoDB用来缓存页的一片连续内存。
buffer pool的大小是有限的,InnoDB采用的是LRU算法来挺高缓存命中率。但是有两种情况:
- InnoDB提供了一个预读的服务,会提前加载其他还没访问到的页进buffer pool。如果之后访问到了这些页,那会极大提高加载速度,但是没读到就会浪费buffer pool的空间。
- 当进行全表扫描的相关语句时,可能会把整个buffer pool更新一遍,可能会顶掉别的常访问的页。
总结就是
- 加载到
Buffer Pool
中的页不一定被用到。 - 如果非常多的使用频率偏低的页被同时加载到
Buffer Pool
时,可能会把那些使用频率非常高的页从Buffer Pool
中淘汰掉。
为了防止上面的情况,InnoDB把LRU链表分成两部分:
-
一部分存储使用频率非常高的缓存页,所以这一部分链表也叫做
热数据
,或者称young区域
。 -
另一部分存储使用频率不是很高的缓存页,所以这一部分链表也叫做
冷数据
,或者称old区域
。
做了这个划分之后,
- 预加载的数据会被放到old区的头部,不会影响young区。
- 全表扫描时,首次加载会放在old区,如果后续被访问到,会被放到young区。
总结
Buffer Pool的LRU链表也是一种分代的想法。很多技术的实现都有相似的地方。