当前位置: 首页 > 网络应用技术

Java垃圾回收算法详细说明

时间:2023-03-06 18:53:29 网络应用技术

  早些时候,我们谈到了Java虚拟机的基本知识和运行时的数据区域的划分。在运行时的数据区域的划分中,可以将其分为线程共享区域和线程的私有区域。更直观的是,Java的大多数垃圾回收都发生在Java的堆区域。

  在了解Java垃圾回收中主要发生了哪些区域之后,我们需要知道Java中的哪些对象需要用作垃圾回收。这是一个非常简单的问题。由于需要回收,因此必须在程序中。对象被使用并且将来不会使用,我该如何判断是否仍将使用对象?答案是参考。

  假设对象A是由程序中的其他对象引用的,则不能回收对象A。如果程序中没有任何其他对象引用对象A,则在垃圾回收时将对象A回收。

  因此,问题是,如何判断是否在Java中引用一个对象?实际上,最简单的算法是参考计数方法。参考计数方法的原理也很简单。向每个对象添加参考计数器。每当有其他位置参考当前对象时,添加了计数器的值;当引用失败时,计数器的值将减少1,Sowhen垃圾被回收,直接判断当前对象的参考计数器的值。如果值为0,则意味着当前对象中没有参考的位置,并且可以回收。局部报价,而不是回收。

  但是,参考计数方法有一个最大的缺陷,这是循环参考的问题。请参阅下图:

  如图所示,有两个对象对象和对象b,对象对象参考对象b对象,objectb对象引用对象对象对象,两个对象形成相互参考的关系,因此两个对象的计数器值也为1,即使值值为1在两个对象中,即使两个对象的值为1,也没有在程序中使用两个对象,但是当它们回收时它们不会回收这两个对象。

  这只是两个对象的相互参考。如果数百个未使用的物体相互引用以形成周期参考,则Java桩空间将导致大量浪费。

  因此,参考计数方法未在Java垃圾回收中使用,但使用了另一种算法:可以使用该算法。

  KAIDA分析算法的想法是使用一系列GC根作为根对象。这些GC根根对象是一些不会被垃圾回收的对象。然后,他们在这些GC根之间的参考关系下进行搜索,然后搜索到搜索过程。走路的路径是“参考链”。如果无法从GC根部通过参考链搜索一个对象,则该对象是无法实现的,这意味着该对象不再在程序中使用,并且可以回收。

  如上图所示,多个GC根根对象可以形成GC根集集合。只要从GC根可以实现的对象是可以通过参考链来实现的对象,并且object5,object6,object7 object7三中的对象彼此引用对象,则它们不可用,它们是不可用的对于GC根,因此这三个对象将被判断为可回收对象。

  在Java中,以下对象可以用作GC根的对象:

  在了解发生垃圾回收的主要区域以及如何确定是否可以回收物体后,有必要了解垃圾回收算法。

  标记算法是最早,最简单的垃圾回收算法。在整个垃圾回收过程中,它分为两个步骤:标签和清除:

  上图是标记算法的两个步骤。尽管使用标记算法很简单,但标记清除算法有两个缺点:

  标记清除算法经常在老年中使用,因为老年中的大多数物体都不会清理,并且只有一小部分的物体才能清理,因此在老年中不会有标签。案件。

  为了响应标记算法中存在的问题,根据标记清除算法,提出了另一种算法:提出了标签复制算法,并将内存区域分为两个区域,在标签复制算法中具有相同大小的区域。:

  上图是标签复制算法的回收步骤。该算法也有以下问题:

  标签复制算法适用于Java堆中新一代的垃圾回收,因为在新一代区域,只有少数物体可以在正常情况下生存(2%或3%),因此有没有大量的复制算法,对于浪费空间,没有大量的复制对象的量化情况,将新一代地区分为较大的伊甸园区域和两个较小的幸存者区域。每次分配物体时,使用伊甸园和幸存者之一。当下一轮分配对象时,伊甸园和先前保存了幸存的物体的幸存者依次旋转。

  关于新一代的部门,您可以阅读一篇文章:JVM入门

  热点虚拟机的尺寸比率为8:1,伊甸园为8:1,占新一代的80%,两个幸存者占10%的占10%。50%。

  逃生门安全设计:当幸存者空间不足以容纳垃圾回收后的生存对象时,它需要依靠其他区域(老年)来进行分配保证。

  老年中的大多数物体都可以生存,因此它不适合标记副本算法,并且使用标记算法会导致大量内存片段。因此,对于老年对象的死亡特征,提出了回收算法:标记饰面算法,标记算法的标记与标记算法一致,但不会在标记后直接清除。取而代之的是,首先将幸存的对象移至内存空间的末端,然后将所有幸存的对象连续整合在一起,然后直接清除边界外的内存,标记组织算法的步骤如下:

  老年通常使用的垃圾回收算法是标记算法和标记算法。

  如果使用标记算法,则老年区域中的每个回收利用都有大量的物体可以生存,并且需要在需要移动对象时对所有对象的引用,因此它将导致较大的系统在架空上(停止单词),可以是执行。

  如果使用标记算法,它将导致内存片段。

  基于上述两种垃圾回收方法,每种方法都有优点和缺点,因此老年不同垃圾收集器使用的垃圾回收算法也不同。对于exkplathe,收集器使用标记算法。

  组合有两种算法。首先,使用标记清除算法。当存款片段达到一定程度时,标记算法一次回收一次,将记忆片段进行排序,然后将标记用于清除算法。该设备是首先使用标记算法来使用过多的内存片段,然后使用。使用标记汇编算法。

  对于下一篇关于垃圾收集器的文章。

  参考材料:“ Java虚拟机的第三版” Zhou Zhiming