对象死亡过程
一个对象的真正死亡,至少要经过两轮标记
判定对象死亡后,进行第一次标记,并进行筛选,筛选条件:有没有必要执行finalize()。对象没有覆盖finalize()或者覆盖的finalize()已经执行过,都视为没有必要执行finalize()。
如果没有必要执行finalize(),稍后会进行第二次标记,根据垃圾回收算法,进行垃圾回收。
如果有必要执行finalize(),则执行finalize(),在此方法中,对象只要活过来,就不会被垃圾回收。
任何一个对象的finalize()方法都只会被系统调用一次,不会调用第二次。
关于方法区的垃圾回收
方法区的垃圾回收主要两个部分:废弃的常量和无用的类。
废弃的常量:和回收堆中的对象差不多。
无用的类:需要同时满足下面的三个条件:
1.堆中没有该类的任何实例。
2.加载该类的ClassLoader被回收。
3.该类的Class对象没有任何地方被引用。
垃圾回收算法
1.标记-清除算法:标记出需要回收的对象,在标记完成后统一回收被标记的对象。
两个缺点:效率低,会产生大量的不连续的内存碎片。
2.复制算法:将内存分为两块,只使用其中的一块内存,回收时,将存活的对象复制到另一块内存上,然后将原先的内存进行清理。
缺点:内存变为原来的一般代价高昂,当存活的对象多时,效率更低。
3.标记-整理算法:标记需要回收的对象,然后将所有存活的对象,向一端移动,然后清理掉端边界意外的内存。
4.分代收集算法:当垃圾回收时,有大量的对象死去,使用复制算法,否则使用,标记-清除或者标记-整理算法。
垃圾回收器
垃圾回收器是垃圾回收算法的具体实现。没有最好的垃圾回收器,只有最合适的垃圾回收器。
1.Serial收集器
特性:单线程,新生代。
原理:在进行垃圾回收时,暂停所有的工作线程,直到收集结束,使用的是复制算法。
使用场景:虚拟机运行在Client模式下的默认新生代收集器。
2.ParNew收集器
特性:多线程、新生代。
原理:使用的是复制算法,进行垃圾回收时,其他工作线程不用停止。
使用场景:与CMS收集器配合使用。
3.Parallel Scavenge收集器
特性:多线程、新生代。
原理:复制算法。
使用场景:为了达到一个可控制的吞吐量。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
4.Serial Old收集器
特性:单线程、老年代。
原理:标记-整理算法。
使用场景:JDK1.5及以前的版本与Parallel Scavenge收集器搭配,或者作为CMS收集器的后背预案。
5.Parallel Old收集器
特性:多线程、老年代。
原理:标记-整理算法。
使用场景:JDK1.6后与Parallel Scavenge收集器搭配。1.6之前没有这个垃圾回收器。
6.CMS收集器
原理:标记-清除算法。
过程:初始标记,并发标记、重新标记、并发清除。
优点:并发收集、低停顿。
缺点:CMS对CPU资源敏感、CMS无法处理浮动垃圾、收集结束会产生大量的碎片空间。
7.G1收集器
特点:并行与并发、分代收集、空间整合、可预测的停顿。
过程:初始标记、并发标记、最终标记、筛选回收。
来源:https://www.cnblogs.com/xiaosuye/p/10274587.html