一.什么是GC?
Garbage Collector的简写,就是我们所说的垃圾回收机制。
其实从理论上来讲Sun公司只是定义了垃圾回收机制并没有局限于其实现算法,所以不同的虚拟机生产厂商所采用的算法也不尽相同。
二.GC的运行过程
GC(Garbage Collertor)在回收对象前需要先发现那些无用的对象,然后再进行回收。
三.搜索算法
1.计数器算法(JDK1.1后废弃)
主体是引用计数器算法给每个对象设置一个计数器,被引用的时候加1 , 引用失效后减一 , 为0的时候表示已经无用GC可以进行回收。
引用计数器虽然实现简单,效率高,但是它并不能解决循环引用的问题(A对象引用B对象,B对象又引用A对象,但是AB对象都已经不被其他对象引用),同时开销大,所以JDK1.1后被废弃。
2.根搜索算法
根搜索算法是通过一些“GC Roots”对象作为起点,从这些节点开始向下搜索,搜索通过的路径成为引用链,然后当一个对象没有被引用链连接的时候那么这个对象就是一个可以被被回收的对象。
四.回收算法
1.标记------清除算法(Mark-Sweep)
标记清除算法分为两个阶段:“标记”和“清除”。在标记阶段就是要确定所有要回收的对象,并做标记。清除紧随标记阶段,标记阶段确定不可用的对象。 标记—清除属于基础的收集算法,标记–清除效率不高,而且清除后容易产生大量的不连续的空间,当程序需要分配大内存对象时,可能无法找到足够的连续空间。
2.复制算法
把内存分为两个大小相等的内存,每次只使用一块,在垃圾回收时,把存活的对象复制到另一块,然后把这块内存整个清理掉。
优点:实现简单,运行效率高。
缺点:内存每次都只能使用一半,造成内存利用率低。
现在JVM用复制算法收集新生代,新生代大部分对象都是朝生夕死的(98%),所以内存比例不是1:1大概是(8:1)。
3.标记---整理算法
分为两个阶段 标记---整理 但不是将存活的对象复制到另一块内存,而是将存活的对象向内存一端进行移动,然后边界以后的东西都清理掉。适合收集老生代存活时间久的对象。
4.分代收集
根据对象存活的时间分为新生代和老生代,新生代采用复制算法,老生代采用标记---整理算法。
本文章为个人记录,如有偏差还请留言,积极改正