首页 > 编程知识 正文

垃圾回收器有哪些算法,四种垃圾回收算法

时间:2023-05-04 14:35:16 阅读:15800 作者:3397

以下是JVMGC指南图

1、如何识别垃圾

1.1引用计数法

在Java中,引用和对象是相关的。 必须在引用中处理对象。 因此,一个明显简单的方法是确定引用计数是否可以回收对象。 简单来说,如果没有与对象相关的引用(即引用数不为0 ),则对象不太可能被重用,则该对象是可重用对象。

1.2可达性分析

为了解决参照计数法的循环参照问题,Java中使用了可达性分析的方法。 从一组" GC roots "对象开始搜索。 如果“GC根”和对象之间没有可到达的路径,则认为该对象不可到达。 请注意,不可到达的对象不等于可重用对象,不可到达的对象必须至少进行两次标记处理才能成为可重用对象。 如果是标记2次也可以回收利用的对象,就面临回收利用。

2、去除标记算法(pgddds-Sweep ) () ) ) ) ) )。

最基本的垃圾回收算法分为两个阶段进行标记和清除。 阶段标记要回收的所有对象,清除阶段回收被标记的对象占用的空间。 图:

从图中可以看出,该算法的最大问题是存储器碎片很严重,以后可能发生大对象找不到可用区域的问题。

3、复制算法(copying )

为解决pgddds-Sweep算法内存碎片缺陷而提出的算法。 根据内存容量将内存分成大小相等的两个块。 一次仅使用一个块,并且此块的内存已满后,将生存对象复制到另一个块中,以清除已使用的内存。 图:

该算法实现简单,内存效率高,不易出现碎片,但最大的问题是可用内存被压缩到原来的一半。 另外,生存对象越多,Copying算法的效率就会大幅降低。

4、标记组织算法((pgddds-Compact ) ) ) ) ) ) )。

将以上两种算法结合起来,为避免缺陷提出。 标记阶段与pgddds-Sweep算法相同,标记后将生存对象移动到内存边缘,而不是清理对象。 然后清除边缘边界之外的对象。 图:

5、分代采集算法

分代收集法是目前大多数JVM采用的方法,其核心思想是根据对象生存的不同生命周期将内存划分为不同的域,一般将GC堆划分为古生代(Tenured/Old Generation )和新生代(younund ) 老一代的特点是每次回收垃圾时只回收少量对象,新生代的特点是每次回收垃圾时回收大量垃圾,因此不同地区可以选择不同的算法。

5.1,http://www.Sina.com /

目前,大多数JVM的GC针对新生代采用了Copying算法。 由于新生代在每次垃圾回收时都会回收大部分对象,即复制操作较少,但通常并不是以1:1划分新生代。 将新生代划分为一个大的Eden空间和两个小的Survivor空间(From Space,To Space ),每次使用Eden空间和其中的一个Survivor空间进行回收利用时,都会将这两个空间中还存在的对象划分为

5.2 新生代与复制算法

另一方面,由于老一代一次只回收少量对象,因此采用pgddds-Compact算法。

1. JAVA虚拟机中提到的用于存储class类的方法区域中的永久层代、

常数、方法的说明等。 永生代的回收主要包括废弃常数和浪费类。

2 .对象的内存分配主要是新生代的Eden Space和Survivor Space的fromspace(survivor目

之前存储对象的块),将少数情况直接分配给晚年一代。

3 .新生代的Eden Space和From Space空间不足时发生过一次GC,进行GC后,Eden

空间和From Space区域的生存对象将转移到To Space,Eden Space和From将

Space打扫卫生。

如果有To Space的对象无法充分保存,则将该对象保存到晚年的世代。

5 .进行GC后,使用Eden Space和To Space。 这样重复循环。

6 .对象在Survivor区一旦逃避GC,其年龄为1。 默认情况下,达到年龄15的对象是

步入老年时代。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。