GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点

一、什么是GC
Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,在使用JAVA的时候,一般不需要专门编写内存回收和垃圾清理代码。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。
二、关于GC的三种算法
1、复制算法(Copying):在JVM的堆内存当中,新生代使用的是复制算法。新生代的内存区域又分成Eden、From、To三个区域,这三个区域的内存占用比例是8:1:1,新创建(new)出来的对象存放在Eden区和From区中,当整两个区的内存到达一定的占用量后,会进行轻量级的垃圾回收(Minor GC),将存活下来的对象年龄+1,并将存活下来的对象复制到To区,此时Fron区和To区进行交换(区分From区和To区:谁空谁是To,并且From区和To区是不断交换的)。当一个对象的年龄达到15时,将此对象从新生代移动到老年代。优点:不产生内存碎片问题,能保持对象的完整性。缺点:因为要一致保持To区是空的,浪费了一定的内存空间。
2、标记清除/标记整理算法(Full GC 或者 Major GC):老年代一般是由标记清除或者是标记清除和整理的混合实现。
(1)标记清除算法:Mark-Sweep步骤一:标记:从根集合开始扫描,对存活的对象进行标记步骤二:清除:再次扫描整个内存空间,回收未被标记的对象,使用free-list记录可用区域。优点:两次扫描,耗时严重,会产生内存碎片。缺点:不需要占用额外空间。
(2)标记整理算法:Mark-Compact标记/整理算法唯一的缺点也是效率不高,不仅要标记所有存活对象,还要整理存活对象的引用地址。从效率上来说,标记/整理算法要低于复制算法
。三、三种算法的一些小结内存效率:
复制算法>标记清除算法>标记整理算法。
内存整齐度:复制算法=标记整理算法>标记清理算法。
内存利用率:标记整理算法=复制算法>标记清理算法。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群(374308445)来交流学习,里面都是同行,群验证【CSDN2】有资源共享。

你可能感兴趣的:(GC,Java编程,程序员面试,Java,面试)