王磊的个人技术记录 王磊的个人技术记录

记录精彩的程序人生

目录
GC标记清除算法
/  

GC标记清除算法

GC标记清除算法主要有三个部分:标记 清除~~~~ 分配

标记阶段:GC开始执行后。首先遍历整个堆,从根开始以深度优先的方式遍历整个堆,对于活动的对象,在对象的头部标记obj.mark=true

null

                  标记阶段结束后的堆状态

清除阶段:清除阶段GC重新遍历整个堆,对于obj.mark=true的对象,GC将标记置为false,以便于下次运行GC回收,对于obj.mark=false的对象GC将该内存块放入空闲列表,当程序申请新的内存时由分配器重新分配

分配: 当程序请求一个新的内存时,分配器遍历空闲列表,查找size>=程序请求size的空闲块,如果找到与请求内存大小相同的块则返回这个内存块;如果找到比请求的size大的内存块,则切割这个内存块,将多余的部分返还到空闲链;如果没有找到合适的分块,查找空闲列表函数则返回一个null,分配器得到null后有两种处理方式:一种是摧毁所有的计算结果,报错内存不足;另一种是扩大堆内存。

   分配器遍历空闲列表返回适合请求size的分块有三种策略:First-fit,Best-fit,Worst-fit

First-fit是指遍历列表的过程中只要找的大于等于请求size大小的内存块就返回此块,不在继续遍历

Best-fit是指遍历列表返回大于等于size的最小分块

Worst-fit是指遍历列表的过程中找出空闲链中最大的一块内存切割成程序请求的size,这种策略目的是将分割后的剩余块最大化,但是这种方式会生成很多小块所以不推荐

First-fit和Best-fit相比First-fit分配所需的时间更短所以使用First-fit效率更高

标题: GC标记清除算法
作者:wanglei03
地址:https://wangleijava.com/articles/2019/12/05/1575546223730.html