GC垃圾回收算法

1.引用计数法

引用计数法的算法很简单,对于一个对象A,任何一个对象引用了A,A引用的计数器就会+1,当引用失效时计数器就会-1.只要A的引用计数器为0时,则对象A就不能再被使用了.这个垃圾回收法因为无法解决循环引用的问题,已不被jvm使用.

2.标记清除法

标记-清除算法是现代垃圾回收算法的思想基础.标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段.在标记阶段,首先通过根节点标记所以从根节点开始的可达对象,剩下没有被标记的就是垃圾对象或者是空对象啦.


3.标记压缩法

标记-压缩算法适用于对象存活较多的场合如老年代.他在标记-清除的基础上做了一些优化.和标记-清除一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记.但之后,它并不简单的清理未标记的对象,而是将所有对象压缩到内存的另一端.之后 清理边界外所以的空间



4.复制算法

1)复制算法与标记清除法相比是一种相对高效的垃圾回收算法

2)但是不使用与存活对象较多的场合例如老年代

3)基本思想是将原有的空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用内存中存活的对象复制到未使用的内存块中,之后,清除正在使用的内存块中所有的对象,交换两个内存的角色,完成垃圾回收.

4)最大的问题就是空间浪费




标记清除/标记压缩算法在老年代被明确使用的垃圾收回算法.

复制算法是在新生代被明确使用的算法.


所有的算法,需要能够识别一个垃圾对象,因此需要给出一个可触及性的定义.


可触及性定义:

1)可触及的

-从根节点可以触及到这个对象

2)可复活的

-一旦所有引用被释放,就是可复活状态

-因为在finalize()中可能复活该对象

不可触及的定义:

- 在finalize()后,可能进入不可触及状态

-不可触及的对象不可能复活

-可以回收


finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。