Rides的内存回收算法?

狂风中的少年 提交于 2020-08-10 22:48:49

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,按照访问时间排序后,淘汰掉最近一段时间最少使用的那个。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!