首页 > 代码库 > 垃圾回收的概念与算法
垃圾回收的概念与算法
GC中的垃圾,是指的是在内存中不在不再被使用的对象。
常见的垃圾回收算法
1.引用计数算法(无法回收循环引用的对象)
2.标记清除算法
分为标记阶段和清除阶段(会产生内存的空间碎片)
3.复制算法(缺点是将系统内存折半,高效性是建立在存活对象少,垃圾对象多的前提下的)
在java新生代串行垃圾回收器中,使用了复制算法的思想,新生代分为eden,from,to三个部分。from,to空间成为survivor空间,用于存放未被回收的对象。
其中:新生代指得是存放年轻对象的空间。
老年代指的是存放垃圾回收存活的对象。
在新生代中的垃圾回收中,eden区存活的对象会放在to中,正在使用from中的年轻对象也会被复制到to中,此时eden区与from区可以直接清空。
4.标记压缩法(高效性是建立在大多数的对象都是存活的)
用于老年代中的垃圾回收:
在标记清除算法中做了优化:从根节点开始,对所有可达对象做了标记。然后将所有的可达对象都压缩到内存的另一边,之后清理边界外的所有空间。
5.分代算法:
就是将复制算法与标记压缩法整合到一起。
6.分区算法:
将整个内存的对空间划分为连续的不同的小空间,每个小空间都单独的使用,独立的回收。由于对空间越大,一次GC所花费的时间越长,所以会减少GC的时间。
对象回收的情况
java提供了四个类型的引用:强引用,软引用,弱引用,虚引用。
强引用所指的对象在任何时候都不会被GC回收。
2.GC未必会回收软引用的对象吗,但是当内存资源紧张时,软引用的对象会被回收。
3.在GC中还要发现弱引用就会被回收。
4.一个虚引用随时随地都会被回收。
新生代与老年代GC的区别:
新生代GC比较频繁,但是持续的时间较短。
老年代GC发生次数少,但是持续的时间比较长。
垃圾回收的概念与算法