JVM---GC和GC算法

本文深入探讨Java的垃圾收集(GC)机制,主要关注堆和方法区的管理。介绍了四种主要的GC算法:引用计数器法、复制算法、标记清除算法及其优化版——标记清除压缩算法。每种算法都有其优缺点,例如复制算法适用于对象存活率低的场景,而标记清除压缩算法则解决了内存碎片问题。理解这些算法对于优化Java应用的性能至关重要。
摘要由CSDN通过智能技术生成

GC和GC算法

gc的作用在堆和方法区,分为轻GC和重GC。不详细划分的话,方法区算是堆的一部分,也可以说GC主要作用于堆。

那么,就需要回顾一下堆的知识了,

堆分为如下三个区域

  • 新生代(伊甸园 Eden)
  • 幸存区(form/0,to/1)
  • 老年区
  • 永久储存区

GC会对伊甸园区和幸存者区进行清理,通常来说,大多数对象都会在伊甸园区被清理殆尽,存活下来的对象会进入幸存者区。而未被设置的情况下,在15次清理交换后仍旧存活下来的对象会被放到老年区。

当然,我们可以手动设置对象在幸存区经历清理的次数

image-20210707084309807

下面,我将着重介绍下GC的一些算法。

1.引用计数器法

https://static01.imgkr.com/temp/a5e1ffa6a3084982a3d1d3db75bb9ec2.png

如上所示,我们使用一个计数器来记录每个对象的使用次数,次数多的对象留下,次数少的对象被清除。

这种算法存在浪费资源,清理不完全等许多毛病,现在已经较少投入使用。

2.复制算法

复制算法体现在幸存区之间的不断交换,在复制算法中,幸存的对象会不断从from运动到to区,然后原from区空了,变为to区,原to区变成from区,以此往复循环清理。

https://static01.imgkr.com/temp/2c885db34d524ea68ee4b50637345097.png

  • 好处:没有内存的碎片
  • 坏处:浪费了内存空间 :多了一半空间永远是空to。假设对象100%存活(极端情况)
    复制算法最佳使用场景:对象存活度较低的时候;新生区好处:没有内存的碎片

3.标记清除算法

就像上面那样,放入JVM里的部分对象被标记,被标记的对象不会被GC清楚,而未被标记的对象会被GC清除,以此来达到回收垃圾的效果。

优点:不需要额外的空间

缺点:两次扫描,严重浪费时间,会产生内存碎片。

4.标记清除压缩算法

所谓标记清除压缩算法指的就是,在标记清楚的基础上对清楚后的对象进行整理,使其按顺序排列。

一般来讲,GC清理5次后进行一次剩余对象的压缩。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值