垃圾回收器

痞子三分冷 提交于 2020-03-08 12:56:56

对象死亡过程

一个对象的真正死亡,至少要经过两轮标记

判定对象死亡后,进行第一次标记,并进行筛选,筛选条件:有没有必要执行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收集器

特点:并行与并发、分代收集、空间整合、可预测的停顿。

过程:初始标记、并发标记、最终标记、筛选回收。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!