1 垃圾回收算法
标记算法
该算法分成两步完成:
- 在
java
程序运行过程中,当有些对应没有被gc root
所引用时,那么该对象就会被标记。 - 当标记完之后,那些被标记的对应,就会被清除掉,也就是释放内存。释放之后,会那段内存的起始位置加入到内存的空内存地址库。当再有新对象被创建时,首先会查找地址库中的内存块是否有符合条件(内存大小是否够用)的,如果有,就将其分配给新对象,否则就另外开辟一段。
- 在
优点:
清理速度很快
只需要将被标记的对象的起始地址记录下来,就可以完成清理工作,所以速度很快
缺点:
容易产生内存碎片
从上图中可以看到,由于很多被释放掉的对象都是穿插着的,所以很难有一块完整的空内存,有时候总的空内存是足够分配给一块新的需要大内存的对象的,但是由于非常零碎,所以没办法利用。
标记整理
该算法还是分两步:
- 首先第一步和标记算法一样,都是先给没有被
gc root
引用的对象进行标记 - 这一步,该算法做了一个整理的操作:也就是将一些还在被
gc root
引用的对象向前移动,这里的移动包括数据,以及一些引用的地址,都需要做修改,所以这一步需要消耗一定的时间。相对于标记算法而言,速度较慢
优点:
- 能够有效利用被释放的空间,相对于标记算法,不会再产生内存碎片了
缺点:
- 速度没有标记算法快,较慢
- 首先第一步和标记算法一样,都是先给没有被
复制
该算法有两个区域,一个是
FROM
区域,另一个是TO
区域,该算法执行分成三步:先标记处没有被
gc root
引用的对象然后将
FROM
被标记的对象释放掉,在将没有被释放掉的对象复制一份到TO
区域中复制完成之后:
然后在交换
FROM
和TO
的位置,这样TO
就又变成了一个空的内存空间交换完以后:
- 优点:
- 不会产生内存碎片
- 缺点:
- 需要占用两块内存空间,所需要的内存空间较大
写在最后
欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment