JVM 的垃圾回收算法

一、那些对象是可以回收的
1、使用标记计数法**:给对象添加一个引用计数器,每当一个有一个地方引用它时,计数器就加1,当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不可能再被使用的。这时就存在一个问题,如果有两个对象,A对象调用B对象,B对象调用A对象,他们互相引用着,导致计数器的值不为0,实际上这两个对象已经不可能再被访问,需要进行垃圾回收,所以使用计数法是行不通的。
2、可达性分析算法:算法的思想是通过一系列的“GCV Roots”的对象作为起点,从这些节点开始向下搜索,当一个对象到GC Roots没有任何的引用链相连时,则证明此对象是不可用的,也就是不可到达的,这是就可以进行标记进行垃圾回收。

二、垃圾回收有哪些算法?各有什么特点?
1、标记-清除算法(Mark-Sweep):首先对所需要回收的对象进行标记,在标记完后统一进行回收。标记清除算法会有两个问题:一是效率问题,标记和清除两个过程的效率都不高,二是使用该算法过后会有大量的不连续的内存碎片,空间碎片太多可能会导致以后程序运行过程中需要分配较大的对象时,无法找到足够的连续的内存而不得不提前触发另一次垃圾回收动作。
2、复制算法(Copying):将内存按照容量划分为大小相等的两块,每次只使用一块,当一块的内存用完了,就将还存活的对象复制到另一块上,然后把剩余的使用过的对象进行清理掉。这种方法不会产生碎片,但是这种算法的代价是将内存缩小为原来的一半。
3、标记整理(Mark-Compact): 首先也是对需要回收的对象进行标记,然后是让所有存活的的对象都向一端进行移动,然后直接清理掉边界以外的内存,这样也不会出现空间碎片的问题。

猜你喜欢

转载自blog.csdn.net/ocean_java666/article/details/81264520