Rides的内存回收算法有两种,一种是引用计数器算法,一种是LRU算法;
一、引用计数器算法:
引用计数器算法就是对于每一个创建的对象都绑定一个计数器,这个对象被使用的次数都被计数器记录着;
垃圾收集器在进行垃圾回收时,会检查每个对象的计数器是否为0,若为0则释放该对象占用的内存,不为0的计数器则会进行-1操作。
引用计数器算法的实现方式有侵入式和非侵入式两种;
引用计数器算法的优点:
使用引用计数器,内存回收可以穿插在程序的运行过程中,当发现某一对象的引用计数器为0时,立刻对该对象所占用的内存空间进行回收,这样可以避免在垃圾回收时需要暂停程序来进行。
引用计数器算法的缺点:
采用引用计数器进行垃圾回收,最大的缺点就是不能解决循环引用的问题,例如一个父对象持有一个子对象的引用,一个子对象也持有父对象的引用,这种情况下,父子对象将一直存在JVM的堆中,无法进行回收。
二、LRU(Least recently used)最近最少使用算法:
LRU算法是一种常用的页面置换算法,淘汰掉最近最少使用的页面。LRU算法会赋予每个页面一个访问字段,用来记录页面被访问的时间 t ,当现有的内存达到极限时则会淘汰现有所有页面中 t 值最大的(因为t值越大代表越久没有使用)。
LRU(Least recently used)最近最少使用算法实现方式:
LRU算法的经典实现方式就是HashMap + DoubleLinkedList,时间复杂度为 O(1)
但若是按照HashMap和双向链表来实现,就需要额外的存储存放next 和 prev 指针,会消耗较大的存储空间不是很划算。所以Rides中的LRU算法,就是随机取出若干个Key,按照访问时间排序后,淘汰掉最近一段时间最少使用的那个。
来源:oschina
链接:https://my.oschina.net/u/4432600/blog/4298130