谈谈垃圾回收收集方式,jvm,GC的理解
4种,是什么,优缺点,怎么用
概述
GC是什么?
分代收集算法:次数上频繁收集young区,次数上较少收集old区,基本不动元空间
GC算法总体概述:
GC不是三块区域一起回收,大部分在回收新生代
Minor GC和 FUll GC
MinorGC发生频繁,FullGC也叫MajorGC的速度比MinorGC慢10倍以上。
引用计数法
缺点:每次对象赋值时均要维护引用计数器,且计数器本身有一定消耗;循环引用会引起内存泄露
jvm的实现一般不用这种
复制算法
年轻代中使用的Minor GC,这种GC算法采用的是复制算法
优点:没有内存碎片;
缺点:占用双倍内存空间。
复制过程中完成整理,左侧直接全部清空后交换两位置。
标记清除(Mark-Sweep)
老年代一般是由标记清除或者是标记清除与标记整理的混合实现。
算法先把没被GC root引用的对象标记起来,再统一回收对象。
对象所释放内存的起始地址首尾记录下来,放入空闲地址列表,下次有需要的时候可以进行内存分配。
优点:不需要空间;
缺点:两次扫描,耗时严重;但空间不连续,易产生内存碎片,新对象可能存不进去。
标记整理(Mark-Compact)
标记清除,再次扫描,向一段滑动存活对象。
优点:没有内存碎片;
缺点:对象在整理过程中,内存地址发生变化,耗时最长,速度慢。
ps.实际工作中可以采取标记-压缩-清除,标记清除和标记压缩结合,进行多次GC后才Compact
分代收集,没有最好的算法,每一代根据它的特性选择对应的算法。
各个算法的优缺点?
内存效率:复制算法>标记清除算法>标记整理算法
内存整齐度:复制算法=标记整理算法>标记清除算法
内存利用率:标记整理算法=标记清除算法>复制算法
java8之后java9默认的G1垃圾回收器达到了速度快,无内存碎片的目的。