JVM垃圾回收机制GC

一句话介绍GC: 自动释放不再使用的内存 

一、判断对象是否能回收

思路一:引用计数

给这个对象里安排一个计数器, 每次有引用指向它, 就把计数器+1, 每次引用被销毁,计数器-1,当计数器为0的时候, 意味着该对象就是垃圾了

但引用计数存在两个缺陷:

1. 空间利用率比较低,浪费更多的内存空间

        给引用技术分配了两个字节, 对象本体才4个字节, 引用计数就浪费了50%的空间

        如果代码中都是这种小对象, 并且数量众多, 此时, 浪费就非常明显了

2. 可能存在循环引用的问题, 导致对象不能被正确识别为垃圾

思路二:可达性分析

JVM首先会从现有代码中的能直接访问到的引用出发, 尝试遍历所有能访问的对象,只要对象能访问到,就会标记成”可达“,完成整个遍历之后,可达之外的对象,也就是“不可达”,也就相当于垃圾了

总结: 可达性分析浪费时间, 引用计数浪费空间



二、如何清理垃圾?

1、标记清除

但会导致释放的空间是离散的, 引起“内存碎片

申请内存的时候, 都是申请连续的内存空间。 直接释放内存会破坏原有的连续性,导致还有剩余但是申请不了

2、复制算法

复制算法: 通过冗余的内存空间, 把有效对象复制到另一部分空间,来避免内存碎片

但是浪费一半空间

把一个内存,分成两份,用FROM清理FROM,搬到TO, 往复进行

把左侧区域中,有效的对象, 复制到右侧

接下来就可以使用右侧区域了, 用了一段时间后,也会有很多对象,也是同理,把有效对象复制会左边,对右侧进行统一释放

3、标记整理

把有效对象搬到一起, 统一删除元素, 当然这样搬运元素成本也比较高导致速度太慢

4.分代回收

其实上边三个方法都不行,于是大佬们设计了一个综合方案

java代码中,对象主要分成两类:

        1.生命周期特别特别短

        2.生命周期特别特别长

GC是周期性的扫描,一个对象每经过一轮GC,就长一岁

分代回收就是按照对象的年龄,来制定不同的回收策略

首先,整个堆分成两部分: 新生代 老年代

新生代又分伊甸区 幸存区

①新创建的对象全部会放在新生代中的伊甸区, 再经历一轮GC后,剩余的还没挂的对象会通过复制算法,复制到幸存区 (幸存一轮后年龄+1)

②幸存区由两块区域组成, 每次只使用一块;对已使用区域使用复制算法转移至未使用区域(注意箭头指向

③如果一个对象在幸存区中经过15轮都没挂 那就是生命周期特别长了,直接转移到老年代,在老年代中使用标记整理

老年代扫描频率比新生代低得多,并且即使扫描了大多数也不会被销毁,因此标记整理开销不大

新生代扫描频率虽然高,但是每轮留下的对象很少,复制算法的开销也不大

垃圾回收总结:

三、垃圾回收器

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM(Java虚拟机)的垃圾回收GC)机制是自动管理内存的一种机制。它通过自动识别和回收不再使用的对象来释放内存空间,以避免内存泄漏和程序中的内存溢出错误。 JVM中的垃圾回收器负责执行垃圾回收。当对象不再被引用时,垃圾回收器将标记这些对象为垃圾,并将它们从内存中回收。以下是JVM GC回收机制的一般过程: 1. 标记阶段(Marking Phase):从根对象(如线程栈中的引用、静态变量等)开始,垃圾回收器将遍历对象图并标记可达的对象。 2. 清除阶段(Sweeping Phase):垃圾回收器将清除标记为垃圾的对象,并回收它们占用的内存空间。 3. 压缩阶段(Compacting Phase):如果需要,垃圾回收器会对存活的对象进行整理,使它们在内存中连续排列,从而减少碎片化并提高内存的利用率。 4. 再分配阶段(Allocation Phase):如果需要,垃圾回收器会为新对象分配内存空间。 具体的垃圾回收算法和策略可能因不同的JVM实现而异。常见的垃圾回收算法包括标记-清除(Mark and Sweep)、复制(Copying)、标记-整理(Mark and Compact)等。JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)等,以满足不同场景下的需求。 总而言之,JVM垃圾回收机制通过自动识别和回收不再使用的对象来管理内存,确保程序运行时的内存使用效率和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值