精华内容
下载资源
问答
  • Belady现象:在采用FIFO算法时,有时会出现分配的物理页数增加,缺页率反而提高的异常现象。 Belady现象的原因:FIFO算法的置换特征与进程访问内+存的动态特征是矛盾的。与置换算法的目标是不一致的(即替换较少使用...

    Belady现象:在采用FIFO算法时,有时会出现分配的物理页数增加,缺页率反而提高的异常现象。

    Belady现象的原因:FIFO算法的置换特征与进程访问内+存的动态特征是矛盾的。与置换算法的目标是不一致的(即替换较少使用的页面)。因此,被它置换出去的页面并不一定是进程不会访问的。

    为什么FIFO算法会产生Belady现象,而LRU算法不会产生Belady现象:

    解答:因为LRU算法符合栈算法的特点,而FIFO算法不符合栈算法的特点。栈算法的特点是给与的物理页帧越多,所产生的缺页中断的次数就越少。

    思考:Clock algorithm 和 Enhanced Clock algorithm 是否会产生Belady现象?


    LRUFIFO和Clock的比较:

    • LRU算法和FIFO算法本质上都是先进先出的思路。只不过LRU针对页面最近访问的时间来进行排序。所以需要在每一次页面访问的时候动态地调整各个页面之间的先后顺序(有一个页面最近访问的时间变了);而FIFO是针对页面进入内存的时间来进行排序,这个时间是固定不变的。所以页面之间的先后顺序是固定的。如果一个页面在进入内存后没有被访问。那么它最近访问的时间就是它进入内存的时间。换句话说,如果内存当中所有的页面都未曾访问过,那么LRU算法就退化为FIFO算法。

    • LRU算法性能比较好,但系统的开销比较大;FIFO算法系统的开销比较小,但有可能会发生Belady现象。因此,折中的办法就是Clock算法,在每一次页面访问时,它不必动态的区调整页面在链表中的顺序,而仅仅是做一个标记,然后等到发生缺页中断的时候,再把它移动到链表尾端。对于内存中那些未被访问的页面,Clock算法的表现和LRU一样好;而对于那些曾经被访问过的页面,它不能像LRU算法那样,记住它们准确的位置。


    前言:之前介绍的各种页面置换算法,都是基于一个前提。即程序的局部性原理。但考虑此原理是否成立?就存在以下两种情况:

    • 如果程序的局部性原理不成立。那么各种页面置换算法就没有什么分别,也没有什么意义。
    • 如果局部性原理是成立的,那么如何证明它的存在,如何对它进行定量的分析?这就是工作集模型!

    工作集:一个进程当前正在使用的逻辑页面的集合。可以用一个二元函数 W(t,^)来表示:

    • t是当前的执行时刻
    • ^称为工作集窗口(working-set window),即一个定长的页面访问的时间窗口(^是不变的)
    • w(t,^)=在当前的时刻t之前的 ^时间窗口当中的所有页面所组成的集合(随着t的变化,该集合也在不断地变化);
    • | W(t,^) |,值工作集的大小,集页面的数目;

    工作集大小的变化:进程开始执行后,随着访问新页面逐步建立较稳定的工作集。当内存访问的局部性区域的位置大致稳定时,工作集的大小也大致稳定;局部性区域的位置改变时,工作集快速的扩张和收缩过渡到下一个稳定值。

    常驻集是指在当前时刻,进程实际驻留在内存当中的页面集合。

    • 工作集是进程在运行过程中固有的性质,而常驻集取决于系统分配给进程的物理页面的数目,以及所采用的页面置换算法;
    • 如果一个进程的整个工作集都在内存当中,即常驻集包含或者等于工作集,那么进程将很顺利地进行,而不会产生太多的缺页中断(直到工作集发生剧烈的变动,从而过渡到另外一个状态);
    • 当进程常驻集的大小达到某个数目以后,再给它分配更多的物理页面,缺页率也不会明显的下降。

    提示:为了更好的理解知识点,博主在微信公众号中将操作系统知识进行了重新排版和插入图片。感兴趣的朋友可以扫码进行关注。

    在这里插入图片描述

    展开全文
  • 二、缺页率页面置换算法 (PFF) 上述算法的窗口大小是固定的,而在PFF算法中,窗口大小是可以变化的。在每个进程运行开始时,先根据程序大小分配一定数目的物理页面,在运行过程中再根据缺页率来调整窗口大小。...

              程序在运行过程中具有阶段性,可能刚开始的时候需要访问的内存很多,之后访问的内存可能会很少。如果操作系统给每个程序分配固定的物理页那么就显得不灵活,有没有办法动态地给程序分配页帧呢,在需要访问很多内存的时候多分配点页,不需要访问过多内存的时候少分配点页?

             工作集模型:工作程序需要有局部性原理(邻近的代码变量分配在相邻的空间,一条指令的一次执行和下次执行都在很短的时间)。工作集是一个进程当前正在使用的逻辑页面集合。可以用 W(t,Δ) 二元式表示t时刻Δ窗口中的页面组成的集合, ,其中t 表示当前执行时刻,而Δ表示工作集窗口,是一个定长的页面访问的时间窗口 。 |W(t,Δ)| 表示工作集大小,页面数量。

             

             常驻集概念:常驻集是工作集的一种,指在当前某个时刻,进程实际驻留在内存当中的页面集合。工作集是需要访问在内存的页面集合。由于在某个时刻需要访问的内存数量有限,所以整个执行过程中常驻集是有最大值的,当操作系统给程序的常驻集太大也可能造成空间上的浪费。

     

    一、工作集的页置换算法

           工作集的页置换算法并不是只有发生缺页中断时才把页换出到外存。随着程序在执行,工作集的窗口会跟着挪动,如果页不在工作集窗口中就会把页换出

     

    这种置换算法虽然增加了缺页中断,但是却可以有效地保留最近访问的页,提前换出内存中的物理页,给其他应用程序提供更多的内存空间,达到动态分配内存空间的目的。与此同时,由于大部分写硬盘操作是提前完成的,所以当发生缺页中断时,大多数情况只需要写内存操作就行。

     

    二、缺页率页面置换算法 (PFF)

           上述算法的窗口大小是固定的,而在PFF算法中,窗口大小是可以变化的。在每个进程运行开始时,先根据程序大小分配一定数目的物理页面,在运行过程中再根据缺页率来调整窗口大小。缺页率过低说明需要的物理页面足够,需要减小工作集,过低则表示分配的物理页不够需要增大工作集,来进行动态地调整工作集窗口大小。

          缺页率 = 缺页次数 /内存访问次数    , 也是 缺页次数关于程序执行时间的导数。

          在下例中,Window size 代表缺页中断的时间间隔。

          

        此方法相比工作集算法更灵活,但是实现起来会复杂些。

     

    三、抖动问题

         如果操作系统分配给进程的物理页面太少,则不能包含整个工作集,随着驻留内存的进程数目增加,分配给进程的页面数减少,容易发生频繁的缺页中断,这个现象称之为“抖动”,所以操作系统需要选择一个适当的进程数目和进程需要的帧数,以便在并发水平和缺页率中保持一个平衡。 例如当计算机刚开机时,CPU的利用率很高,随着操作系统运行的时间越来越久,进程的数量越来越多,如果缺页率高CPU可能在频繁地做页的换入换出操作,使CPU的系统利用率低,造成在运行的程序效率低。 如何量化都动问题呢?在性能测试中,需要计算 平均的缺页时间,即大概多久会平均产生一次缺页 ,需要计算出缺页时换入换出时间。 当 平均的缺页时间 接近  缺页时换入换出时间 时,CPU能够高效且高并发的为系统所利用。

    展开全文
  • 文章目录垃圾回收概述垃圾回收相关算法标记阶段:引用计数法标记阶段:可达性分析算法对象的finalization机制MAT的GC Roots溯源清除阶段:标记-清除算法清除阶段:复制算法清除阶段:标记-压缩算法小结分代收集算法...

    垃圾回收概述

    关于垃圾收集的三个经典问题:

    • 哪些内存需要回收?
    • 什么时候回收?
    • 如何回收?

    什么是垃圾?

    • 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。

    如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占用的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出。

    在早期的C、C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放。

    现在,除了Java以外,C#、Python等语言都使用了自动垃圾回收的思想,也是未来发展趋势。

    Java垃圾回收机制

    • 自动内存管理,无需开发人员手动参与内存的分配与回收,降低了内存泄漏和内存溢出的风险;
      • 没有垃圾回收期,Java也会和cpp一样,各种野指针,泄漏问题;
    • 自动内存管理机制,将程序员从繁重的内存管理中释放出来,专注业务开发。
    • 当需要排查各种内存溢出、内存泄漏问题时,我们必须对这些自动化技术实施必要的监控和调节;

    GC的作用区域:堆和方法区。

    垃圾回收相关算法

    标记阶段:引用计数法

    在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是死亡对象。只有被标记为死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的空间。

    判断对象存活一般有两种方式:引用计数算法和可达性分析算法。

    引用计数算法比较简单,对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。

    • 对于一个对象A,只有有一个对象引用了A,则A的引用计数器就加1,;当引用失效时,引用计数器就减一。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收。

    优点:实现简单,垃圾对象便于辨识,判定效率高,回收没有延迟性。

    缺点:

    • 需要单独的字段存储计数器,增加了存储空间的开销;
    • 引用计数器有一个严重的问题,无法处理循环引用的问题。这是一条致命缺陷,导致在Java的垃圾回收器中没有采用这类算法。
    publicclassMyObject {
    
        publicObject ref =null;
    
        publicstaticvoidmain(String[] args) {
            MyObject myObject1 =newMyObject();
            MyObject myObject2 =newMyObject();
            myObject1.ref = myObject2;
            myObject2.ref = myObject1;
            myObject1 =null;
            myObject2 =null;
        }
    }
    

    即使myObject1和myObject2设置为null,但是堆中的对象引用计数器不为0。

    标记阶段:可达性分析算法

    相对于引用计数算法而言,可达性分析算法不仅具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生。

    所谓"GC Roots"根集合就是一组必须活跃的引用。

    基本思路:

    • 可达性分析算法是以根对象集合(GC Roots)为起始点,按照从上到下的方式搜索被根对象集合所连接的目标对象是否可达;
    • 使用可达性分析算法后,内存中的存活对象都会被根对象集合直接或间接连接着,搜索所走过的路劲称为引用链(Reference Chain);
    • 如果目标对象没有任何引用链相连,则是不可达的,就意味着该对象已经死亡,可以标记为垃圾对象;
    • 在可达性分析算法中,只有能够被根对象集合直接或间接连接的对象才是存活对象。

    在Java语言中,GC Roots包括以下几类元素:

    • 虚拟机栈中引用的对象
      • 比如各个线程被调用的方法中使用到的参数、局部变量等;
    • 本地方法栈内引用的对象
    • 方法区中类静态属性所引用的对象
      • Java类的引用类型静态变量
    • 方法区中常量引用的对象
      • 字符串常量池中的引用
    • 所有被同步锁Synchronized持有的对象
    • Java虚拟机内部的引用
      • 基本数据类型对象的Class对象、一些常驻的异常对象(如,NullPointerException、OutOfMemoryError)、系统类加载器;

    除了这些固定的GC Roots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象"临时性"地加入,共同构成完整的GC Roots集合。比如:分代收集和局部回收。

    注意:如果要使用可达性分析算法来判断内存是否可回收,那么分析工作必须在一个能保障一致性的快照中进行。这点也是导致GC进行时,必须"Stop The World"的一个重要原因。

    即使是号称几乎不会发生停顿的CMS收集器中,枚举根节点时也是必须要停顿的。

    对象的finalization机制

    • Java语言提供了对象终止机制来允许开发人员提供对象被销毁之前的自定义处理逻辑;
    • 当垃圾回收器发现没有引用指向一个对象,即:垃圾收集此对象之前,总会先调用这个对象的finalize()方法;
    • finalize()方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放的工作,比如关闭文件、套接字和数据库连接。
    • 永远不要主动调用某个对象的finalize()方法,应该交给垃圾回收机制调用,
      • 在finalize()时可能会导致对象复活;
      • finalize()方法的执行时间是没有保障的,它完全由GC线程决定,极端情况下,若不发生GC,则finalize()方法将没有执行机会;
      • 一个糟糕的finalize()会严重影响GC的性能;
    • 由于finalize()方法的存在,虚拟机中的对象一般处于三种可能的状态:
      • 可触及的:从根节点开始,可以到达这个对象;
      • 可复活的:对象的所有引用都被释放,但是对象有可能在finalize()中复活;
      • 不可触及的:对象的finalize()被调用,并且没有复活,那么就进入不可触及状态。不可触及的对象是不可能被复活,因为finalize()方法只会调用一次。

    具体过程:

    在这里插入图片描述

    MAT的GC Roots溯源

    MAT:The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.

    快速且功能丰富的Java堆分析仪,帮助你找到内存泄漏,减少内存消耗。

    package org.westos.gc;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Scanner;
    
    /**
     * @author lwj
     * @date 2020/9/16 17:31
     */
    public class GcRootsTest {
        public static void main(String[] args) {
            List<Object> numList = new ArrayList<>();
            Date date = new Date();
            for (int i = 0; i < 100; i++) {
                numList.add(String.valueOf(i));
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("数据添加完毕,请操作。");
            new Scanner(System.in).next();
            numList = null;
            date = null;
            System.out.println("numList、date已置空,请操作。");
            new Scanner(System.in).next();
            System.out.println("结束");
        }
    }
    

    使用jvisualvm完成堆dump。

    保存为文件。

    使用MAT打开文件查看。

    在这里插入图片描述

    在这里插入图片描述

    清除阶段:标记-清除算法

    当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对象分配内存。

    执行过程:

    当堆中的有效内存空间被耗尽的时候,就会停止整个程序(Stop The World),然后进行两项工作,第一项是标记,第二项是清除。

    • 标记:Collector从引用根节点开始遍历,标记所有被引用的对象,一般是在对象的Header中记录为可达对象;
    • 清除:Collectot对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记可达对象,则将其回收。

    缺点:

    • 效率不算高;
    • 在进行GC时候,需要停止整个应用程序;
    • 这种方式清理出来的空闲内存是不连续的,产生内存碎片,需要维护一个空闲列表;

    注意:

    这里所谓的清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表中。下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放。

    清除阶段:复制算法

    核心思想:

    将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾收集。

    在这里插入图片描述

    优点:

    • 没有标记-清除的过程,实现简单,运行高效;
    • 复制过去以后保证空间的连续性,不会出现碎片问题;

    缺点:

    • 需要两倍的内存空间;
    • 需要维护对象的引用关系;

    清除阶段:标记-压缩算法

    背景:

    复制算法的高效性是建立在存活对象少、垃圾对象多的前提下。这种情况在新生代经常发生,但是在老年代,更常见的情况是大部分对象都是存活对象,如果依然使用复制算法,由于存活对象多,复制的成本也将很高。因此,基于老年代垃圾回收的特性,需要使用其他的算法

    标记-清除算法的确可以应用在老年代,但是该算法不仅执行效率低下,而且在执行完内存回收后,还会产生内存碎片,所以JVM的设计者需要在此基础上进程改进,标记-压缩算法由此诞生。

    执行过程:

    第一阶段和标记-清除算法一致,从根节点开始标记所有被引用对象。

    第二阶段将所有的存活对象压缩到内存的另一端,按顺序排放。

    之后,清理边界外所有空间。

    二者的本质差异在于标记清除算法是一种非移动式的回收算法,标记压缩是移动式的。

    可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,jvm只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。

    小结

    标记清除标记压缩复制
    速度中等最慢最快
    空间开销少(但会堆积碎片)少(不堆积碎片)通常需要活对象的2倍大小(不堆积碎片)
    移动对象

    分代收集算法

    目前几乎所有的GC都是采用分代收集算法执行垃圾回收的。

    在HotSpot中,基于分代的概念,GC所使用的内存回收算法必须结合年轻代和老年代各自的特点。

    年轻代:

    特点:区域相对老年代较小,对象声明周期短、存活率低,回收频繁。

    这种情况复制算法的回收整理,速度是最快的。复制算法的效率只和当前存活对象的大小有关。因此很适合于年轻代的回收。而复制算法内存利用率不高,通过HotSpot中的两个Survivor的设计得以缓解。

    老年代:

    特点:区域较大,对象生命周期长、存活率高,回收不及年轻代频繁。

    这种情况存在大量存活率高的对象,复制算法明显变得不合适。一般是由标记-清除或者是标记-清除与标记-整理的混合实现。

    增量收集算法

    基本思想:

    如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行。每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。

    总的来说,增量收集算法的基础仍是传统的标记-清除和复制算法、增量收集算法通过对线程间冲突的妥善处理,允许垃圾收集线程以分阶段的方式完成标记、清理或复制工作。

    缺点:

    由于在垃圾回收过程中,间断性的还执行了应用程序代码,所以能减少系统的停顿时间,但是因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。

    分区算法

    在这里插入图片描述

    展开全文
  • 3分钟了解今日头条推荐算法原理 今天,算法分发已经是信息平台、搜索引擎、浏览器、社交软件等几乎所有软件的标配,但同时,算法也开始面临质疑、挑战和误解。今日头条的推荐算法,从2012年9月第一版开发运行至今...

    3分钟了解今日头条推荐算法原理

    今天,算法分发已经是信息平台、搜索引擎、浏览器、社交软件等几乎所有软件的标配,但同时,算法也开始面临质疑、挑战和误解。今日头条的推荐算法,从2012年9月第一版开发运行至今,已经经过四次大的调整和修改。

    今日头条委托资深算法架构师曹欢欢博士,公开今日头条的算法原理,以期推动整个行业问诊算法、建言算法;通过让算法透明,来消除各界对算法的误解,并逐步推动整个行业让算法更好的造福社会。

    以下为《今日头条算法原理》全文。

    今日头条资深算法架构师曹欢欢:

    本次分享将主要介绍今日头条推荐系统概览以及内容分析、用户标签、评估分析,内容安全等原理。

    一、系统概览

    展开全文
  • 页面置换算法

    2021-08-12 17:13:20
    文章目录局部置换算法最优页面置换算法先进先出算法(first-in first-out,FIFO)最近最久未使用算法(LRU)时钟...页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键的应用程序。 实现
  • 十二、全局置换算法

    2021-08-30 19:29:53
    文章目录1、局部置换算法的问题2、工作集模型2.1 工作集2.2 常驻集 1、局部置换算法的问题 \qquad局部置换算法给每个程序分配固定的页帧数,但是一个程序在不同的运行阶段所需要的页帧数量可能大不相同,因此局部...
  • 采用FIFO等算法时,可能出现分配的物理页面数增加,缺页次数反而升高的现象 原因: FIFO算法的置换特征与进程访问内存的动态特征矛盾 被它置换出去的页面并不一定是进程近期不会访问的 FIFO算法开销小 有Belady现象 ...
  • 【推荐架构day5】今日头条算法的基本原理

    万次阅读 多人点赞 2020-02-22 16:03:37
    本文来自今日头条曹欢欢博士的分享。...今日头条委托资深算法架构师曹欢欢博士,公开今日头条的算法原理,以期推动整个行业问诊算法、建言算法;通过让算法透明,来消除各界对算法的误解,并逐步推动整个行业让算...
  • 一、页面置环算法的概念 1、页面置环算法的概念 ...③页面锁定(frame locking):用于描述必须常驻内存的内存的逻辑页面;操作系统的关键部分,或时间关键的应用进程(time-critical)。需要在页表中添加...
  • SparseLDA算法

    2014-10-28 20:37:00
    2 SparseLDA算法 本章将介绍一种Gibbs Sampling算法的加速算法——SparseLDA [9],它主要利用LDA 模型的稀疏性,来达到加速以及节省内存的目的,是一种精确算法(没有近似)。 2.1 背景 q(z)=ntk,¬i+βnk,¬...
  • 今日头条算法原理

    2018-09-04 13:20:09
    本文转载自 今日头条算法原理 今天,算法分发已经是信息平台、搜索引擎、浏览器、社交软件等几乎所有软件的标配,但同时,算法也开始面临质疑、挑战和误解。今日头条的推荐算法,从2012年9月第一版开发运行至今,...
  • 相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和高效等特点,更重要的是该算法可以有效的解决在引用计数算法中循环引用的问题,防止内存泄露的发生。 相较于引用技术算法,这里的可达性分析就是Java...
  • 0040-垃圾收集算法

    千次阅读 2020-06-29 15:28:35
    垃圾清除阶段算法4.1 标记-清除(Mark-Sweep)4.2 复制算法(Copying)4.3 标记-压缩算法(Mark-Compact)4.4 三种算法的比较5. 分代收集算法6. 补充算法6.1 增量收集算法6.2 分区算法 1. 前言 垃圾回收分为两个...
  • 今日头条算法原理(全文)

    千次阅读 2020-06-03 15:06:39
    今天,算法分发已经是信息平台、搜索引擎、浏览器、社交软件等几乎所有软件的标配,但同时,算法也开始面临质疑、挑战和误解。今日头条的推荐算法,从2012年9月第一版开发运行至今,已经经过四次大的调整和修改。 ...
  • 雪花算法

    千次阅读 2020-07-20 18:38:04
    目录为什么需要分布式全局唯一ID以及分布式ID的业务需求ID生成规则部分硬性要求ID号生成系统的可用性要求一般通过方案UUID数据库自增主键基于redis生成全局id策略雪花算法结构源码工程落地经验优缺点 ...
  • 页面置换算法全局页面置换算法工作集和常驻集工作集页置换算法缺页率页面置换算法抖动问题 全局页面置换算法 工作集和常驻集 局部页面置换算法都针对一个程序/进程来进行操作的,然而OS可以同时执行多个程序,如果每...
  • 可达性分析算法

    2021-07-21 18:54:27
    相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生。 相较于引用计数算法,这里的可达性分析就是...
  • 垃圾回收之标记算法

    2020-06-17 18:20:53
    引用计数算法、可达性分析算法
  • GC算法简述

    2017-03-03 15:44:25
    引用计数法对于一个对象A,只要有任何一个对象引用了A,则A的计数器就加1。...标记清除法(Mark-Sweep)Mark-Sweep是现代垃圾回收算法的思想基础,该算法分为两个阶段: 标记阶段 清除阶段 一种可行的
  • 操作系统页面置换算法c++

    千次阅读 2016-03-21 18:06:01
    描述必须常驻内存的逻辑页面,操作系统的关键部分,要求响应速度的代码和数据,页表中的锁定标志位 置换算法的评价: 记录所有存储单元的轨迹。模拟置换算法,缺页率。 局部置换算法: 仅限于
  • JVM垃圾回收算法

    2018-06-26 01:45:24
    从效率跟空间上来看这种算法存在不足:标记跟清除都需要扫描所有对象,有些对象是常驻内存的,存在着很多多余的操作;清除之后空间存在很多的不连续,以后创建对象地址分配无法找到连续的内存,会频繁的触发垃圾回收...
  • 室内定位指纹算法

    万次阅读 2015-06-04 07:54:56
    最近在做一个基于蓝牙的室内定位的项目,做了一个三角定位算法,由于室内的环境比较复杂,信号反射折射比较多,很多时候信号的大小(RSSI)跟距离并不是完全一一对应的,可能远的地方信号反而更强,三角质心定位算法...
  • 海量数据处理算法—Bloom Filter 目录 海量数据处理算法—Bloom Filter 1. Bloom-Filter算法简介 2、 Bloom-Filter的基本思想 3. 扩展 Counter Bloom-filter Compressed Bloom Filter 4. Bloom Filter的应用...
  • JVM垃圾收集器算法

    2019-05-28 11:24:16
    Java垃圾收集器常用算法: 1、引用计数算法 引用计数算法用于标记对象是否存活,严格来说它并不属于垃圾收集算法,只是垃圾收集的辅助算法。它是通过给对象添加一个引用计数器,每当有一个地方引用它时,计数器加1...
  • 1.页面置换算法的概念 功能和目标 置换算法并不是针对一个进程,而是一系列进程 1 页面锁定 有些页面是不能把它放到外存里的 2 置换算法的评价方法 通过记录进程访问内存的页面轨迹来模拟页面置换行为,...
  • OS之页面置换算法

    2019-06-08 17:34:22
    之前几篇博客记录了OS内存管理的一些知识和技术,接下来将继续深入,介绍一些页面置换算法,这里包括一些我们大家都略有耳闻的算法。 置换算法 当出现缺页故障时,需要从外存调入新的页面到内存中去,而如果此时内存...
  • 待学算法

    2020-10-09 18:40:51
    k-均值算法 列表搜索 线性搜索 二分搜索 图表搜索 广度优先搜索 深度优先搜索 贝尔曼-福特算法 戴克斯特拉算法 A*搜索算法 数学 辗转相除法 素性测试 数据压缩 游程编码 霍夫曼编码 安全 安全基础知识 加密基础知识 ...
  • 内存页面置换算法

    2020-08-21 11:22:14
    文章目录内存页面置换算法页面置换算法的概念置换算法的功能和目标置换算法的评价方法页面置换算法分类页面置换算法总结最优页面置换算法(OPT, optimal)先进先出算法(First-In First-Out, FIFO)最近最久未使用算法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,444
精华内容 7,377
关键字:

常驻算法