我第一次与垃圾收集算法接触时,是在教师公园上。我忍不住提出了有关这个概念的一些问题。在日常生活中,我们对使用或没有用的东西非常熟悉?哪个行动通常是aunt aunt Aunt aunt aunt aunt aunt aunt。谁在这样做?
让我们以一个例子来回答上述问题,
在上面的代码中,我们首先声明变量,然后分配一个对象。在分配内存的策略中,该对象占用的存储空间被堆叠,并且此内存的地址存储在堆栈上。这是我们通常指的是参考类型存储的类型。当代码的下一行,当我们分配给值时,以下对象引用了以下对象,它有点相似吗?我们都知道内存非常昂贵,因此这将把这些垃圾作为字符的一部分。
从上面示例的描述中,我们基本上知道我们的工作。但是,我们需要一定的策略来做到这一点。以下将介绍两种常见算法:一半 - 区域复制方法和标记删除方法。HALF -DISTRICT REPICATION方法通常应用于新一代(不久的是内存)对象,并且标记清除方法通常应用于旧一代(留在记忆中)对象。旧一代对象如何?让我们稍后回答。
其中还有一个内存管理的概念可以解释:.。这是可以通过某些方式访问或可用的值。保证它们存储在内存中,如果无法访问它们,则需要回收。
对于新一代的对象,一半分区复制方法是一个很好的响应策略。一种记忆桩内存的一个分为两个,一个是使用状态中的空间,我们暂时称其为另一个是一个处于空闲状态的空间。
新添加的对象将存储。当要编写使用区域时,有必要执行垃圾清洁操作。
当垃圾回收开始时,新一代垃圾回收商将标记使用区域中的活动物体。标记完成后,使用区域的活动对象将被复制到空闲区域并进行排序。清洁空间所占用的空间。最后,角色是可以互换的,将原始使用区域转换为自由区,并将其转换为原始的免费区域区域进入使用区域。
当对象在多次复制后仍能生存时,它将被视为长寿周期的对象。它将转移到旧一代,并采用旧代代的垃圾回收策略进行管理。
这里的一个问题是如何实现标记?下面有几种方法
标记已清除。目前,该算法是最常用的。到目前为止,大多数浏览器都使用标记清除算法,但是主要的浏览器制造商还优化了该算法,不同的浏览器具有不同的浏览器。运行垃圾回收的频率存在差异。
该算法分为两个阶段。所有事件对象都标记了标记阶段,并且拆卸阶段被破坏而不标记(即非活性主义者)
执行引擎时,必须从开始点到标记的内存中的所有对象,并且有许多起点。我们称其为一组根对象,而SO称为的根对象实际上包含在浏览器环境中。
删除标记的过程大致如下:
删除算法的优势的优点只是一个,即实施相对简单,标记记录不过是两种情况。这允许二进制位置(0和1)标记它。
缺点标记算法有一个很大的缺点,也就是说,删除后,其余的对象记忆位置不变,这也会导致自由记忆空间不连续,出现(如下所示),并且由于其余的自由内存不是整片,它是由不同尺寸内存组成的内存列表,涉及内存分布的问题
假设我们需要新对象的大小来分配内存。由于自由存储器是间歇性和不连续的,因此我们需要进行一个路遍历才能找到一个与之相等的块,可以为其分配。
那么如何在许多片段中找到合适的内存?这里有三种分发策略可供选择:
这三种分配策略需要在各种情况下进行测试,以找到最佳策略。本质是如何平衡空间和比较。
标记算法的缺点是删除后剩余的对象位置保持不变,因此,只要您解决了这一点,就可以完美地解决这两个缺点(慢内存片段和分配速度)。
该算法可以有效地解决。其标记阶段和标记算法并没有不同,但是在标记结束后,标记汇编算法将移至内存的末端,最后清理边框以最终清理边界(如下所示),之后,之后集成,内存地址将是连续的,这有助于后续内存分配。