JVM详解(4)--GC

一、GC四大算法

1.GC算法总体概述
jvm在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的是指新生代。因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC)。
Minor GC和Full GC的区别
普通GC(minor GC):只针对新生代区域的GC,指发生在新生代的垃圾回收,因为大多数java对象存活率都不高,所以Minor GC非常的频繁,一般回收速度也比较快。
全局GC(major GC or Full GC):指发生在老年代的垃圾回收,出现了major GC,经常会伴随至少一次的Minor1 GC(但并不是绝对的)。Major GC的速度一般要比Minor GC慢上10倍以上。

2.四大算法

(1)引用计数法
如果说GC开始一个对象有三处地方引用,每引用一处就加一个一,每减少一次引用就减个一,如果减到零,说明别的地方没有引用这个对象,然后GC就开始回收这个对象。
缺点:
1.每次对对象赋值时均要维护引用计数器,且计数器本身也有一定消耗。
2.较难处理循环引用。

(2)复制算法(copying)
年轻代使用的是Minor GC,这种GC算法采用的是复制算法(copying)。
原理:
Minor GC会把Eden中所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象被移到Old generation中,也即一旦收集后,Eden是就变成空的了。
当对象在Eden(包括一个Survivor区域,这里假设是from区域)出生后,在经过一个MinorGC后,如果对象还存在,并且能够被另一块Survivor区域所容纳(上面已经假设为from区域,这里应为to区域,即to区域有足够的内存空间来存储Eden和from区域中存活的对象),则使用复制算法将这些仍然还存活的对象复制到另外一块Survivor区域(即to区域)中,然后清理所使用过的Eden以及Survivor区域(即from区域),并且将这些对象的年龄设置为1,以后对象在survivor区域没熬过一次Minor GC,就将对象的年龄+1,当对象的年龄达到某个值时(默认时15岁,通过-XX:MaxTenuringTheshold来设定参数),这些对象就会成为老年代。
优点:没有内存碎片。
缺点:
1.比较耗费内存。
2.如果对象的存活率很高,我们可以极端一点,假设100%存活,那么我们将需要将所有对象都复制一遍,并将所有地址重置一变遍。复制这一工作所花费的时间,在对象存活率达到一定程度时,将变的不可忽略。所有从以上描述不难看出,复制算法要想使用,最起码对象的存活率要非常低才行,而且最重要的是,我们必须要克服50%内存的浪费。

(3)标记清除(Mark-Sweep)
老年代一般是由标记清除或者标记清除与标记压缩的混合实现。
原理:
算法分成标记和清除两个阶段,先标记出要回收的对象,然后统一回收这些对象,如下图:
在这里插入图片描述
优点:不需要额外空间。
缺点:
1.首先,它的缺点就是效率比较低(递归与全堆对象遍历),而且在进行GC的时候,需要停止应用程序,这导致用户体验非常的差。
2.其次,主要的缺点则是这种方式清理出来的空间内存是不连续的,这点不难理解,我们的死亡对象都是随机的出现在内存的各个角落的,现在把他们清除之后,内存的布局自然会乱七八糟。而为了应对这一点,jvm就不得不维持一个内存的空闲列表,这又是一种开销。呃去在分配数组对象的时候,寻找连续的内存空间不太好找。

(4)标记压缩(Mark-Compact)
老年代一般是由标记清除或者标记清除与标记压缩的混合实现。
原理:
1.标记
在这里插入图片描述
2.清除
在这里插入图片描述
3.压缩
在这里插入图片描述
优点:没有内存碎片。
缺点:需要移动存活对象,耗时严重。

二、小总结

内存效率:复制算法>标记清除算法>标记压缩算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)。
内存整齐度:复制算法=标记压缩算法>标记清除算法。
内存利用率:标记压缩算法=标记清除算法>复制算法。
可以看出,效率上来说,复制算法是当之无愧的老大,但是浪费了太多的内存,而为了尽量兼管上面所提到的三个指标,标记压缩算法相对来说平滑一点,但效率上依旧不如人意,它比复制算法多了一个标记节点,又比标记清理多了一个整理内存的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值