一、Java垃圾回收机制
在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。
二、如何判断对象是否可以被回收
可以用两种方法来判断:引用计数器法、可达性分析算法。
引用计数器法:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。但是他有一个缺点是不能解决循环引用的问题。
可达性分析算法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。
三、JVM的垃圾回收算法
1、标记清除法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
2、标记复制法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
3、标记整理法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
4、分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。
四、垃圾收集器
用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,
用于回收老年代的收集器包括Serial Old、Parallel Old、CMS,
用于回收整个Java堆的G1收集器。
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。
思维导图