GC垃圾回收
GC(Garbage Collection):垃圾回收器,用于java堆的内存管理,在JVM中程序计数器,java虚拟机栈,本地方法栈的生命周期跟随线程,栈帧的进栈和出栈能够实现自动清理,jdk8之后元空间成为本地内存也不受GC控制,因此GC主要作用于堆
程序在运行时,会有大量的对象不断创建,有些对象的生命周期很多,因此不可避免的出现一些垃圾数据,这些数据对程序来说已经无法访问,为了避免影响性能,java虚拟机会在程序运行过程中不断的进行自动的垃圾回收(GC) PS:无法确认虚拟机何时清除
GC的种类
- Minor GC(年轻代GC):发生在年轻代的GC,触发频繁,回收速度快
- Major GC(老年代GC):发生在老年代的GC,通常Major GC会与Minor GC一起执行,回收速度比Minor GC慢
- Full GC:清理整个堆空间,包括年轻代与老年代
- Mixed GC:混合回收,G1垃圾回收器特有,回收年轻代与部分老年代
GC回收算法
引用计数法
引用计数法为每一个对象添加一个计数器,任何一个对象对此对象进行引用,则对此对象的引用计数器+1,当引用失败时,对此对象的引用计数器-1,如果对象引用计数器的值为0时,则对象可以被回收
由于此种方法使用计数器,对时间与cpu资源都有开销,且无法解决循环引用的问题,一般不采用此种方法
复制算法
复制算法将内存划分为两块,每次只使用其中1块,当内存满时,将存活对象复制到另一块中,之后清空内存块
此方法适用于内存中垃圾对象较多,需要复制的对象较少的情况(对象存活度低的场景),反之则不适合
标记清除算法
标记清除算法分为标记和清除,需要两次扫描,在算法清除后会使内存碎片化,需要与标记压缩算法结合使用
- 标记:扫描内存块,对存活的对象进行标记
- 清除:扫描内存块,对没有标记的对象进行清除
标记压缩算法
标记压缩算法是在标记清除算法的基础之上,做了优化改进,和标记清除算法一样,也是先标记存活的对象,清理阶段是先将存活的对象压缩到内存的一端,之后清理边界以外的垃圾,解决了标记清除算法使内存碎片化的问题
需要三次扫描:标记、清除、压缩(存活对象前移)
分代回收算法
没有最好的算法,只有最合适的算法。分代回收算法就是这样的,根据回收对象的特点进行选择
- 年轻代:对象存活率低适合复制算法
- 老年代:内存区域大,存活率高适合标记清除(内存碎片不多的情况)+标记压缩混合实现
算法对比
效率(时间复杂度):复制算法>标记清除算法>标记压缩算法
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
标签:标记,对象,回收,算法,GC,内存,垃圾 From: https://www.cnblogs.com/shenStudy/p/17063921.html