【快速入门JVM】Java虚拟机规范之(分代收集算法)4大GC算法

  GC的作用范围是方法区和堆区,次数上频繁收集Young区、次数上频繁收集Old区、基本不动Perm区(特殊情况也会清除永久区)。

  JVM在进行GC时,并非每次都对三个内存区域一起回收的,大部分时候回收的都是指新生代。
所以GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC)
  普通GC(minor GC):只针对新生代区域的GC。
  全局GC(major GC or Full GC):针对年老代的GC,偶尔伴随对新生代的GC以及对永久代的GC。

一、引用计数法(废弃)

  一旦对象被引用,就开始计数。无引用,计数器就自减,减至0就会被垃圾回收。

  JVM的GC一般都不使用这种方式,因为它每次对对象赋值时,都要维护引用计数器,且计算器本身有一定的消耗;其次很难处理循环引用。

二、复制算法(Coping)

  年轻代中使用普通GC,这种GC算法采用的就是复制算法。

(1)基础原理

  HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to),比例是8:1:1。

  Minor GC会把Eden(伊甸区)中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old generation(养老区)中,此时Eden是就变成空的了。

(2)优缺点
比较描述
优点扫描一次就直接复制过去,效率高;挪动的对象相连,无内存碎片
缺点需要双倍空间,浪费内存
(3)动图演示
三、标记清除(Mark-Sweep)

老年代一般是由标记清除或者是标记清除与标记整理的混合实现!

(1)基础原理

  当堆中的有效内存空间被耗尽时,就会停止整个程序(stop the world),然后进行两项工作,第一项则是标记,第二项则是清除。
   标记:从引用根节点开始标记所有被引用的对象。标记的过程其实就是遍历所有的GC Roots,然后将所有GC Roots可达的对象 标记为存活的对象。
  清除:遍历整个堆,把未标记的对象清除。

(2)优缺点
比较描述
优点不需要额外的内存空间
缺点标记时需要暂停整个应用,会产生内存碎片(空闲内存不连续);扫描两次,比较耗时
(3)动图演示
四、标记压缩/标记整理(Mar k-Compact)

老年代一般是由标记清除或者是标记清除与标记整理的混合实现

(1)基础原理

  在整理压缩阶段,不再对标记的对像做回收,而是通过所有存活对像都向一端移动,然后直接清除边界以外的内存(标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉)。

##### (2)优缺点
比较描述
优点弥补标记/清除算法内存区域分散的缺点,消除了复制算法内存减半的高额代价
缺点效率不高,不仅标记所有存活对象,还要整理所有存活对象的引用地址,效率低于复制算法
五、标记清除压缩(Mark-Sweep-Compact)

标记清除(Mark-Sweep)与标记压缩/标记整理(Mar k-Compact)的结合!减少了移动对象的成本。

总结
  (1)内存效率:复制算法(最快)>标记清除算法>标记整理算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)。
  (2)内存整齐度:复制算法=标记整理算法>标记清除算法。
  (3)内存利用率:标记整理算法=标记清除算法>复制算法。


 ☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.csdn.net/  欢迎转载,一起技术交流吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值