打开网易新闻 查看更多图片

GC这块也是面试的重点,面试长问,实际上如果只一般公司的面试涉及的并不深,最基本的算法还是要了解的,几种收集算法都比较简单,相信大家都知道,这里个大家简单的回顾下。

标记-清除

这是垃圾收集算法中最基础的,首先标记那些要被回收的对象,然后统一回收。

缺点是效率不高,内存碎片多,优点是算法简单。

复制算法

为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清除完第一块内存,下次回收再将第二块上存活对象复制到第一块。

解决了标记-清除算法的效率和内存碎片问题,缺点是浪费了一半内存。

Java新生代采用优化的复制算法

将内存划分为8:1:1,较大是Eden区,其余两块较小内存区叫Survior区。优先使用Eden,当Eden不足时触发回收机制把存活的对象复制到其中一块Survior区,然后回收另外两块区域。

当Survivor不够时,会将这些对象通过分配担保机制复制到老年代中。

使用这种算法的原因是新生代对象存活率较低,每次回收大部分都会被回收,存活较少。

标记-整理

清除对象的时候先将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。

该算法主要是为了解决标记-清除,产生大量内存碎片的问题;当对象存活率较高时,也解决了复制算法的效率问题。

分代收集

现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。

在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。

老年代里的对象存活率较高,没有额外的空间进行分配担保,采用标记整理-算法。

可以看到算法都是从简单到复杂,再到综合运用,从最简单的算法开始,因为算法存在一些弊端所以进行了一些改进,但是改进的算法仍然存在一些弊端(没有完美的算法,如果存在那么所有收集器都在使用这个算法了),最终虚拟机根据具体情况作出了综合考虑采用分代收集算法。

小程序:IT面试题练习

打开网易新闻 查看更多图片