jvm虚拟机垃圾回收机制
一、引用计数法
原理:引用计数法:当一个对象A,任何一个对象对对象A引用,则A的引用计数器+1,当引用失效时则,A的引用计数器-1。直到A的引用计数器为0,则可以释放。
**可达对象**:通过跟对象进行引用搜索,最终可以达到的对象;
**不可达对象**:通过对象引用搜索最终没有被引用到的对象;
缺点:
1、无法支持递归调用,对象A引用对象B,对象B又引用对象A;则无法满足回收;递归引用可能导致内存溢出。
2、每一次对象的引用和失效都伴随着加减法,导致对机器的性能有消耗。
总结:由于引用计数法存在循环引用和性能问题,jvm并未采用该方法作为垃圾回收机制的算法。
二、标记清除法
原理:标记清除法:标记阶段和清除阶段,标记阶段通过标记根节点的可达对象;未被标记的对象是未被应用的垃圾对象;清除阶段通过清除为标记的对象;
缺点:产生的空间碎片很多
总结:标记清除算法目前jvm垃圾回收算法的思想基础;
三、标记压缩法
原理:在标记清除法的基础上做优化,主要是在标记清除算法的基础上,将存活的对象压缩到内存的一端,之后清除其他所有的内存空间,达到空间连续性而不是直接清除。
**新生代**:存放年轻对象的堆空间。新创建的对象,垃圾回收次数不多的对象;
**老年代**:存放老年对象的空间。经历过多次垃圾回收依旧存活的对象;
用途:标记压缩法,主要是作为老年代的垃圾回收算法;
四、复制算法
原理:将原有的内存空间分为两块,每次使用其中一块,在垃圾回首时,将存活的对象复制到另外一块未使用到的内存当中,之后清除正在使用的内存空间所有对象,交换两个内存的角色;
用途:复制算法,主要作为新生代的垃圾回收算法:
注意:
新生代的空间分为三块:eden空间,from空间和to空间;eden为对象创建的空间都在里面,而from空间和to空间可以互换,通常也称survivor空间,主要用于存放未被处理的空间对象。
五、分代算法
原理:分代算法,根据内存区间的对象特性分成几块,根据每块内存区间的特性使用不同回收算法,以提高垃圾回收效率。
缺点:一次性回收太多内存会出现卡顿,堆空间释放越多,一次gc的市场也就越长;
用途:
新生代采用:复制算法;
老年代采用:标记压缩算法,标记清除算法。
六、分区算法
原理:分区算法是将整个堆空间划分成连续的不同小区间。每个小区间都是独立使用,独立回收。
优点:可以控制一次回收多少个小区间。
用途:jvm回收机制当中采用小区间的方式,可以控制每次gc过程当中的区间内存。