java虚拟机---垃圾收集算法

时间:2022-12-27 19:07:59

1.标记-清除算法

(标记:就是标记无用的对象.)

正如名字一样,先标记再清除

但是有不足:
1.效率不行,标记和清除都慢

2.清除之后有太多的内存碎片

如下图:

java虚拟机---垃圾收集算法

2.复制算法

* 将内存(就是指堆)分为两半,每次只用一半,当这一半满了,就把还存活的对象复制到另外一半去,在清除已使用的那半,回收内存.
* 但是相当于内存小了一半,不爽,得改!
* 经研究发现,98%的对象都是朝生夕死.所有没必要划一半,于是乎就有了Eden空间和Survivor空间(在堆中的新生代中).比例是8:1:1,一块大的Eden空间,一块From Survivor空间,一块To Survivor空间.(from和to只是相对的概念)
* 先用Eden空间和一块Survivor空间,当这两个空间用完了时,就把还活着的复制到另一块Survivor中.再清除.当这块Survivor不够用时,就会分配到老年代中

如下图;

java虚拟机---垃圾收集算法

3.标记-整理算法

(整理:将存活的对象向一端移动)

就是先标记再整理再清理,

标记后,先让存活的对象向一端移动,然后直接清理掉 端 边界以外的内存
为什么要存在这样的算法呢?标记-清除算法弊端太多,不好用.复制算法有极端.
如果堆中的对象是100%的存活这种极端情况(老年代中基本就是这样的).用复制算法显然不好.于是出现这种,主要解决了内存碎片的问题.
如下图: java虚拟机---垃圾收集算法

4.分代收集算法:

也不是什么的新的算法,就是根据各个代的特点采用适当的收集算法.
在老年代使用标记-整理算法
在新生代使用复制算法