GC这块也是面试的重点,面试长问,实际上如果只一般公司的面试涉及的并不深,最基本的算法还是要了解的,几种收集算法都比较简单,相信大家都知道,这里个大家简单的回顾下。
标记-清除
这是垃圾收集算法中最基础的,首先标记那些要被回收的对象,然后统一回收。
缺点是效率不高,内存碎片多,优点是算法简单。
复制算法
为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清除完第一块内存,下次回收再将第二块上存活对象复制到第一块。
解决了标记-清除算法的效率和内存碎片问题,缺点是浪费了一半内存。
Java新生代采用优化的复制算法
将内存划分为8:1:1,较大是Eden区,其余两块较小内存区叫Survior区。优先使用Eden,当Eden不足时触发回收机制把存活的对象复制到其中一块Survior区,然后回收另外两块区域。
当Survivor不够时,会将这些对象通过分配担保机制复制到老年代中。
使用这种算法的原因是新生代对象存活率较低,每次回收大部分都会被回收,存活较少。
标记-整理
清除对象的时候先将可回收对象移动到一端,然后清除掉端边界以外的对象