精华内容
下载资源
问答
  • JVM垃圾回收算法有哪几些?

    千次阅读 2018-02-04 12:22:40
    常用的垃圾回收算法有如下四:标记-清除、复制、标记-整理和分代收集。 标记-清除算法 从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉...

    常用的垃圾回收算法有如下四种:标记-清除、复制、标记-整理和分代收集。

    标记-清除算法
    从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。

    这个算法简单,但是有两个缺点:一是标记和清除的效率不是很高;二是标记和清除后会产生很多的内存碎片,导致可用的内存空间不连续,当分配大对象的时候,没有足够的空间时不得不提前触发一次垃圾回收。

    复制算法
    这个算法将可用的内存空间分为大小相等的两块,每次只是用其中的一块,当这一块被用完的时候,就将还存活的对象复制到另一块中,然后把原已使用过的那一块内存空间一次回收掉。这个算法常用于新生代的垃圾回收。

    复制算法解决了标记-清除算法的效率问题,以空间换时间,但是当存活对象非常多的时候,复制操作效率将会变低,而且每次只能使用一半的内存空间,利用率不高。

    标记-整理算法
    这个算法分为三部分:一是标记出所有需要被回收的对象;二是把所有存活的对象都向一端移动;三是把所有存活对象边界以外的内存空间都回收掉。

    标记-整理算法解决了复制算法多复制效率低、空间利用率低的问题,同时也解决了内存碎片的问题。

    分代收集算法
    根据对象生存周期的不同将内存空间划分为不同的块,然后对不同的块使用不同的回收算法。一般把Java堆分为新生代和老年代,新生代中对象的存活周期短,只有少量存活的对象,所以可以使用复制算法,而老年代中对象存活时间长,而且对象比较多,所以可以采用标记-清除和标记-整理算法。
    这里写图片描述

    展开全文
  • 常用的垃圾回收算法有如下四:标记-清除、复制、标记-整理和分代收集。 标记-清除算法 从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉...
    添加微信BGM7756  领取最全面试资料!
    

    常用的垃圾回收算法有如下四种:标记-清除、复制、标记-整理和分代收集。

    标记-清除算法

    从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。

    这个算法简单,但是有两个缺点:一是标记和清除的效率不是很高;二是标记和清除后会产生很多的内存碎片,导致可用的内存空间不连续,当分配大对象的时候,没有足够的空间时不得不提前触发一次垃圾回收。

    复制算法

    这个算法将可用的内存空间分为大小相等的两块,每次只是用其中的一块,当这一块被用完的时候,就将还存活的对象复制到另一块中,然后把原已使用过的那一块内存空间一次回收掉。这个算法常用于新生代的垃圾回收。

    复制算法解决了标记-清除算法的效率问题,以空间换时间,但是当存活对象非常多的时候,复制操作效率将会变低,而且每次只能使用一半的内存空间,利用率不高。

    标记-整理算法

    这个算法分为三部分:一是标记出所有需要被回收的对象;二是把所有存活的对象都向一端移动;三是把所有存活对象边界以外的内存空间都回收掉。

    标记-整理算法解决了复制算法多复制效率低、空间利用率低的问题,同时也解决了内存碎片的问题。

    分代收集算法

    根据对象生存周期的不同将内存空间划分为不同的块,然后对不同的块使用不同的回收算法。一般把Java堆分为新生代和老年代,新生代中对象的存活周期短,只有少量存活的对象,所以可以使用复制算法,而老年代中对象存活时间长,而且对象比较多,所以可以采用标记-清除和标记-整理算法。

    篇幅有限,部分资料图片如下,有需要的朋友添加微信BGM7756 获取资料的免费领取方式吧,希望能给您找工作提供很好的帮助!

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 常用的垃圾回收算法有如下四:标记-清除、复制、标记-整理和分代收集。标记-清除算法从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有...

    「每天一道面试题」JVM垃圾回收算法有哪几些?

    常用的垃圾回收算法有如下四种:标记-清除、复制、标记-整理和分代收集。

    标记-清除算法

    从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。

    这个算法简单,但是有两个缺点:一是标记和清除的效率不是很高;二是标记和清除后会产生很多的内存碎片,导致可用的内存空间不连续,当分配大对象的时候,没有足够的空间时不得不提前触发一次垃圾回收。

    复制算法

    这个算法将可用的内存空间分为大小相等的两块,每次只是用其中的一块,当这一块被用完的时候,就将还存活的对象复制到另一块中,然后把原已使用过的那一块内存空间一次回收掉。这个算法常用于新生代的垃圾回收。

    复制算法解决了标记-清除算法的效率问题,以空间换时间,但是当存活对象非常多的时候,复制操作效率将会变低,而且每次只能使用一半的内存空间,利用率不高。

    标记-整理算法

    这个算法分为三部分:一是标记出所有需要被回收的对象;二是把所有存活的对象都向一端移动;三是把所有存活对象边界以外的内存空间都回收掉。

    标记-整理算法解决了复制算法多复制效率低、空间利用率低的问题,同时也解决了内存碎片的问题。

    分代收集算法

    根据对象生存周期的不同将内存空间划分为不同的块,然后对不同的块使用不同的回收算法。一般把Java堆分为新生代和老年代,新生代中对象的存活周期短,只有少量存活的对象,所以可以使用复制算法,而老年代中对象存活时间长,而且对象比较多,所以可以采用标记-清除和标记-整理算法。

    展开全文
  • 常用缓存算法

    2011-12-27 15:37:00
    (以下的几种缓存算法的我也理解不好,如果感兴趣,你可以Google一下) Least Frequently Used(LFU): 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率。我会把最不常用的缓存对象踢走。 ...

    没有人能说清哪种缓存算法优于其他的缓存算法。(以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下)

    Least Frequently Used(LFU):

    大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率。我会把最不常用的缓存对象踢走。

    Least Recently User(LRU):

    我是LRU缓存算法,我把最近最少使用的缓存对象给踢走。

    我总是需要去了解在什么时候,用了哪个缓存对象。如果有人想要了解我为什么总能把最近最少使用的对象踢掉,是非常困难的。

    浏览器就是使用了我(LRU)作为缓存算法。新的对象会被放在缓存的顶部,当缓存达到了容量极限,我会把底部的对象踢走,而技巧就是:我会把最新被访问的缓存对象,放到缓存池的顶部。

    所以,经常被读取的缓存对象就会一直呆在缓存池中。有两种方法可以实现我,array 或者是 linked list。

    我的速度很快,我也可以被数据访问模式适配。我有一个大家庭,他们都可以完善我,甚至做的比我更好(我确实有时会嫉妒,但是没关系)。我家庭的一些成员包括LRU2 和 2Q,他们就是为了完善 LRU 而存在的。

    Least Recently Used 2(LRU2):

    我是 Least Recently Used 2,有人叫我最近最少使用twice,我更喜欢这个叫法。我会把被两次访问过的对象放入缓存池,当缓存池满了之后,我会把有两次最少使用的缓存对象踢走。 因为需要跟踪对象2次,访问负载就会随着缓存池的增加而增加。如果把我用在大容量的缓存池中,就会有问题。另外,我还需要跟踪那么不在缓存的对象,因为他 们还没有被第二次读取。我比LRU好,而且是 adoptive to access 模式 。

    Two Queues(2Q):

    我是 Two Queues;我把被访问的数据放到LRU的缓存中,如果这个对象再一次被访问,我就把他转移到第二个、更大的LRU缓存。

    我踢走缓存对象是为了保持第一个缓存池是第二个缓存池的1/3。当缓存的访问负载是固定的时候,把 LRU 换成 LRU2,就比增加缓存的容量更好。这种机制使得我比 LRU2 更好,我也是 LRU 家族中的一员,而且是 adoptive to access 模式 。

    Adaptive Replacement Cache(ARC):

    我是 ARC,有人说我是介于 LRU 和 LFU 之间,为了提高效果,我是由2个 LRU 组成,第一个,也就是 L1,包含的条目是最近只被使用过一次的,而第二个 LRU,也就是 L2,包含的是最近被使用过两次的条目。因此, L1 放的是新的对象,而 L2 放的是常用的对象。所以,别人才会认为我是介于 LRU 和 LFU 之间的,不过没关系,我不介意。

    我被认为是性能最好的缓存算法之一,能够自调,并且是低负载的。我也保存着历史对象,这样,我就可以记住那些被移除的对象,同时,也让我可以看到被移除的对象是否可以留下,取而代之的是踢走别的对象。我的记忆力很差,但是我很快,适用性也强。

    Most Recently Used(MRU):

    我是 MRU,和 LRU 是对应的。我会移除最近最多被使用的对象,你一定会问我为什么。好吧,让我告诉你,当一次访问过来的时候,有些事情是无法预测的,并且在缓存系统中找出最少最近使用的对象是一项时间复杂度非常高的运算,这就是为什么我是最好的选择。

    我是数据库内存缓存中是多么的常见!每当一次缓存记录的使用,我会把它放到栈的顶端。当栈满了的时候,你猜怎么着?我会把栈顶的对象给换成新进来的对象!

    First in First out(FIFO):

    我是先进先出,我是一个低负载的算法,并且对缓存对象的管理要求不高。我通过一个队列去跟踪所有的缓存对象,最近最常用的缓存对象放在后面,而更早的缓存对象放在前面,当缓存容量满时,排在前面的缓存对象会被踢走,然后把新的缓存对象加进去。我很快,但是我并不适用。

    Second Chance:

    大家好,我是 second chance,我是通过FIFO修改而来的,被大家叫做 second chance 缓存算法,我比 FIFO 好的地方是我改善了 FIFO 的成本。我是 FIFO 一样也是在观察队列的前端,但是很FIFO的立刻踢出不同,我会检查即将要被踢出的对象有没有之前被使用过的标志(1一个bit表示),没有没有被使用 过,我就把他踢出;否则,我会把这个标志位清除,然后把这个缓存对象当做新增缓存对象加入队列。你可以想象就这就像一个环队列。当我再一次在队头碰到这个 对象时,由于他已经没有这个标志位了,所以我立刻就把他踢开了。我在速度上比FIFO快。

    CLock

    我是Clock,一个更好的FIFO,也比 second chance更好。因为我不会像second chance那样把有标志的缓存对象放到队列的尾部,但是也可以达到second chance的效果。

    我持有一个装有缓存对象的环形列表,头指针指向列表中最老的缓存对象。当缓存miss发生并且没有新的缓存空间时,我会问问指针指向的缓存对象的标 志位去决定我应该怎么做。如果标志是0,我会直接用新的缓存对象替代这个缓存对象;如果标志位是1,我会把头指针递增,然后重复这个过程,知道新的缓存对 象能够被放入。我比second chance更快。

    Simple time-based:

    我是 simple time-based 缓存算法,我通过绝对的时间周期去失效那些缓存对象。对于新增的对象,我会保存特定的时间。我很快,但是我并不适用。

    Extended time-based expiration:

    我是 extended time-based expiration 缓存算法,我是通过相对时间去失效缓存对象的;对于新增的缓存对象,我会保存特定的时间,比如是每5分钟,每天的12点。

    Sliding time-based expiration:

    我是 sliding time-based expiration,与前面不同的是,被我管理的缓存对象的生命起点是在这个缓存的最后被访问时间算起的。我很快,但是我也不太适用。

    好了!听了那么多缓存算法的自我介绍,其他的缓存算法还考虑到了下面几点:

    • 成本。如果缓存对象有不同的成本,应该把那些难以获得的对象保存下来。
    • 容量。如果缓存对象有不同的大小,应该把那些大的缓存对象清除,这样就可以让更多的小缓存对象进来了。
    • 时间。一些缓存还保存着缓存的过期时间。电脑会失效他们,因为他们已经过期了。

    根据缓存对象的大小而不管其他的缓存算法可能是有必要的。

    原文:http://www.zavakid.com/27

    转载于:https://www.cnblogs.com/ShepherlDeng/archive/2011/12/27/2303636.html

    展开全文
  • 关于GC常用算法的研究 GC策略解决了哪些问题? GC策略采用种算法? 对象分类 对象对应内存区域 ...既然是要进行自动GC,那必然会相应策略,而这些策略解决了哪些问题呢,粗略来说,主要以下点。1、
  • 常用缓存算法简介

    2012-01-19 09:47:00
    (以下的几种缓存算法的我也理解不好,如果感兴趣,你可以Google一下) Least Frequently Used(LFU): 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率。我会把最不常用的缓存对象踢走。 ...
  • 排序算法是一基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高。 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将 给出详细的说明...
  • 列存储中常用的数据压缩算法

    千次阅读 2016-03-20 21:35:25
    相较于行存储,列存储最大优势二,其一就是查询涉及到数据库的哪几个列就读哪几个列,不读一点与查询不相关列,大大减少了数据读取,其二就是数据库数据分为多个独立列来存储,相同数据类型数据连续存储...
  • 2.1.5 数据结构的几种存储方式 2.1.6 数据类型 2.1.7 常用的数据结构 2.1.8 选择合适的数据结构解决实际问题 2.2 线性表 2.2.1 什么是线性表 2.2.2 线性表的基本运算 2.3 顺序表结构 2.3.1 准备数据 2.3.2 初始化...
  • 这个面试时候也经常会问,让你比较某算法的适用条件,数据、特征量到什么规模时选用哪种算法。 (1)决策树 适用条件:数据不同类边界是非线性,并且通过不断将特征空间切分为矩阵来模拟。特征之间一定...
  • 前言 作为一个程序员,当然总是期望自己代码能「一次编写,四处运行」,但真实经验往往是「一处修改,百处填坑」,依赖...1.浏览器页面有哪三层构成,分别是什么,作用是什么? 2.HTML5优点与缺点? 3.Doctype作用?
  • 有哪几类?让我们开始今天的算法课堂~ 二叉数的概念和分类 二叉树是每个树节点最多有两个子树的一特殊的树结构,其有一些内在的性质,比如,若二叉树的层次从0开始,则在二叉树的第i层至多有 [公式] 个节点(i>...
  • 第十六套 习 题 1详细设计的基本任务是什么有哪几种描述方法 ? 答详细设计的基本任务包括 1为每个模块进行详细的算法设计 2为模块内的数据结构进行设计 3对数据库进行物理设计 4其他设计 5编写详细设计说明书 6评审...
  • 陕西工业职业技术学院 陕西工业职业技术学院 实用软件工程技术 第十六套 习 题 1详细设计的基本任务是什么有哪几种描述方法? 答详细设计的基本任务包括 1为每个模块进行详细的算法设计 2为模块内的数据结构进行设计 ...
  • (七)调度算法

    2018-10-26 21:43:00
    进程调度有哪几种方法?优先级调度的机制是什么? 参考: OS中常用的调度算法总结 调度算法的介绍及优缺点 linux进程(任务)调度算法 进程类型: IO消耗型(交互) 处理器消耗型(计算) 进程两种不同的优先级...
  • · JVM的垃圾算法有哪几种?CMS垃圾回收的基本流程? 基本的算法有: 标记-清除算法 等待被回收对象在被标记后直接对对象进行清除,会带来另一个新的问题——内存碎片化。如果下次有比较大的对象实例需要在堆上...
  • 二、Redis数据类型有哪几种 string hash list set sorted set 三、Redis过期策略都有哪些 内存淘汰机制 手写一个 LRU 算法 四、关于Redis持久化 若在项目中使用了Redis作缓存,就必须考虑持久化这是...
  • 1、操作系统中进程调度策略有哪几种? FCFS(先来先服务),优先级,时间片轮转,多级反馈 如果你想深入的了解这几种调度策略,推荐阅读:(常用的操作系统进程调度算法:...
  • Sedgewick畅销著作的最新版,反映了经过十年演化而成的算法核心知识体系  内容全面 全面论述排序、搜索、图处理和字符串处理的算法和数据结构,涵盖每位程序员应知应会的50算法  全新修订的代码 全新的Java...
  • 挖坑-算法题目

    2021-04-20 22:54:52
    -什么是空洞卷积? -XGB的参数怎么调? -ArcfaceLoss的原理 -样本不均衡的处理办法 -手写Transformer ... -常用的Pooling方法哪些?... -哪些激活函数?... -哪几种滤波器是平滑的? -...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 242
精华内容 96
关键字:

常用的算法有哪几种