2. 垃圾回收算法
2.1. 标记-清除算法(Mark-Sweep)
分两步:
- 标记
- 清除
所谓的清除就是把垃圾释放,这里可能造成一个小的误区,释放是不是意味着把整个内存,每个字节进行一次清零操作呢?
注意:不会,只需要把垃圾占用内存的起始、结束的地址记录下来,放在一个空闲的地址列表里就可以了,下次在分配新对象的时候,就到空闲地址列表中去找,看有没有一块足够的地址空间,来容纳我的新对象,如果有那么久进行内存分配。
标记-清除算法的优缺点:
- 优点:**速度快**
-
2.2. 标记-整理算法(Mark-Compact)
标记-整理算法优缺点: 优点:**没有内存碎片**,连续的空间更多了
缺点:由于整理牵扯到了对象的移动,如果有一些局部变量的引用引用了要整理的对象,肯定需要改变引用的地址,肯定涉及到的工作就多一点,牵扯到区块内存的拷贝、移动,还有所有引用的地址的加以改变,**造成速度较慢。**
2.3. 标记-复制算法(Semispace Copy【半区复制】)
标记-整理算法的优缺点:优点:**不会有内存碎片**
- 缺点:**会占用双倍的内存空间**
这三种算法,实际在JVM的垃圾回收机制中,都会根据不同的情况来采用,不会说只用其中的一种算法,是结合多种算法功能实现垃圾回收的,这也就是所谓的分代垃圾回收机制。